HttpServletResponse类
a) HttpServletResponse类的作用
- 每次请求进来,Tomcat服务器都会创建一个Response类对象传递给Servlet程序使用。HttpServletRequest表示请求过来的信息,HttpServletResponse表示所有响应的信息。
- 我们如果需要设置返回给客户端的信息,都可以通过HttpServletResponse对象来进行设置;
b) 两个输出流
- 字符输出流:PrintWeiter getWeiter() 用于传回字符串
- 字节输出流:ServletOutputStream getOutputStream() 用于下载
在一个Servlet程序中,只能获取一个流;如果两个流都获取,那么就会报错;
字符流输出数据
//todo response输出数据
public class responseDemo03 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.获取字符输出流
PrintWriter writer = resp.getWriter();
//2.输出数据
// request和response获取的流不需要flush和close
// 自己会将数据写出缓冲区
// 一次请求响应结束后会自动关闭
writer.write("<h1>hello response</h1>");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
}
可以输出html文本,浏览器会自动解析。
字符流输出中文乱码问题
- 注意: 必须在获取流之前需要设置流的编码格式
- 通过响应头设置告诉客户端用什么编码
- 服务器默认用的ISO编码,浏览器默认GBK
- 如果要用中文,那么服务器和浏览器必须都需要统一且使用UTF-8
简化设置:即能设置服务器,也能设置浏览器的编码格式;也能设置响应头;
resp.setContentType("text/html;charset=utf-8")
字节流输出数据
//1.获取输出流
ServletOutputStream sos = resp.getOutputStream();
//2.输出数据 字节流必须要转为字节数组
sos.write("中文输出".getBytes(StandardCharsets.UTF_8));
c) 请求重定向
重定向的使用
步骤:
- 设置302状态吗
- 设置响应头中的location属性的值为目标资源路径
@WebServlet("/responseDemo01")
public class responseDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//todo 请求转发第一种写法
//设置状态吗302
resp.setStatus(302);
resp.setHeader("location","/Servlet/responseDemo02");
//todo 重定向第二种写法
resp.sendRedirect("/Servlet/responseDemo02");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
}
@WebServlet("/responseDemo02")
public class responseDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("跳转到了responseDemo02");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
}
//todo 重定向的第一种写法
//设置状态吗302
resp.setStatus(302);
resp.setHeader("location","/Servlet/responseDemo02");
//todo 重定向第二种写法
resp.sendRedirect("/Servlet/responseDemo02");
注意这里的路径,必须要加上虚拟目录!!!
重定向的特点
- 是从客户端浏览器发起两次请求
- 因此:
- 地址栏发生变化
- 可以访问其他站点(服务器)的资源
- 不共享HttpRequest对象中的数据
- 不能访问项目下WEB-INF目录
重定向是redirect
请求转发的特点:
1.地址栏不发生变化
2.不可以访问其他站点(服务器)的资源
3.是一次请求
4.请求转发是forward
d) 响应行状态码
1. 100-199 信息响应
服务器接收客户端消息,但还没有接收完成,等待一段时间后,发送1xx状态码
2. 200-299 成功响应
这次请求和响应成功
3. 300-399 重定向
302 重定向
304 重定向到本地缓存
4. 400-499 客户端错误
404 资源访问路径错误
405 请求方式没有对应的doXXX方法
5. 500-599 服务端错误
500 服务器内部代码有异常
响应头
格式: 头名称:值
常见响应头:
- Content-Type:服务器告诉客户端浏览器本次响应体的数据格式和编码格式
比如:text/html;charset=UTF-8
会设置浏览器的编码格式 - Content-Length:
- Content-disposition:服务器告诉客户端以什么格式打开响应体数据
默认值:in-line 在当前页面内打开
attachment:以附件形式打开响应体
响应体
就是返回给浏览器用于展示的数据
Response对象
功能:
1.设置相应行
设置状态码:setStatus(int sc);
2.设置响应头
setHeader(String name,String value )
3.设置响应体
步骤:
1.获取输出流
2.通过流输出数据
路径
绝对路径
以/开头的路径
相对路径
确定目标路径和当前资源的相对路径关系
如果目标路径是给客户端浏览器使用,需要加虚拟目录
给服务器使用,不需要加虚拟目录
请求转发是给服务器使用,重定向是给客户端使用,所以重定向必须要加虚拟目录
动态获取虚拟目录
//todo 重定向的第一种写法
//设置状态吗302
resp.setStatus(302);
resp.setHeader("location","/Servlet/responseDemo02");
//todo 重定向第二种写法
resp.sendRedirect("/Servlet/responseDemo02");
//todo 优化写法,动态获取虚拟目录
String contextPath = req.getContextPath();
resp.sendRedirect(contextPath+"/responseDemo02");