Response响应
#2020云栖大会#阿里云海量offer来啦!投简历、赢阿里云限量礼品及阿里云ACA认证免费考试资格!>>>
Response
IT那个小笔记
response响应过程
设置响应信息
小练习
response响应过程

在去发送一个请求时,先会找到主机服务器再找到对应的Service,找到Servoce对应的引擎
引擎会找到对应的web应用,并且会创建request对象和response对象
找到应用后, 会执行应用的web.xml再去根据url-patten的内容创建Servlet对象
并且会调用Servlet对象的service方法,并且把创建的request对象和response对象传入到方法当中
拿到response对象后, 自己可以往响应当中写入一些自己给客户端的内容
通过response.getwrite().wirte("写的内容")方法进行写入,写的内容,是存到一个response缓冲区当中
当方法执行结束之后, tomcat就会从response缓冲区当中取出数据,取出你的数据同时,它自己还会自动的往里面添加一些服务器相关的信息进去
所以响应给浏览器时, 可以看到除了自己写的内容, 还会有一些服务器相关的信息
设置响应信息
设置响应行
-
响应行显示协议版本和状态码通过setStatus(int i)进行设置
response.setStatus(230);
设置相应头
add代表添加新的内容
addHeader(String name,String value)
addIntHeader(String name,int value)
-
addDateHeader(String name,date)
Date date = new Date();response.addHeader("head1", "hhhh");response.addIntHeader("head2", 111);response.addDateHeader("head3", date.getTime());
set代表设置,已经存在的内容
setHeader(String name,String value)
setIntHeader(String name,int value)
-
setDateHeader(String name,Date value)
Date date = new Date();response.addHeader("head1", "hhhh");response.addIntHeader("head2", 111);response.addDateHeader("head3", date.getTime());response.setHeader("head1","gggg");response.setIntHeader("head2",222);response.addHeader("head1", "jjjj");
重定向
什么是重定向
到服务器当中去找servlet1
servlet1当中没有这个资源,告诉你去找servlet2
再去发送一个请求到servlet2
特点
要访问两次服务器(一次人为访问,一次重定向)
浏览器地址栏地址切换到另外一个地址
设置重定向
状态码设为302:response.setState(302);
设置重定向地址:response.setHeader("location","地址");
定时重定向:response.setHeader("refresh","5;url=地址")
还可以通过sendRedirect("地址")方法来设置重定向地址
给响应头location设置值的过程就被封装在这个方法中
比原先也就少写一个词
response.sendRedirect("地址")
设置响应体
/* 通过write方法来设置响应体 */response.getWriter().write("哈哈哈哈");

但是结果出现乱码
这是因为把写的内容存到缓存区中使用的是ISO8859
ISO8859不支持中文,所以会乱码
/* 在存之前设置可以设置含中文的编码 */response.setCharacterEncoding("UTF-8");/* 并且还要让浏览器的显示编码也设为同样的编码 */response.setHeader("Content-Type", "text/html;charset=UTF-8");
实际上可以只写第二条,当设置浏览器使用的编码后,服务器内部的处理(写的内容存到缓冲区的过程)也就会使用这个编码
和上面设置重定向地址就是给location设值一样,它也有一个封装方法来给Content-Type设置值
response.setContentType("text/html;charset=UTF-8");
上面是写一条字符串,如果是写一个文本文件
response.setHeader("Content-Type", "text/html;charset=UTF-8");FileInputStream in = new FileInputStream(this.getServletContext().getRealPath("file.txt"));InputStreamReader reader = new InputStreamReader(in);char[] buffer = new char[10];int len = 0;while((len = reader.read(buffer))>0) {response.getWriter().write(buffer,0,len);}/*将输入字节流转成字符流避免汉字按字节读出现不完整read方法一次读10个放入数组将每次的数组写出若没有内容可读即len = -1则出循环*/
小练习:下载文件
需求: 将服务器中的文件下载到电脑当中如果直接用<a>标签或者<form>表单去访问文件,浏览器能解析的文件就会直接打开。视频文件会直接播放,图片或文本直接打开而不是下载
因此需要一些步骤,即需要写java代码也就是用Servlet
1.通过发送一个Servlet请求,把文件名发送给服务器
2.接收到文件名参数,获取文件的绝对地址
3.通过流的形式来去写到浏览器
4.并且要告诉文件是什么类型 (浏览器是以MIME的类型来识别类型)
5.再设置响应的类型
6.设置响应头,让浏览器不是解析而是以附件形式保存下来
public class DownLoad extends HttpServlet {@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {/* 获取链接传入的参数 */String name = request.getParameter("filename");/* 通过名字获取它是什么文件格式 */String mimeType = this.getServletContext().getMimeType(name);/* 获取后把这个格式设置上去,否则下载的文件没有格式 */response.setContentType(mimeType);/* 对参数处理的编码默认是ISO8859-1因此如果是中文,name会得到乱码将其再之前的编码转回二进制流再转成字符串用含中文的编码方式*/byte[] b = name.getBytes("ISO8859-1");name = new String(b,"UTF-8");/* 浏览器去读取文件名是中文的话也会出现问题但不同的浏览器编码不同先获取客服端信息,看是什么浏览器*/String agent = request.getHeader("User-Agent");// 定义一个变量记录编码之后的名字String filenameEncoder = "";if (agent.contains("MSIE")) {// IE编码filenameEncoder = URLEncoder.encode(name, "utf-8");filenameEncoder = filenameEncoder.replace("+", " ");} else if (agent.contains("Firefox")) {// 火狐编码BASE64Encoder base64Encoder = new BASE64Encoder();filenameEncoder = "=?utf-8?B?" + base64Encoder.encode(name.getBytes("utf-8")) + "?=";} else {// 浏览器编码filenameEncoder = URLEncoder.encode(name, "utf-8");}// 设置以附件形式下载,并且下载的文件名是上面处理后的response.setHeader("content-disposition", "attachment;filename="+filenameEncoder);String path = this.getServletContext().getRealPath(name);InputStream in = new FileInputStream(path);ServletOutputStream out = response.getOutputStream();byte[] buffer = new byte[1024];int len = 0;while((len = in.read(buffer))>0) {out.write(buffer, 0, len);}in.close();}}
注意: 最好用7版本的tomcat,新的一些版本8,9根本无法传入中文参数。 更别谈后面对中文参数的处理了
勤学如春起之苗,不见其增,只有所长。辍学如磨刀之石,不见其增,日有所亏
本文分享自微信公众号 - IT那个小笔记(qq1839646816)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

浙公网安备 33010602011771号