HttpServletResponse 类的作用:
HttpServletResponse 类和 HttpServletRequest 类一样。每次请求进来,Tomcat 服务器都会创建一个 Response 对象传递给 Servlet 程序去使用。HttpServletRequest 表示请求过来的信息,HttpServletResponse 表示所有响应的信息, 我们如果需要设置返回给客户端的信息,都可以通过 HttpServletResponse 对象来进行设置
两个输出流的说明:
字节流 | getOutputStream(); | 常用于下载(传递二进制数据) |
---|---|---|
字符流 | getWriter(); | 常用于回传字符串(常用) |
两个流同时只能使用一个。
使用了字节流,就不能再使用字符流,反之亦然,否则就会报错。
public class ResponseIOServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter();
resp.getOutputStream();
}
}
如何往客户端回传数据:
要求:往客户端回传字符串数据。
public class ResponseIOServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// resp.getWriter();
// resp.getOutputStream();
// 要求:往客户端回传字符串数据。
PrintWriter writer = resp.getWriter(); //快捷键:alt + enter
writer.write("response's content!!!");
}
}
响应的乱码解决:
public class ResponseIOServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// resp.getWriter();
// resp.getOutputStream();
// 要求:往客户端回传字符串数据。
PrintWriter writer = resp.getWriter(); //快捷键:alt + enter
// writer.write("response's content!!!");
writer.write("旭哥好帅");
}
}
如果write的是中文,会出现乱码问题
拿到相应的字符集看一看:
//获取响应的字符集
System.out.println(resp.getCharacterEncoding()); //默认ISO-8859-1
我们可以设置服务器的字符集:
//设置服务器字符集为UTF-8
resp.setCharacterEncoding("UTF-8");
此时,问题仍旧没有解决,原因是浏览器不知道服务器用的哪个字符集,我们还需要设置浏览器的字符集
浏览器默认使用GBK
我们可以通过响应头,设置浏览器也使用UTF-8字符集
//通过响应头,设置浏览器也使用UTF-8字符集
resp.setHeader("Content-Type","text/html; charset=UTF-8");
完整代码:
// 第一种方法
//设置服务器字符集为UTF-8
resp.setCharacterEncoding("UTF-8");
//通过响应头,设置浏览器也使用UTF-8字符集
resp.setHeader("Content-Type","text/html; charset=UTF-8");
还有种更简单的方法:
// 第二种方法
// 他会同时设置服务器和客户端都是用UTF-8字符集,还设置了响应头
// 注意:此方法一定要在获取流对象之前才有效
resp.setContentType("text/html; charset=UTF-8");
System.out.println(resp.getCharacterEncoding());
请求重定向:
请求重定向,是指客户端给服务器发请求,然后服务器告诉客户端说,我给你一些地址,你去新地址访问,叫请求 重定向(因为之前的地址可能已经被废弃)。
public class Response1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("曾到此地一游 Response1");
//设置响应状态码302,表示重定向(已搬迁)
resp.setStatus(302);
resp.setHeader("Location","Http://localhost:8080/07_servlet/response2");
}
}
public class Response2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("response2's result!");
}
}
请求重定向的特点:
- 浏览器地址栏会发生变化
http://localhost:8080/07_servlet/response1
变成了 ==>
http://localhost:8080/07_servlet/response2
- 两次请求
-
不共享Request域中的数据
原因:Tomcat每次收到请求就会把请求过来的数据解析好,封装成为一个request对象
-
不能访问WEB-INF下的资源
WEB-INF目录下放一个form.html
public class Response1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("曾到此地一游 Response1");
req.setAttribute("key1","value1");
//设置响应状态码302,表示重定向(已搬迁)
resp.setStatus(302);
// resp.setHeader("Location","Http://localhost:8080/07_servlet/response2");
resp.setHeader("Location","Http://localhost:8080/07_servlet/WEB-INF/form.html");
}
}
访问http://localhost:8080/07_servlet/response1:
原因:
第二次请求还是把请求从浏览器发送到服务器,但是WEB-INF目录是受保护的,浏览器无法直接访问
- 可以访问工程外的资源
resp.setHeader("Location","Http://www.baidu.com");
可以正常访问:
请求重定向的第二种方法:(推荐)
//请求重定向的第二种方法:
resp.sendRedirect("http://localhost:8080");
`
resp.setHeader("Location","Http://www.baidu.com");