HttpServletResponse
HttpServletResponse 介绍
1. 每次 HTTP 请求,Tomcat 会创建一个 HttpServletResponse 对象传递给 Servlet 程序去
使用。
2. HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息, 如果需要设置返回给客户端的信息,通过 HttpServletResponse 对象来进行设置
HttpServletResponse 类图
向客户端返回数据方法
1. 字节流 getOutputStream(); 常用于下载(处理二进制数据)
2. 字符流 getWriter(); 常用于回传字符串
3. (细节:)两个流同时只能使用一个。 使用了字节流,就不能再使用字符流,反之亦然,否则就会报错
处理中文乱码问题-方案
处理中文乱码问题-方案 2
请求重定向
1. 请求重定向指:一个 web 资源收到客户端请求后,通知客户端去访问另外一个 web资源,这称之为请求重定向
请求重定向原理示意图
应用实例
需 求 : 演 示 请 求 重 定 向 的 使 用 当 访 问 DownServlet 下 载 文 件 , 重 定 向 到 DownServletNew 下载文件
DownServlet Java类
1. public class DownServlet extends HttpServlet { 2. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 3. 4. // System.out.println("DownServlet 被调用"); 5. // response.setContentType("application/x-tar;charset=utf-8"); 6. // PrintWriter writer = response.getWriter(); 7. // writer.print("hi"); 8. // writer.flush(); 9. // writer.close(); 10. 11. //完成了自己业务 12. //发出请求重定向-> DownServletNew 13. 14. //1. sendRedirect 本质就会 返回 302 状态码 Location: /servlet/downServletNew 15. //2. 因此 302和 /servlet/downServletNew 是浏览器解析,而不是服务器 16. //3. 浏览器在解析 /servlet/downServletNew => 17. http://localhost:8080/servlet/downServletNew 18. 19. //4. 动态获取到application context 20. String contextPath = getServletContext().getContextPath(); 21. System.out.println("contextPath= " + contextPath); 22. 23. //response.sendRedirect("/servlet/downServletNew"); 24. 25. response.sendRedirect(contextPath + "/downServletNew"); 26. 27. //response.sendRedirect("http://www.baidu.com"); 28. 29. //第二种重定向的写法 30. // System.out.println("第二种方式重定向..."); 31. // response.setStatus(302); //设置http响应的状态码 32. // //设置http响应的 Location: /servlet/downServletNew 33. // response.setHeader("Location", "/servlet/downServletNew"); 34. 35. 36. } 37. 38. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 39. doPost(request,response); 40. } 41. }
DownServletNew.java
1. public class DownServletNew extends HttpServlet { 2. protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 3. 4. System.out.println("DownServletNew 被调用"); 5. response.setContentType("text/html;charset=utf-8"); 6. PrintWriter writer = response.getWriter(); 7. writer.print("ok"); 8. writer.flush(); 9. writer.close(); 10. } 11. 12. protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 13. doPost(request,response); 14. } 15. }
xml配置
1. <servlet> 2. <servlet-name>DownServlet</servlet-name> 3. <servlet-class>com.servlet.response.DownServlet</servlet-class> 4. </servlet> 5. 6. <servlet-mapping> 7. <servlet-name>DownServlet</servlet-name> 8. <url-pattern>/downServlet</url-pattern> 9. </servlet-mapping> 10. 11. <servlet> 12. <servlet-name>DownServletNew</servlet-name> 13. <servlet-class>com.servlet.response.DownServletNew</servlet-class> 14. </servlet> 15. 16. <servlet-mapping> 17. <servlet-name>DownServletNew</servlet-name> 18. <url-pattern>/downServletNew</url-pattern> 19. </servlet-mapping>
请求重定向注意事项和细节
1. 最佳应用场景:网站迁移,比如原域名是 www.hsp.com 迁移到 www.hsp.cn ,但是百度抓取的还是原来网址.
2. 浏览器地址会发生变化,本质是两次 http 请求.
3. 不能共享 Request 域中的数据,本质是两次 http 请求,会生成两个 HttpServletRequest对象
4. 不能重定向到 /WEB-INF 下的资源
5. 可以重定向到 Web 工程以外的资源, 比如到 www.baidu.com 【在前面的案例演示】
6. 重定向有两种方式, 推荐使用第 1 种
7. 动态获取到 application context
String contextPath = getServletContext().getContextPath();
System.out.println("contextPath= " + contextPath);
response.sendRedirect(contextPath + "/downServletNew");






