HttpServletResponse(Servlet)
2023年11月15日大约 4 分钟约 800 字
介绍
- 每次 HTTP 请求,Tomcat 会创建一个 HttpServletResponse 对象传递给 Servlet 程序去使用。
- HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息,如果需要设置返回给客户端的信息,通过 HttpServletResponse 对象来进行设置即可。
向客户端返回数据方法

- 字节流 getOutputStream(); 常用于下载(处理二进制数据)
- 字符流 getWriter(); 常用于回传字符串
- (细节:)两个流同时只能使用一个。 使用了字节流,就不能再使用字符流,反之亦然,否则就会报错
向客户端返回数据实例
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class ResponseServlet_ extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException,IOException {
/* 老韩解读:
1. setContentType 会设置服务器和客户端都用 utf-8 字符集,还设置了响应头
2. setContentType 要在获取流对象(getWriter)之前调用才有效
*/
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.println("<h1>hello, world~</h1>");
writer.println("<h1>hi, 韩顺平教育</h1>");
writer.flush();
writer.close();
}
}
注意事项和细节
1.处理中文乱码问题-方案1

2.处理中文乱码问题-方案2

请求重定向
介绍
- 请求重定向指:一个 web 资源收到客户端请求后,通知客户端去访问另外一个 web资源,这称之为请求重定向
- 请求重定向原理示意图
应用实例
package com.lzw.servlet.response;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class DownServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//完成了自己的业务
//发出请求重定向 ->
//1. sendRedirect 本质就会 返回 302状态码 Location; /servlet/downServletNew
//2. 因此 302 和 /servlet/downServletNew 是浏览器解析,而不是服务器
//3. 浏览器在解析 /servlet/downServletNew => http://localhost:8080/servlet/downServletNew
String contextPath = getServletContext().getContextPath();
System.out.println("contextPath = " + contextPath);
// response.sendRedirect("/servlet/downServletNew");
response.sendRedirect(contextPath + "/downServletNew");
//第二种重定向的写法
// 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);
}
}
package com.lzw.servlet.response;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
public class DownServletNew extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("DownServletNew 被调用");
response.setContentType("application/x-tar;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);
}
}
注意事项
- 最佳应用场景:网站迁移,比如原域名是 www.hsp.com 迁移到 www.hsp.cn ,但是百度抓取的还是原来网址.
- 浏览器地址会发生变化,本质是两次 http 请求.
- 不能共享 Request 域中的数据,本质是两次 http 请求,会生成两个 HttpServletRequest对象
- 不能重定向到 /WEB-INF 下的资源
- 可以重定向到 Web 工程以外的资源, 比如 到 www.baidu.com 【在前面的案例演示】
- 重定向有两种方式, 推荐使用前者
//第一种
response.sendRedirect("/servlet/downServletNew");
//第二种
response.setStatus(302); //设置http响应的状态码
response.setHeader("Location", "/servlet/downServletNew");
- 动态获取到 application context
String contextPath = getServletContext().getContextPath();
System.out.println("contextPath = " + contextPath);
response.sendRedirect(contextPath + "/downServletNew");