Response介绍
HttpServletResponse对象,通过它的方法可以设置HTTP响应消息的内容
在Servlet API中,定义了一个HttpServletResponse接口,它继承自ServletResponse接口,专门用来封装HTTP响应消息。由于,因此,在HttpServletResponse接口中定义了向客户端发送响应状态码、响应消息头、响应消息体的方法。
通俗来说,Response对象通过设置响应码,响应头,响应体等这些东西,可以向客户端返回数据,如:文件,图片,文件等;
一个HTTP响应包括哪些东西
Response设置响应行
setStatus(int status); 200 302 304
sendError(int sc); 404 500
sendError方法有tomcat默认的错误提示页面,setStatus只是设置状态码,没有提示页面;
Response设置响应头
响应头是一组键值对,可以通过response对象的setHeader(String s,String s1)方法设置响应头。
resp.setHeader("Content-Type","text/html;charset=UTF-8");
response.setContentType("text/html;charset=UTF-8");
response.setHeader("Refresh", "5;url=/login/index.html");//5秒后跳转index页面
Response的重定向:
- 通过设置响应头完成
response.setStatus(302);
response.setHeader("Location","/javaweb/login");
- 通过sendRedirect方法
response.sendRedirect("/Location/login");
Response设置响应体
Response响应文字及乱码
getWriter()
response通过getWriter方法可以获得字符流,向response的缓冲区写数据。然后tomcat将response缓冲区中的字符返回给浏览器
resp.getWriter().println("第" + number + "访问该网站的人");
如果输出的字符是中文的话,前台页面展示会出现乱码,原因是response缓存区的编码是ios-8859-1,通过response的setCharacterEncoding()方法可以将response缓存区的编码设置为想要的编码格式
resp.setCharacterEncoding("utf-8");
结果发现仍然为乱码,那是因为很多浏览器默认的编码格式是GBK,除了可以手动的修改浏览器的编码格式之外,还可以指定浏览器解析页面所用的格式
response.setContentType("text/html;charset=UTF-8");
resp.setHeader("Content-Type","text/html;charset=UTF-8");
这两种方法都可以,setContentType()方法也包含setCharacterEncoding()方法的功能,所以只需设置response.setContentType(“text/html;charset=UTF-8”)即可
Response响应文件数据
response除了可以响应文字以外,还可以响应图片,音频,视频等二进制文件。因为这些不能用字符流进行处理,所以我们需要用字节流。
//获取字节输出流
ServletOutputStream outputStream = response.getOutputStream();
该方法可以获得一个输往response缓冲区的字节输出流,可以往里输入文字和文件数据
Response字节流输出文字
字节流输出中文文字可以不必考虑字符编码,不会出现乱码
ServletOutputStream outputStream = response.getOutputStream();
byte[] bytes = "中国".getBytes();
outputStream.write(bytes);
outputStream.close();
Response字节流输出文件数据
输出文件数据需要一个输入流,如何获取文件的输入流在上一节已经讲了,用ServletContext或类加载器获取,然后将输入流中的数据拷贝到输出流,以图片输出为例:
1.web/img目录下有一张a.jpg图片
2.在servlet中编写代码
//获取输入流 在web目录下的采用ServletContext对象获取
InputStream is = this.getServletContext().getResourceAsStream("img/a.jgp");
//获取输出流
ServletOutputStream os = resp.getOutputStream();
//设置缓存的传输数组
byte[] bytes = new byte[1024];
//偏移量
int len;
//进行拷贝
while ((len= is.read(bytes))!=-1){
os.write(bytes,0,len);
}
is.close();
os.close();