本文是连接着上文的Servlet
如果没有上文的Servlet是无法清楚啥是HttpServletResponse
其实也没啥,这只不过是Servlet中的service方法中的两个参数(精华)之一.
首先HttpServletResponse是什么?
官方说明文档告诉我们:
- 扩展 ServletResponse 接口以提供特定于 HTTP 的发送响应功能。例如,该接口拥有访问 HTTP 头和 cookie 的方法。
- servlet 容器创建 HttpServletResponse 对象,并将该对象作为参数传递给 servlet 的 service 方法(doGet、doPost,等等)。
那么ServletResponse又是什么东西?
官方文档也告诉我们:
- 定义辅助 servlet 将响应发送到客户端的对象。servlet 容器创建 ServletResponse 对象,并将它作为参数传递给 servlet 的 service 方法。
要发送 MIME 正文响应中的二进制数据,请使用 #getOutputStream 返回的 ServletOutputStream。要发送字符数据,请使用 #getWriter 返回的 PrintWriter 对象。要混合二进制数据和文本数据,例如要创建 multipart 响应,请使用 ServletOutputStream 并手动管理字符部分。
可使用 #setCharacterEncoding 和 #setContentType 显式指定 MIME 正文响应的 charset,或使用 #setLocale 方法隐式指定它。显式指定优先于隐式指定。如果未指定 charset,则将使用 ISO-8859-1。setCharacterEncoding、setContentType 或 setLocale 方法必须在调用 getWriter 之前,并且必须在提交采用要使用的字符编码的响应之前调用。
到这应该明白HttpServletResponse是什么了吧.
其实就是Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象、和代表响应的response对象。
那么HttpServletResponse有什么用呢?(其实对于高手们看看文档的方法就可以自学了)
1,响应行
- setStatus(int status);设置此响应的状态代码。
例如:setStatus(302);//返回302,就是重定向.如果是404,就是访问的资源不存在.其实在HttpServletResponse中已经定义好这些值的了.
- setStatus(int status);设置此响应的状态代码。
2,响应头(很多都是HTML的头设置,所以要查看一下HTML的头的意义)
setHeader(String name, String value) 设置响应头信息
用给定名称和值设置响应头。如果已经设置了头,则新值将重写以前的值。containsHeader 方法可用于测试在设置其值之前头是否存在。与addHeader(String name ,String value)是有区别的,addxxx()是可以一个name添加多个value.
sendRedirect(String location) 请求重定向
3,响应正文
- getWriter();//获取字符输出流
- getOutputStream();//获取字节输出流.
- setContentType(String type) ;//设置将发送到客户端的响应的内容类型.
- **setCharacterEncoding(**String charset);// 告知服务器使用什么编码
以上的方法其实都是ServletResponse接口里定义好的,然HttpServletResponse是它的子接口,所以就有了它的所有的方法.
HttpServletResponse的使用实例.
1,模拟下载文件
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//将服务端和客户端的编码都是用UTF-8
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//获取文件路径
String filepath = this.getServletContext().getRealPath("/WEB-INF/classes/班花.jpg");//src目录下的文件
FileInputStream fis = new FileInputStream(filepath);
//获取输出字节流ServletOutputStream
ServletOutputStream sos = response.getOutputStream();
//格式化并获得对应编码的文件名.
String filename = filepath.substring(filepath.lastIndexOf("\\")+1);//切记反斜杠的写法.
filename = URLEncoder.encode(filename, "UTF-8");
//告知浏览器下载文件
response.setHeader("content-disposition", "attachment;filename="+filename);
response.setHeader("content-type", "image/jpeg");
byte[] b = new byte[1024];
int len;
while((len = fis.read(b))!=-1){
sos.write(b, 0, len);//写到浏览器.
}
//关流
sos.close();
fis.close();
}
2, 实现3秒后跳转到另外一个页面.
resp.setHeader("refresh", "3;url=/ServletResponeDemo/Demo3");
3,告知浏览器不要缓存.
//告知客户端不缓存
response.setHeader("pragma", "no-cache");
response.setHeader("cache-control", "no-cache");
response.setDateHeader("expires", 0);