HttpServletResponse
Extends the ServletResponse interface to provide HTTP-specific functionality in sending a response. For example, it has methods to access HTTP headers and cookies.
延伸ServletResponse接口在发送响应提供HTTP特定功能。例如,它有访问HTTP头和cookie的方法。
response对象是服务器发送给浏览器所有的数据封装成一个响应对象,HttpServletResponse是一个接口,由服务器去实现
response设置状态码的方法
setStatus(int status)
- 设置一个状态码,单独设置状态码不是很常用。一般要结合响应头去使用
sendError(int sc)
- 发送一个错误码和错误页面给浏览器
- sendError(int sc,String msg)可以多传个信息
setStatus配合使用:
//通过设计响应头
response.setHeader("Location", "index.html");
//设置状态码
response.setStatus(302);
就相当于重定向
response.sendRedirect("index.html");
sendError示范
response.sendError(404, "sorry");
404状态码
- 404的含义:找不到指定的页面
1)地址栏错误 浏览器输入的地址不正确,注意区分大小写
2)web.xml配置问题 如果web.xml文件配置出错,会导致整个web项目加载失败,所有的资源都不能访问。
3)项目未部署 项目没有部署到tomcat容器中
4)访问WEB-INF WEB-INF目录下的资源是不能直接通过浏览器访问
响应行:
405状态码
- 405的含义:
使用了get或post方法提交,但servlet中**没有重写**doGet或doPost方法,抛出405的错误
响应行:
response设置响应头的方法
响应头的信息
响应头信息 | 说明 |
---|---|
Location: http://www.newboy.com/index.html | 指定要跳转到的下一个页面 |
Content-Encoding: gzip | 服务器的压缩格式 |
Content-Type: text/html; charset=utf-8 | 设置响应的MIME类型 |
Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT | 服务器最后修改的时间 |
Refresh: 1;url=http://www.newboy.com | 过1秒后跳转到另一个URL |
Content-Disposition: attachment; filename=newboy.zip | 以附件的方式下载文件,并且命名为filename |
响应头的方法
response响应头的方法 | 描述 |
---|---|
void setHeader(String name, String value) | 设置一个响应头和值 |
void setContentType(String type) | 设置响应的MIME类型 |
void setCharacterEncoding(String charset) | 设置响应的编码 |
示例:使用location进行页面跳转
- 302的含义:
进行页面的跳转
代码:
//进行页面的跳转
//通过设置响应头
response.setHeader("Location", "index.html");
//设置状态码
response.setStatus(302);
或者
response.sendRedirect("index.html");
其实重定向底层也是设置了响应头和状态码的
面试题:Location需要与状态码302配合使用,完成页面转发,这句话是否正确?
不是转发,而是重定向
服务器响应数据的两种方式
OutputStream getOutputStream()
- 得到输出字节流,二进制数据。如果要输出字符,指定码表也可以输出字符。
- PrintWriter getWriter()
- 得到输出的字符流,字符流是需要设置编码
如果要输出图片等二进制的数据,使用字节流。如果要输出文本,使用字符流。
- 得到输出的字符流,字符流是需要设置编码
字节流输出中文
分别使用getBytes()设置成GBK和UTF-8,使用字节流输出汉字,为什么没有出现乱码?
因为getBytes()方法,已经进行了编码的操作,默认是GBK,也可以指定它的码表。但有些浏览器不能识别编码的类型。不建议使用字节流输出文本。
如何通知浏览器当前网页使用什么格式和编码?
response.setContentType(“text/html;charset=utf-8”);
字符流输出中文
使用打印输出流,输出汉字的结果是什么?
如果不指定打印流的编码,直接输出汉字有乱码。因为tomcat默认使用的是iso-8859-1编码
如何设置打印流默认的字符集?
response.setCharacterEncoding(字符集);
如果不使用上面的方法,只设置content-type响应头会怎么样?
如果只设置contentType,也可以起到response.setCharacterEncoding(字符集);这句话的作用。所以我们只需要设置response.setContentType(“text/html;charset=utf-8”); 就可以解决汉字乱码的问题。
响应体的案例
就是服务器发送给浏览器的数据,数据可以是二进制或文本
验证码就是一张图片,验证码图片不是真实的资源图片而是缓存图片,图片的数据在缓存里面或内存里面,将内存中的缓存图片输出到浏览器上。
可以去看Seesion的案例中的验证码
案例
以附件的方式下载Web资源
- common-io包中的方法
IOUtils类中的方法 作用
static int copy(InputStream input, OutputStream output) 将一个字节输入流复制到一个字节输出流,返回复制的字节数
需求:实现不同类型的文件下载
使用超链接下载的不足:
- 只有zip压缩文件会下载,其它有些文件会直接打开。
- 暴露Web资源的真实地址,容易被盗链。
- 不利于一些逻辑的控制,如:下载前要扣积分。
使用Servlet下载步骤:
- 从链接上得到文件名
- 得到文件的MIME类型
- 设置content-type头为MIME类型
- 设置content-disposition头
- 得到文件的输入流
- 得到response的输出流
- 写出到浏览器端
- 下载文件名使用汉字的情况
下载中文名字乱码的问题
IE、Chrome下载中文采用的是URL编码,注:FireFox不能采用这种方式。
URLEncoder.encode(filename, “utf-8”)
DownServlet
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 1) 从链接上得到文件名
String file = request.getParameter("file");
// 对汉字的值进行解码
file = new String(file.getBytes("iso-8859-1"), "utf-8");
// 2) 得到文件的MIME类型
String type = getServletContext().getMimeType("/down/" + file);
System.out.println(type);
// 3) 设置content-type头为MIME类型
response.setHeader("content-type", type);
// 4) 设置content-disposition头,以附件的方式下载文件filename后是文件名,在ie和chrome中汉字使用url编码格式
response.setHeader("content-disposition",
"attachment; filename=" + URLEncoder.encode(file, "utf-8"));
// 5) 得到文件的输入流
InputStream in = getServletContext().getResourceAsStream("/down/" + file);
// 6) 得到response的输出流
OutputStream out = response.getOutputStream();
// 7) 使用common-io工具类,将文件流写出到浏览器端
IOUtils.copy(in, out);
in.close();
out.close();
}
下载页面.html
<!DOCTYPE html>
<html>
<head>
<title>资源下载列表</title>
<meta charset="utf-8">
</head>
<body>
<h2>文件下载页面列表</h2>
<h3>超链接的下载</h3>
<a href="download/file.txt">文本文件</a><br/>
<a href="download/file.jpg">图片文件</a><br/>
<a href="download/file.zip">压缩文件</a><br/>
<hr/>
<h3>手动编码的下载方式</h3>
<a href="down?filename=file.txt">文本文件</a><br/>
<a href="down?filename=file.jpg">图片文件</a><br/>
<a href="down?filename=file.zip">压缩文件</a><br/>
<a href="down?filename=美女.jpg">美女</a><br/>
</body>
</html>