HttpServletResponse

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");

image


404状态码

  • 404的含义:找不到指定的页面

1)地址栏错误 浏览器输入的地址不正确,注意区分大小写

2)web.xml配置问题 如果web.xml文件配置出错,会导致整个web项目加载失败,所有的资源都不能访问。

3)项目未部署 项目没有部署到tomcat容器中

4)访问WEB-INF WEB-INF目录下的资源是不能直接通过浏览器访问

响应行:

image

405状态码

  • 405的含义:
    使用了get或post方法提交,但servlet中**没有重写**doGet或doPost方法,抛出405的错误
    image
响应行:

image

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");

image

其实重定向底层也是设置了响应头和状态码的

面试题: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的案例中的验证码


案例

image

以附件的方式下载Web资源
  • common-io包中的方法
    IOUtils类中的方法 作用
    static int copy(InputStream input, OutputStream output) 将一个字节输入流复制到一个字节输出流,返回复制的字节数
需求:实现不同类型的文件下载
  • 使用超链接下载的不足:

    1. 只有zip压缩文件会下载,其它有些文件会直接打开。
    2. 暴露Web资源的真实地址,容易被盗链。
    3. 不利于一些逻辑的控制,如:下载前要扣积分。
  • 使用Servlet下载步骤:

    1. 从链接上得到文件名
    2. 得到文件的MIME类型
    3. 设置content-type头为MIME类型
    4. 设置content-disposition头
    5. 得到文件的输入流
    6. 得到response的输出流
    7. 写出到浏览器端
    8. 下载文件名使用汉字的情况
  • 下载中文名字乱码的问题

    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>
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值