HttpRequest&HttpResponse补充

Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。
重定向
1、sendRedirect(String location) 请求重定向
2、
setHeader(String name, String value) 设置响应头信息
设置服务器响应回来数据,在浏览器上进行解析的编码格式:
1)response.setContentType("text/html;charset=UTF-8");==>包含setCharacterEncoding的功能。并能告诉浏览器,响应体使用的编码。
2)response.setCharacterEncoding("UTF-8");==>一般不使用,设置流pw的编码。
PrintWriter pw = response.getWriter();获取的流的默认编码是ISO-8859-1
3)response.setHeader("Content-type", "text/html;charset=UTF-8");
另外一种方法:
ServletOutputStream sos = response.getOutputStream();
sos.write("你好123".getByte("UTF-8"));
由于浏览设置的编码格式不一定是UTF-8。需要设置:
request.setCharacterEncoding("UTF-8");
HttpServletResponse设置客户端下载文件
public class ServletDemo3 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 实现文件下载的功能 // 通过路径得到一个输入流 String path = this.getServletContext().getRealPath("/WEB-INF/classes/pic.jpg"); FileInputStream fis = new FileInputStream(path); // 创建字节输出流 ServletOutputStream sos = resp.getOutputStream(); // 获取要下载的文件名 "\\"表示一个字符 String fileName = path.substring(path.lastIndexOf("\\") + 1); // 获取到pic.jpg这个文件名 +1不要斜杠 // 设置文件名的编码格式 //URLEncoder类:HTML 格式编码的实用工具类。 //该类包含了将 String 转换为 application/x-www-form-urlencoded MIME 格式的静态方法。 fileName = URLEncoder.encode(fileName, "UTF-8"); // 告知客户端要下载文件 resp.setHeader("content-disposition", "attachment;filename=" + fileName); resp.setHeader("content-type", "image/jpeg"); // 执行输出操作 int len = 1; byte[] buff = new byte[1024]; while ((len = fis.read(buff)) != -1) { sos.write(buff, 0, len); } sos.close(); fis.close(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // TODO Auto-generated method stub super.doPost(req, resp); } }
HttpServletResponse设置客户端响应验证码图片案例
public class ServletDemo4 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { test01(resp); //告诉客户端不适用缓存 // resp.setHeader("pragma", "no-cache"); // resp.setHeader("cache-control", "no-cache"); // resp.setDateHeader("expires", 0); //使用别人写好的验证码的jar包 // ValidateCode vc = new ValidateCode(110, 25, 4, 9); // String code= vc.getCode(); //得到生成的字符串 // vc.write(resp.getOutputStream()); } private void test01(HttpServletResponse resp) throws IOException { int height = 25; int width = 110; //在内存中创建一个图片对象 BufferedImage img =new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); //创建一个画笔 Graphics g = img.getGraphics(); //给图片添加背景颜色 g.setColor(Color.PINK); g.fillRect(1, 1, width-2, height-2); //给边框一个颜色 g.setColor(Color.RED); g.drawRect(0, 0, width-1, height-1); //设置文本的样式 g.setColor(Color.BLUE); g.setFont(new Font("宋体", Font.BOLD|Font.ITALIC, 15)); //给图片添加文字 Random rand= new Random(); int position = 20; for(int i=0;i<4;i++) { g.drawString(rand.nextInt(10)+"", position, 20); position+=20; } //添加9干扰线 for(int i=0;i<9;i++) { g.drawLine(rand.nextInt(width), rand.nextInt(height), rand.nextInt(width), rand.nextInt(height)); } //将图片以流的形式输出到客户端 ImageIO.write(img, "jpg", resp.getOutputStream()); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
定时跳转
response.setHeader("refresh","3;url=/day09_00_httpServletResponse/servlet/demo6");
public class ServletDemo5 extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { /* //设置定时刷新功能 1s刷新一次 resp.setInitHeader("refresh", 1); Random r= new Random(); resp.getWriter().write(r.nextInt()+"");*/ resp.setHeader("content-type", "text/html;charset=UTF-8"); resp.getWriter().write("注册成功!三秒后跳转到主页。"); //设置3s跳转 resp.setHeader("refresh", "3;url=/day09_00_httpServletResponse/servlet/demo6"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
设置重定向
public class ServletDemo7 extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("A:我要借钱!"); System.out.println("B:我不有,但是我可以告诉你谁有"); //告诉客户端要重定向新的资源 重新设置状态码302重定向 resp.setStatus(302); //告诉客户端要去访问哪一个URL resp.setHeader("location", "/day09_00_httpServletResponse/servlet/demo8"); System.out.println("A:我去了"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
public class ServletDemo8 extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println("我有钱,我借你!"); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { super.doPost(req, resp); } }
A:我要借钱!
B:我不有,但是我可以告诉你谁有
A:我去了
我有钱,我借你!
执行顺序:先将本程序中代码执行完毕。在执行跳转的程序。
以后重定向用得比较多。可以使用用简化的形式:sendRedirect(".....");
response.setHeader("location", "http://www.baidu.com"); ==>重定向外部资源。需要写上协议。
响应正文
*** getWrite(); 字符输出流 获取打印流
getOutputStream(); 字节输出流 获取输出流
setCharacterEncoding(String charset) 告知服务器使用什么编码
*****setContentType(String type) 可以顺便设置charset=UTF-8
如resp.setContentType(“text/html;charset=UTF-8”);

浙公网安备 33010602011771号