一、HttpServletReponse类
a)HttpServletReponse类的作用
HttpServletReponse类和HttpServletRequest类一样,每次请求进来,Tomcat服务器都会创建一个Response对象,传递给Servlet程序去使用,HttpServletRequest表示请求过来的信息,HttpServletReponse表示所有响应的信息。
如果需要设置返回给客户端的信息,都可以通过HttpServletReponse对象进行设置。
b)两个输出流的说明
字节流 getOutputStream(); 常用于下载(传递二进制数据)
字符流 getWriter(); 常用于回传字符串(常用)
两个流同时只能使用一个,否则会报错
c)如何往客户端回传数据
往客户端回传字符串数据
public class ResponseIOServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
writer.println("response's content!!");
}
}
d)解决响应中的中文乱码问题
默认为ISO-8859-1
方法1:
resp.setCharacterEncoding("UTF-8");
//通过响应头,设置浏览器也使用UTF-8
resp.setHeader("Content-Type", "text/html; charset=UTF-8");
方法2:
resp.setContentType("text/html; charset=UTF-8");
//一行代码会同时设置服务器和客户端都使用UTF-8字符集,还设置了响应头
//此方法一定要在获取流对象之前设置才有效
System.out.println(resp.getCharacterEncoding());
e)请求重定向
请求重定向是指,客户端给服务器发送请求,然后服务器告诉客户端说。我给你一些地址,你去新地址访问,叫做重定向(因为之前的地址可能已经被废弃)。
第一种方案:
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:8088/web04_servlet/response2");
}
}
public class Response2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html; charset=UTF-8");
resp.getWriter().write("成功重定向到Response2!");
}
}
第二种方案:(推荐使用)
public class Response1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.sendRedirect("http://localhost:8088/web04_servlet/response2");
}
}
请求重定向的特点:
(1)浏览器地址栏会变化为重定向后的地址
(2)客户端进行了两次请求
(3)不共享Request域中的数据,因为Tomcat每次请求都会封装一个HttpServletReponse对象,两次请求封装了两个不同的对象。
(4)不能靠重定向访问到WEB-INF目录下的内容,因为还是由浏览器发送的请求,不是服务器内部。
(5)可以访问工程以外的资源
【请求转发对内,重定向对外】
重定向的相对路径地址到端口号 , 请求转发的到工程名
工程名: req.getContextPath()