Http响应分析之HTTPServletResponse

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
Http响应分析之HTTPServletResponse_第1张图片
状态码类型.png

常见响应头

Http响应分析之HTTPServletResponse_第2张图片
常见的响应头

请求与相应的流程

  1. 浏览器发送请求信息到服务器.
  2. tomcat收到请求信息,并把request信息封装进HttpServletRequest中,把相应信息封装在HttpServletResponse中.
  3. 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次请求,地址栏会显示第二次请求的地址

Http响应分析之HTTPServletResponse_第3张图片
请求重定向

案例二

需求 : 定时刷新
需求实现: 使用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 titlethis 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    // 类型写法

当类型输入错误时,弹出下图中的提示框

Http响应分析之HTTPServletResponse_第4张图片
ContentType输入的类型无法识别时,弹出次框
案例四

需求: 下载图片
需求实现: 使用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");

你可能感兴趣的:(Http响应分析之HTTPServletResponse)