Response对象

1.Request/Response生命周期

每次服务端获取来自客户端的请求后,解析http请求部分,将http请求部分封装到HttpServletRequest对象中,同时创建HttpServletResponse对象,之后在服务端完成本次响应后,服务端回收出刚刚创建的Request,Response对象,下次请求到达服务端后,会分配新的HttpServletRequest/HttpServletResponse对象

2.HttpServletResponse对象的作用

既然HttpServletResponse代表从服务端到客户端响应这个过程,而且结合协议我们知道
HTTP协议响应包含三大块内容,分别是响应行,响应头,响应体.

HttpServletResponse可以控制响应部分的三个部分

3.测试Response控制响应行

Response对象_第1张图片
Response对象_第2张图片

4.测试Response控制响应头

Response对象_第3张图片
Response对象_第4张图片
测试重定向
Response对象_第5张图片
Response对象_第6张图片
可以用一句话搞定: response.sendRedrect(”路径”),效果等同于上面

重定向和定时刷新
Response对象_第7张图片

5.测试response控制响应体

此处主要讲通过response获取的两种流

  • response.getOutputStream():字节输出流
  • response.getWriter():字符输出流

1.测试字符输出流
在这里插入图片描述
Response对象_第8张图片

2.字节输出流
(1)在webContent根目录下,新增config文件夹,并将事先准备的图片放入
Response对象_第9张图片
(2)通过输入流读取图片文件,并通过输出流输出到客户端
Response对象_第10张图片
Response对象_第11张图片
局限性:
通过这种方式向客户端发送文件是存在局限性的,因为很多文件类型客户端是打不开的(例如:.doc,.zip…)
怎么判断客户端能打开哪些文件呢?___很简单直接将文件拉进浏览器中

所以我们更多的是通过下载的方式,来将文件传送到客户端(后面有讲)

注意点:
1.String realPath = getServletContext().getRealPath(“config/lufei.png”);实质上是通过getRealPath方法获取根目录路径,之后再拼接上config/lufei.png,并不关注文件是否存在
在这里插入图片描述
2.getRealPath获取的根目录是指webcontent,而非src
3.在初始化FileInputStream时,如果找不到这个文件,会报异常,所以一般有两种解决方法
Response对象_第12张图片

  • 方式1:如上图,直接抛异常,在异常中处理Response对象_第13张图片
  • 方式2:对file文件进行判断,存在再进行io操作
    Response对象_第14张图片
    4.两种流是互斥的,最终传给客户端的只能是其中一种

6.实现文件下载案例

1.搭建环境

1.建立WEB项目

2.在WebContent___>WEB-INF___>建立download目录

3.将准备好的”1.doc,1.rar,1.txt,哈哈.txt”等文件放入目录download下
ps:WEB-INF目录下的资源是受保护的

例如:WebContent__config目录下,放入png文件,此资源可直接访问(除图片外的其他类型文件,比如.txt,.doc直接访问报404错误)
Response对象_第15张图片
Response对象_第16张图片
而在WEB-INF目录下的资源是无法直接访问的
Response对象_第17张图片
所以我们通过servlet来实现下载功能

4.新增index.html

男士穿搭.docx
lufei.png
ss.rar
statement的批量导入.txt

用户输入网址http://localhost:8081/web_day03/
请求项目下的页面index.html,为什么不输入index.html也可以获取到?
原因:在web.xml中中会顺序寻找文件,全都找不到报404
Response对象_第18张图片
原理分析
Response对象_第19张图片
实现步骤
Response对象_第20张图片
此处我们使用了IOUtils工具类,这个类是commons-io-1.4.jar包中的,apache提供了commons包,这个包有非常多实用的工具类

问题1:中文乱码问题
为什么lufei.png和ss.rar弹出另存为框,但是男士穿搭.docx和statment的批量导入.txt却报500错误

原因很简单,我们将从request中获取的fileName打印出来,发现当我们请求的中文名资源是,输出的是乱码
在这里插入图片描述
产生原因:
Post,Get请求乱码的原因和解决方案

解决WEB乱码问题

eclipse软件设置好UTF-8
Mysql安装时选择UTF8
保证页面部分采用UTF8编码

2.通过表单向服务端提交数据

  • GET方式中文乱码问题: 手动转码
  • POST方式中文乱码问题:
    request.setCharacterEncoding(“utf-8”);

问题:请求时中文乱码问题解决了,这会又出现了一个问题
当我们点击“男士穿搭.docx”和“statement的批量导入.txt”进行下载时,发现弹出框文件有乱码情况
在这里插入图片描述
Response对象_第21张图片
3.如果是下载文件时,另存为弹出文件有乱码,利用工具类设置

因为从服务器向浏览器发送中文时,需要对内容进行URL编码。

  • 大部分浏览器使用如下方式即可解决乱码问题:URLEncoder.encode(fileName, “utf-8”);
  • 但是火狐默认以Base64来解码的,所以要为火狐单独处理

DownLoadUtils.setConentType(request, fName, response,getServletContext());
希望另存为文件的名称fName传递到函数中
对fName进行转码,转码之后是乱码没有关系,此时的乱码是让浏览器识别的
设置了本次响应内容类型

4_服务端向客户端响应中文乱码
response.setContentType(“text/html;charset=utf-8”);

总结:
上述代码的目的:
1_通过利用response的字节输出流向客户端输出字节数据来实现下载的原理
2_明确程序的执行流程
3_利用response控制消息头content-disposition实现浏览器弹出另存为对话框
4_利用response控制本次响应内容类型.验证了ServletContext的作用4
5_解决WEB中遇到的常见的乱码问题

你可能感兴趣的:(servlet)