Http响应分析
// 响应行
HTTP/1.1 304 Not Modified
// 响应头
Server: Apache-Coyote/1.1
ETag: W/"2135-1510378989337"
Date: Mon, 13 Nov 2017 02:08:40 GMT
// 一个空行
// 实体内容
this is hello servlet
响应行分析
HTTP/1.1 304 Not modified
HTTP/1.1 : 代表http的协议版本
304 : 叫做状态码,代表服务器处理请求的结果(状态) ,详细情况见状态码类型图
常见的状态码:
200: 请求处理完成并完美返回
302: 请求需要进一步细化
404: 客户访问的资源找不到
500: 服务器的资源方发送错误(服务器内部错误)
Not modified: 状态描述(就是状态码的描述信息)
200: 状态码为200时,描述信息是"OK"
304: 同理,304为Notmodified
常见响应头
请求与相应的流程
- 浏览器发送请求信息到服务器.
- tomcat收到请求信息,并把request信息封装进HttpServletRequest中,把相应信息封装在HttpServletResponse中.
- tomcat调用doGet或doPost方法,并将HttpServletRequest、HttpServletResponse作为参数存入方法中.供调用者获取、修改数据
修改响应行信息
response.setStatus(404): // 修改状态码
response.sendError(404): // 发送404错误码 + 404错误页面信息
修改响应头信息
response.setHeader("server","JBoss"); // 修改响应头信息
修改实体内容
浏览器直接能够看到的内容就是实体内容
response.getWrite().write(String str); // 这个方法发送的是字符内容
response.getOutputStream().write("hello world".getBytes); // 这个方法发送的是字节内容
案例实现
案例一
需求 : 跳转到adv.html
需求实现 : 发送一个302状态码 + location的响应头
response.setStatus(302); // 发送302状态码
response.setHeader("location" , "/response/adv.html"); // 发送location响应头
------------------------------------------------------------------------
response.sendRedirect("/response/adv.html"); // 简化写法,等价于上面两句的总和
请求重定向一共会向服务器发送2次请求,地址栏会显示第二次请求的地址
案例二
需求 : 定时刷新
需求实现: 使用refresh请求头
response.setHeader("refresh"."1"); // 每隔一秒刷新一次页面
需求: 3秒钟后跳转到adv.html页面
需求实现:使用refresh请求头
response.setHeader("refresh","3;(分号) url = /response/adv.html");
案例三
Content-Type响应头作用分析
Content-Type : text/html; charset=GB2312 // Content-Type 响应头格式
// 这个请求头的作用是:表示服务器发送给浏览器的数据类型以及内容编码
response.setHeader("content-type","text/html"); // 设置内容类型请求头
response.setContentType("text/html"); // 和上面方法等价,推荐使用此方法
发送文字
response.setContentType("text/html");
response.getWrite().write("this is title this is body"); // 发送字符类型的html数据
发送图片
response.setContentType("image/jpg"); // 发送图片类型
// 将图片读进内存
File file = new File("e:/mm.jpg");'
FileInputStream in = new FileInputStream(file);
// 边读边写
byte[ ] buf = new byte[ ];
int len = 0;
while((len = in.read(buf)) != -1){
// 把图片的内容输入到浏览器中
response.getOutputSteam().write(buf, 0, len);
}
可使用的类型可在Tomcat安装目录中的conf-->web.xml文件中查看,
jpg // 解析形式(文件的后缀名)
image/jpg // 类型写法
当类型输入错误时,弹出下图中的提示框
案例四
需求: 下载图片
需求实现: 使用Content-Disponsition响应头
// Content-Disposition:attachment; filename=aaa.zip
// zai
response.setContentType("image/jpg"); // 发送图片类型
// 以下载方式打开图片
**response.setHeader("Content-Disposition", "attachment; filename=aaa.zip");**
// 将图片读进内存
File file = new File("e:/mm.jpg");'
FileInputStream in = new FileInputStream(file);
// 边读边写
byte[ ] buf = new byte[ ];
int len = 0;
while((len = in.read(buf)) != -1){
// 把图片的内容输入到浏览器中
response.getOutputSteam().write(buf, 0, len);
}
response.setContentType("text/html;charset=utf-8"):
完美解决编码问题:
在每个Servlet的开头加入:
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");