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类
public class DownServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// System.out.println("DownServlet 被调用");
// response.setContentType("application/x-tar;charset=utf-8");
// PrintWriter writer = response.getWriter();
// writer.print("hi");
// writer.flush();
// writer.close();
//完成了自己业务
//发出请求重定向-> DownServletNew
//1. sendRedirect 本质就会 返回 302 状态码 Location: /servlet/downServletNew
//2. 因此 302和 /servlet/downServletNew 是浏览器解析,而不是服务器
//3. 浏览器在解析 /servlet/downServletNew =>
http://localhost:8080/servlet/downServletNew
//4. 动态获取到application context
String contextPath = getServletContext().getContextPath();
System.out.println("contextPath= " + contextPath);
//response.sendRedirect("/servlet/downServletNew");
response.sendRedirect(contextPath + "/downServletNew");
//response.sendRedirect("http://www.baidu.com");
//第二种重定向的写法
// System.out.println("第二种方式重定向...");
// response.setStatus(302); //设置http响应的状态码
// //设置http响应的 Location: /servlet/downServletNew
// response.setHeader("Location", "/servlet/downServletNew");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
DownServletNew.java
public class DownServletNew extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("DownServletNew 被调用");
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.print("ok");
writer.flush();
writer.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
xml配置
<servlet>
<servlet-name>DownServlet</servlet-name>
<servlet-class>com.servlet.response.DownServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DownServlet</servlet-name>
<url-pattern>/downServlet</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>DownServletNew</servlet-name>
<servlet-class>com.servlet.response.DownServletNew</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>DownServletNew</servlet-name>
<url-pattern>/downServletNew</url-pattern>
</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");