前言
本篇博客主要说明的是关于服务器响应数据发送到客户端用到的response对象。首先会从http的响应消息说起,然后就是response对象;最后是ServletContext对象。
一、Http的响应消息
响应消息指的是服务器发送数据给客户端。在http的响应消息中,主要分为四个部分。和请求头还是比较对应的上的。
响应行:格式->http/1.1 200 ok -> 协议名称/版本1 状态码 状态码描述
对于状态码,根据开头即可以猜到它的功能:
1xx:这种是服务器问客户端你的数据发送完成了么?
2xx:代表发送成功;
3xx:主要看两个比较经常使用的。
302:代表重定向,使用setStute可以设置。但是重定向有更好的方法;
304:代表本地缓存,可以减小服务器压力;
4xx:代表客户端出现了错误。
404:访问的资源路径出错;
405:访问的方式没有对应的方法,比如我的<form>标签action为post,但是我没写doPost就会出现405错误。
500:代表服务器端出现错误,通常是
响应头:
格式:头名称:值
比较典型的几个响应头:
Content-Type:一般这里面的写的是:"text/html;charset=utf-8";text/html代表响应消息的格式Mime是text/html;charset=utf-8代表将浏览器解码方式设置为utf-8;服务器告诉客户端本次响应体数据格式以及编码格式
Content-disposition:两个参数:
in-line:默认值,代表直接解析;
attachment,filename=xxx:设置为这个之后,内容将会以附件的形式打开,也就是有一个下载提示框提示你下载;
响应空行:分隔响应头与响应体
响应体:响应体中可以包含很多标签元素,他就是服务器传过来的数据;
二、response对象
1.功能
response的功能主要就是设置响应消息。在此处提到的响应消息一看就懂了吧。不算响应空行,有三种消息需要设置。
1.响应行
HTTP/1.1 200 OK
一看响应头就只能设置状态码:setStatu(int num);
2.响应头
Content-Type: text/html;charset=UTF-8
Content-Length: 101
Date: Wed, 06 Jun 2018 07:08:42 GMT
一般来说,响应头就长这样,在响应头中,设置的方法时
resp.setHeader(String name,String value),name就是上面那三个,value就自己看着办吧。
3.响应体
设置响应体,就需要使用输入输出流了。步骤:
1.获取输出流对象;
字符输出流:PrintWriter getWriter()
字节输出流:ServletOutputStream getOutputStream()
2.输出数据;
int len = 0;Byte[] bytes = new Byte[1024];while((...)){pw.write(bytes,0.len);}
上面这一行纯粹是属于不知道怎么删除这个代码段才写的。
2.几个案例以及补充内容
1.重定向
正常来说,重定向就是客户端请求数据,服务器没有;服务器跟你说哪个url有发给你,然后客户端再去找。需要进行的操作有,设置状态码为302,发送目标url给你。但是有一个重定向的方法;
response.sendRedirect("/day15/responseDemo2");
单词不会写,是复制过来的,但是就是这个意思。
这里面提一下关于重定向与转发的区别;
转发(forward):1.地址栏的url不会发生变化;2.他是一次请求;3.只能访问当前服务器的资源;
重定向(rederic):1.地址栏的url会发生变化,并且是人家告诉你的;2.两次请求;(不能通过request共享数据)3。能访问别的服务器上的数据,只要你敢给网址;
然后提一下文件路径的写法:分为绝对路径和相对路径,一般来说推荐写绝对路径。
绝对路径:能获得唯一资源。如:http://localhost/day15/responseDemo2 /day15/responseDemo2;
规则:看清楚是给谁用的:如果是服务器内部自己使用的,那么就是/a.txt,不需要添加虚拟目录;如果是传给客户端的,那么就需要加上虚拟目录:/day16/a.txt;使用虚拟目录的话,别给写死了,使用request.getContextPath()动态获取虚拟目录。
相对路径:通过相对路径,不一定能获取到唯一资源;
一般使用.开头:./代表当前目录下;../代表上一级目录,因此需要分辨出来目录结构比较复杂。
2.服务器发送字节流到客户端
这个案例比较简单,就不分析了。但是在这里面需要补充一些关于乱码的问题。
resp.setContentType("text/html';charset=utf-8");相当于setheader();
3.写验证码
验证码写出来不难,但是也没必要记住。
三、ServletContext对象
1.概念
ServletContext,代表整个web应用,与服务器程序(Tomcat)之间进行通信。他的概念很大的,就算是共享数据都是全部都能获取。
2.获取
1.通过request获取:request.getServletContext();
2.通过HttpServlet获取:this.getServletContext();
3.功能
1.获取MIME格式:mime格式:text/html;大格式/小格式;-> String getMimeType(String file);
2.共享数据:这个共享数据就很厉害,大于一次请求,也大于一次会话,他是全部,卡密。
3.获取文件的真实路径
1.直接在web目录下的,就是直接:/day16/a.txt;2.WEB-INF下的文件,就是:/day16/WEB-INF/b.txt;3.在src下的文件,使用:/day16/WEB-INF/c.txt;
四.案例分析
1.将文件以附件形式打开
1.设置响应头的 content-disposition = attachment;filename=xxx就好了;
2.创建一个.jsp文件,用超链接绑定一下,传递资源路径与文件名称;
3.获取请求的消息,拿到filename,然后获取mime类型;
4.将对应的图片加载进输入流,然后输出。
5。可能会出现提示框乱码问题,这里使用人家一个工具修正就好。
总结
对于最后那个案例,我竟然看起来比较陌生了。让我现在在做一次的话,我绝对会忘记设计mime类型的。然后兼容中文我可能也不会。对于这个寒假的java学习,就到此为止吧。目前的进度是cookie与session做完了。他们俩是会话技术。还是比较麻烦的。可能需要在仔细看看。然后开学之后,从JSP开始,EL也要重新看。对于JSTL,我突然忘记路径咋写的。待会就看一下视频。然后是明天写论文,就是看剩下那一片论文然后照着写出来实验部分以及结论部分。