目录
HttpServletResponse
HttpServletResponse 介绍
HttpServletResponse 类图
向客户端返回数据方法
处理中文乱码问题-方案
处理中文乱码问题-方案 2
请求重定向
请求重定向原理示意图
应用实例
DownServlet Java类
DownServletNew.java
xml配置
请求重定向注意事项和细节
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");