JavaWeb的学习--Response

1.HttpServletResponse概述

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

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

2.response的运行流程

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

因为response代表响应,所以我们可以通过该对象分别设置Http响应的响应行,响   应头和响应体

4.通过response设置响应行

设置响应行的状态码

setStatus(int sc)

5.通过response设置响应头

addHeader(String name, String value)

addIntHeader(String name, int value)

addDateHeader(String name, long date)

setHeader(String name, String value)

setDateHeader(String name, long date)

setIntHeader(String name, int value)

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

重定向: 状态码:302  响应头:location 代表重定向的地址

6.通过response设置响应体

(1)响应体设置文本

PrintWriter getWriter()

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

关于设置中文的乱码问题

原因: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");就可以解决页面输出中文乱码问题。

(2)响应头设置字节

ServletOutputStream  getOutputStream()

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

7.案例-完成文件下载

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

代码如下:

 1 /**
 2  * ServletOutputStream getOutputStream()
 3  * 获取字节流,通过字节流的writer(byte[] bytes)可以向resposne的缓冲区中写字节
 4  * @author vanguard
 5  *
 6  */
 7 public class ByteServlet extends HttpServlet {
 8
 9     public void doGet(HttpServletRequest request, HttpServletResponse response)
10             throws ServletException, IOException {
11         ServletContext context = this.getServletContext();
12         //获得图片的完整路径
13         String path = context.getRealPath("WEB-INF/download/a.jpg");
14         //文件输入流,获取一张图片
15         FileInputStream in = new FileInputStream(path);
16         //获取字节流
17         ServletOutputStream out = response.getOutputStream();
18         int len = 0;
19         byte[] buf = new byte[1024];
20         while(-1 != (len = in.read(buf))) {
21             out.write(buf, 0, len);
22         }
23
24         //关闭流
25         in.close();
26         //response的字节输出流不需要手动关闭,Tomcat容器会帮我们自动关闭
27         //out.close();
28
29     }
30
31     public void doPost(HttpServletRequest request, HttpServletResponse response)
32             throws ServletException, IOException {
33         doGet(request, response);
34
35     }
36
37 }

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

1)告知浏览器文件的类型:response.setContentType(文件的MIME类型);

2)告示浏览器文件的打开方式是下载:

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

但是,如果下载中文文件,页面在下载时会出现中文乱码或不能显示文件名的情况,     原因是不同的浏览器默认对下载文件的编码方式不同,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的值

案例代码实现:

1. 下载页面

 1 <!DOCTYPE html>
 2 <html>
 3   <head>
 4   <meta charset="UTF-8">
 5     <title>文件下载</title>
 6
 7   </head>
 8
 9   <body align="center">
10       <h1>使用a标签直接访问服务器资源</h1>
11     <a href="download/a.jpg">a.jpg</a><br>
12     <a href="download/a.flv">a.flv</a><br>
13     <a href="download/a.mp3">a.mp3</a><br>
14     <a href="download/a.mp4">a.mp4</a><br>
15     <a href="download/a.txt">a.txt</a><br>
16     <a href="download/a.zip">a.zip</a><br>
17     <h1>使用服务器编码的方式实现文件下载</h1>
18     <a href="/WEB08/downloadServlet2?filename=a.jpg">a.jpg</a><br>
19     <a href="/WEB08/downloadServlet2?filename=a.flv">a.flv</a><br>
20     <a href="/WEB08/downloadServlet2?filename=a.mp3">a.mp3</a><br>
21     <a href="/WEB08/downloadServlet2?filename=a.mp4">a.mp4</a><br>
22     <a href="/WEB08/downloadServlet2?filename=a.txt">a.txt</a><br>
23     <a href="/WEB08/downloadServlet2?filename=a.zip">a.zip</a><br>
24     <a href="/WEB08/downloadServlet2?filename=美女.jpg">美女.jpg</a><br>
25
26
27   </body>
28 </html>

2. DownloadServlet2  虚拟路径配置为:/downloadServlet2

 1 /**
 2  * 文件下载案例 解决文件名中文乱码问题
 3  *
 4  * @author vanguard
 5  *
 6  */
 7 public class DownloadServlet2 extends HttpServlet {
 8
 9     public void doGet(HttpServletRequest request, HttpServletResponse response)
10             throws ServletException, IOException {
11         // 1. 获取要下载的文件名
12         String filename = request.getParameter("filename"); // ????.jpg
13         // 解决获得中文参数的乱码问题
14         filename = new String(filename.getBytes("ISO8859-1"), "UTF-8");// 美女.jpg
15
16         //解决页面在下载时出现中文乱码或者不能显示的情况
17         String agent = request.getHeader("User-Agent");
18         String filenameEncode = "";
19         if (agent.contains("MSIE")) {
20             // IE浏览器
21             filenameEncode = URLEncoder.encode(filename, "utf-8");
22             filenameEncode = filenameEncode.replace("+", " ");
23         } else if (agent.contains("Firefox")) {
24             // 火狐浏览器
25             BASE64Encoder base64Encoder = new BASE64Encoder();
26             filenameEncode = "=?utf-8?B?"
27                     + base64Encoder.encode(filename.getBytes("utf-8")) + "?=";
28         } else {
29             // 其它浏览器
30             filenameEncode = URLEncoder.encode(filename, "utf-8");
31         }
32
33         // 2. 告知浏览器文件的类型,告示浏览器文件的打开方式为下载
34         response.setContentType(getServletContext().getMimeType(filename));
35         response.setHeader("Content-Disposition", "attachment;filename="
36                 + filenameEncode);
37
38         // 3. 根据文件名获取文件的完整路径
39         String filePath = this.getServletContext().getRealPath(
40                 "download/" + filename);
41         // 4. 文件输入流,读取该文件
42         FileInputStream in = new FileInputStream(filePath);
43         // 5. 获取字节流
44         ServletOutputStream out = response.getOutputStream();
45         int len = 0;
46         byte[] buf = new byte[1024];
47         // 6. 读取文件写入到response缓冲区中
48         while (-1 != (len = in.read(buf))) {
49             out.write(buf, 0, len);
50         }
51         // 关闭流
52         in.close();
53
54     }
55
56     public void doPost(HttpServletRequest request, HttpServletResponse response)
57             throws ServletException, IOException {
58         doGet(request, response);
59
60     }
61
62 }

response细节点:

1)    response获得的流不需要手动关闭,Tomcat容器会帮我们自动关闭

2)    getWriter()和getOutputStream不能同时调用

时间: 2024-10-22 14:43:50

JavaWeb的学习--Response的相关文章

JavaWeb基础学习体系与学习思路

对于JAVAWEB的学习,首先一定要明确的是学习整体框架和思路,要有一个把控.对于WEB,很多人认为是做网页,简单的把静态网页与JAVAWEB与网页设计一概而论. 拿起一本JS就开始无脑的学习,学了一会儿就不知所云.那么,我们应该怎么来学习呢? 我认为,对于JAVAWEB的学习,主要分为三部分,前端,服务器,数据库. 首先,前端的内容为HTML+CSS+JAVASCRIPT,这三部分为前端的主要内容. 将前端比作一个人的话,HTML做骨架,CSS做外表,JAVASCRIPT控制人的行为. 而前期

JAVAweb例程学习源码分享,超级全!

JAVAweb例程学习源码分享,超级全!我自己也从里面学习到了很多东西! 1.BBS论坛系统(jsp+sql)2.ERP管理系统(jsp+servlet)3.OA办公自动化管理系统(Struts1.2+Hibernate3.0+Spring2+DWR)4.博客系统(struts+hibernate+spring)5.车辆管理系统(struts+hibernate+spring+oracle)6.家庭理财系统(java+applet)7.教材订购系统(jsp+servlet+mysql)8.酒店管

基于CentOS7上的搭建javaweb环境 - 学习笔记

一, 概述 上一篇记录了安装CentOS7的基本步骤及配置,现在要讲如何搭建基于CentOS7环境的javaweb环境了,我以 mysql + jdk1.8.0_91 + apache tomcat7.0.69 为例进行讲述. 二, 安装步骤 1, 首先在CentOS7下在线安装mysql数据库服务 (1)先查看是否已安装了mysql rpm -qa | grep mysql (2)若安装了,可以卸载,再重新安装 yum -y remove mysqlxxxxx (3)安装 yum -y ins

JavaWeb基础: 学习大纲

JavaWeb基础: Web应用和Web服务器 JavaWeb基础: Tomcat JavaWeb基础:HTTP协议和基于Restful的架构 JavaWeb基础: Web工程配置文件 JavaWeb基础:Servlet JavaWeb基础:Servlet Request JavaWeb基础:Servlet Response JavaWeb基础: Cookie

JavaWeb开发学习(一)-JavaWeb开发概述

1.Web相关概念 Web程序也就是一般所说的网站,由服务器.客户端浏览器以及网络组成.Web程序的好处是使用简单,不需要安装.学习,有一台电脑.一根网线就可以使用.Web程序不是一般意义上的网站.网站的目的是提供信息服务,重在内容,程序往往比较简单.但一个Web程序往往比较复杂,背后结合数据库等技术. 按照是否需要访问网络,程序可分为网络程序和非网络程序.其中网络程序又分为B/S和C/S结构.C/S是指客户端(Client)/服务器(Server)模式.这种模式的客户端需要安装一个桌面程序.桌

JavaWeb核心技术学习

学习一门技术的最快的方式就是亲自实现此技术. 本博客将带领大家一步一步实现JavaWeb的核心技术. 作者:java1to3链接:http://www.cnblogs.com/java1to3/著作权归作者所有.未经作者本人同意,禁止一切转载.商业或非商业转载请联系作者获得授权并请注明出处.

Javaweb开发学习路线及Java三大框架

Java web开发是什么? Java web开发,是用Java技术来解决相关web互联网领域的技术总和.web包括:web服务器和web客户端两部分.Java在客户端的应用有java applet,不过使用得很少,Java在服务器端的应用非常的丰富,比如Servlet,JSP和第三方框架等等.Java技术对Web领域的发展注入了强大的动力. Java web 开发 Java web开发学习路线 一:入门阶段 学习目标:Java程序员 1: 熟悉jdk,jvm,eclipse,安装于配置jdk

CentOS7的安装及部署javaweb项目 - 学习笔记

一, 概述: 这两天在捣鼓linux的东西,安装及配置网络环境,共享设置,以及安装jdk , tomcat环境,并将自己开发的javaweb系统部署到上述环境中.经过周末熬到深夜,终于搞掂,现在整理一下笔记,分享出来,以后也可以回顾. 二, 安装CentOS7: 我这里是基于VirtualBox的安装,安装的是无桌面版本CentOS 1, 下载virtualbox并安装 此处省略100字.... 2, 下载CentOS最小安装版本 官网: https://www.centos.org/downl

JavaWeb的学习--Http协议和Tomcat服务器

一.Http协议 1.什么是Http协议 HTTP,超文本传输协议(HyperText Transfer Protocol)是互联网上应用最为广泛的    一种网络协议.所有的WWW文件都必须遵守这个标准.设计HTTP最初的目的是为  了提供一种发布和接收HTML页面的方法 2.Http协议的组成 Http协议由Http请求和Http响应组成,当在浏览器中输入网址访问某个网站时,    你的浏览器会将你的请求封装成一个Http请求发送给服务器站点,服务器接收到请    求后会组织响应数据封装成一