JavaWeb - HttpServletResponse

1. HttpServletResponse概述

在创建Servlet时会覆盖service()方法,或doGet()/doPost(),这些方法都有两个参数,一个为代表请求的request和代表响应response

service方法中的response的类型是ServletResponse,而doGet/doPost方法的response的类型是HttpServletResponse,HttpServletResponse是ServletResponse的子接口,功能和方法更加强大,今天我们学习HttpServletResponse。

2. response的运行流程

运行流程

3. 通过抓包工具抓取Http响应

Http响应

因为response代表响应,所以我们可以通过该对
code

象分别设置Http响应的响应行,响 应头和响应体

4. 通过response设置响应行

设置响应行的状态码

setStatus(int sc)

5. 通过response设置响应头

addHeader(Stringname, String value) 

addIntHeader(String name, int value) 

addDateHeader(String name, long date) 
setHeader(Stringname, String value) 

setDateHeader(String name, long date) 

setIntHeader(String name, int value)

其中,add表示添加,而set表示设置

6. 通过response设置响应体

  1. 响应体设置文本
PrintWriter getWriter()

获得字符流,通过字符流的write(String s)方法可以将字符串设置到response 缓冲区中,随后Tomcat会将response缓冲区中的内容组装成Http响应返回给浏览器端。

  1. 关于设置中文的乱码问题

原因: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");

就可以解决页面输出中文乱码问题。

  1. 响应头设置字节
ServletOutputStream  getOutputStream()

获得字节流,通过该字节流的write(byte[] bytes)可以向response缓冲区中写入字 节,在由Tomcat服务器将字节内容组成Http响应返回给浏览器。

7. 案例-完成文件下载

文件下载的实质就是文件拷贝,将文件从服务器端拷贝到浏览器端。所以文件下载需要IO技术将服务器端的文件使用InputStream读取到,在使用 ServletOutputStream写到response缓冲区中

代码如下:


code

上述代码可以将图片从服务器端传输到浏览器,但浏览器直接解析图片显示在页面上, 而不是提供下载,我们需要设置两个响应头,告知浏览器文件的类型和文件的打开方 式。

  1. 1.告知浏览器文件的类型:response.setContentType(文件的MIME类型);
  2. 2.告示浏览器文件的打开方式是下载:

response.setHeader("Content-Disposition","attachment;filename=文件名称");

代码如下:

code.png

但是,如果下载中文文件,页面在下载时会出现中文乱码或不能显示文件名的情况, 原因是不同的浏览器默认对下载文件的编码方式不同,ie是UTF-8编码方式,而火狐 浏览器是Base64编码方式。所里这里需要解决浏览器兼容性问题,解决浏览器兼容 性问题的首要任务是要辨别访问者是ie还是火狐(其他),通过Http请求体中的一 个属性可以辨别

解决乱码方法如下:

if (agent.contains("MSIE")) {
  // IE浏览器
  filename = URLEncoder.encode(filename, "utf-8");
  filename = filename.replace("+", " ");
} else if (agent.contains("Firefox")) {
  // 火狐浏览器
  BASE64Encoder base64Encoder = new BASE64Encoder();
  filename = "=?utf-8?B?"+ base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
} else {
  // 其它浏览器
  filename = URLEncoder.encode(filename, "utf-8");
}

其中agent就是请求头User-Agent的值


code
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,868评论 18 139
  • Spring Web MVC Spring Web MVC 是包含在 Spring 框架中的 Web 框架,建立于...
    Hsinwong阅读 22,522评论 1 92
  • 本文包括:1、文件上传概述2、利用 Commons-fileupload 组件实现文件上传3、核心API——Dis...
    廖少少阅读 12,587评论 5 91
  • 2008年爆发全球金融危机,当时有人用“中本聪”的化名发表了一篇论文,描述了比特币的模式。 从比特币的本质说起,比...
    小北找不到北阅读 482评论 0 0
  • 前言 以下代码来自:自己写的、工作项目框架上用到的、其他框架源码上的、网上看到的。 主要是作为工具函数,服务于框架...
    ITgecko阅读 1,015评论 1 19