一、 HttpServletResponse概述
我们在创建Servlet时会覆盖service()
方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response。
service方法中的response
的类型是ServletResponse
,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更加强大。
二、 通过抓包工具抓取Http响应
因为response代表响应,所以我们可以通过该对象分别设置Http响应的响应行,响应头和响应体
三、 通过response设置响应行
设置响应行的状态码
setStatus(int sc)
response.setStatus(329);
开发中用的不多,一般Tomcat会自动设置状态码。我们可以百度状态码,最常见的状态码
四、 通过response设置响应头
列出了常用设置HTTP响应头的方法,这些方法由HttpServletResponse 类提供其中,
addHeader(String name, String value)
——添加指定名称的响应头和string值addIntHeader(String name, int value)
——添加指定名称的响应头和int值addDateHeader(String name, long date)
——添加指定名称的响应头和日期值setHeader(String name, String value)
(重点)
——使用指定名称和值设置响应头的名称和内容setDateHeader(String name, long date)
——使用指定名称和值设置响应头的名称和内容setIntHeader(String name, int value)
——指定 int 类型的值到 name 标头
add以及set方法解析:
add表示添加,而set表示设置
案例一:
//设置响应头
Date date = new Date();
response.addHeader("name","张三");
//response.addIntHeader("age",28);
//response.addDateHeader("birthday",date.getTime());
response.setHeader("age","50");
重定向问题:设置状态码 设置响应头
步骤:
- 设置状态码302
- 设置响应头Location
理解:
-
302 表示临时性重定向。访问一个url时,被重定向到另一个url上。
常用于页面跳转。 -
在响应头中加入Location参数。浏览器接受到带有location头的响应时,就会跳转到相应的地址。
案例二:
第一步:书写Servlet1
@WebServlet("/Servlet1")
public class Servlet1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//没有响应 告知客户端去重定向到Servlet2
//1.设置状态码302
response.setStatus(302);
//2.设置响应头Location
response.setHeader("Location","/WEB14/Servlet2");
}
}
第二步:书写重定向的Servlet2
@WebServlet("/Servlet2")
public class Servlet2 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.getWriter().write("hhh");
}
}
五、 通过response设置响应体
1.响应体设置文本
PrintWriter getWriter()
获得字符流,通过字符流的write(String s)方法可以将字符串设置到response缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。
最常见的写法就是
response.getWriter().write("我是response!!");
2.关于设置中文的乱码问题
原因:response缓冲区的默认编码是iso8859-1,此码表中没有中文,可以通过response的setCharacterEncoding(String charset)
设置response的编码
但我们发现客户端还是不能正常显示文字
原因:我们将response缓冲区的编码设置成UTF-8,但浏览器的默认编码是本地系统的编码,因为我们都是中文系统,所以客户端浏览器的默认编码是GBK,我们可以手动修改浏览器的编码是UTF-8。
我们还可以在代码中指定浏览器解析页面的编码方式,
通过response的setContentType(String type)
方法指定页面解析时的编码是UTF-8:
一般写成:
response.setContentType("text/html;charset=UTF-8");
上面的代码不仅可以指定浏览器解析页面时的编码,同时也内含setCharacterEncoding
的功能,所以在实际开发中只要编写:response.setContentType("text/html;charset=UTF-8")
;
就可以解决页面输出中文乱码问题。
案例一:
public class TextServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置response查询的码表
response.setCharacterEncoding("UTF-8");
//通过一个头Content-Type 告知客户端使用何种码表进行解码
response.setHeader("ContentType","text/html;charset=UTF-8");
//该方法与上面方法等价,开发中常用
response.setContentType("text/html;charset=UTF-8");
PrintWriter writer = response.getWriter();
writer.write("hello response!!");
writer.write("中国");
}
再次强调,开发中只要写response.setContentType("text/html;charset=UTF-8");
即可解决乱码问题。如果不采用该方法,那么我们必须先设置response缓冲区以及设置浏览器的编码均为utf-8。
3.响应头设置字节
ServletOutputStream getOutputStream()
获得字节流,通过该字节流的write(byte[] bytes)可以向response缓冲区中写入字节,在由Tomcat服务器将字节内容组成Http响应返回给浏览器。
这样讲很空,还是做一个在服务器上上传一张照片的小demo来体会字节。
案例:
@WebServlet("/ByteServlet")
public class ByteServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//使用responce获得字节输出流
ServletOutputStream out=response.getOutputStream();
//获得服务器上的图片
String RealPath = this.getServletContext().getRealPath("a.jpg");
InputStream in = new FileInputStream(RealPath);
int len = 0;
//字节数组,详细可以常看io流的内容
byte [] buffer = new byte[1024];
while ((len = in.read(buffer))>0){
out.write(buffer,0,len);
}
in.close();
out.close();
}
}
六、 response细节点
- response获得的流不需要手动关闭,Tomcat容器会自动关闭
- getWriter()和getOutputStream不能同时调用