HTTP响应消息&response对象&ServletContext对象

30 篇文章 0 订阅
22 篇文章 0 订阅

HTTP响应消息&response对象&ServletContext对象

HTTP响应消息

概念

  • 响应消息:服务器端发送给客户端的数据

    • 数据格式:

      1. 响应行:
        1. 组成:协议/版本 响应状态码 状态码的描述
        2. 响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态
          1. 状态码都是3位数字
          2. 分类:
            1. 1xx:服务器接收客户端消息,但是没有接收完成,等待一段时间后,发送1xx多状态码
            2. 2xx:成功。代表200
            3. 3xx:重定向。代表:302(重定向),304访问缓存
            4. 4xx:客户端错误。
              • 代表:
                • 404(请求路径没有对应的资源)
                • 405:请求方式没有对应的doGet方法
            5. 5xx:服务器端错误
              • 代表:500(服务器内部出现异常)
      2. 响应头:
        1. 格式:头名称:值
        2. 常见的响应头:
          1. Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
          2. Content-disposition:服务器告诉客户端以什么格式打开相应体数据
            • 值:
              • in-line:默认值,在当前页面内打开
              • attachment;filename=xxx:以附件形式打开响应体。文件下载
      3. 响应空行
      4. 响应体:传输的数据
    • 响应字符串格式:

      HTTP/1.1 200 OK
      Content-Type: text/html;charset=UTF-8
      Content-Length: 90
      Date: Thu, 23 Dec 2021 06:31:23 GMT
      Keep-Alive: timeout=20
      Connection: keep-alive
      
      
      
      <html>
        <head>
          <title>$Title$</title>
        </head>
        <body>
        $END$
        </body>
      </html>
      
      

Response对象

  • 功能:设置相应消息

    1. 设置响应行
      1. 格式:HTTP/1.1 200 OK
      2. 设置状态吗:setStatus(int sc)
    2. 设置相应头:setHeader(String name,String value)
    3. 设置响应体:
      • 使用步骤:
        1. 获取输出流
          • 字符输出流:只能输出字符数据 PrintWriter getWriter()
          • 字节输出流:可输出任意数据 ServletOutputStream getOutputStream()
        2. 使用输出流,将数据输出到客户端浏览器
  • 案例:

    1. 完成重定向

      1. 重定向:资源跳转方式

      2. 代码实现

        //1. 设置状态吗为302
        //        resp.setStatus(302);
        //        //2.设置响应头location
        //        resp.setHeader("location","/day15/rd2");
        
        //简单的重定向方法
        resp.sendRedirect("/day15/rd2");
        
      3. 重定向的特点:redirect

        1. 地址栏发生变化
        2. 重定向可以访问其它站点(服务器)的资源
        3. 重定向是两次请求,不能使用request对象来共享数据
      4. 转发的特点

        1. 转发地址栏路径不变
        2. 转发只能访问当前服务器下的资源
        3. 转发是一次请求
      5. 路径写法:

        1. 路径分类
          1. 相对路径:通过相对路径不可以确定唯一资源
            • 如:。/index.html
            • 不以/开头,以“.”开头路径
            • 规则:确定访问的当前资源和目标资源直径的相对位置关系
          2. 绝对路径:通过绝对路径可以确定唯一资源
            • 如:http://localhost/day15/rd2 /day15/rd2
            • 以/开头的路径
            • 规则:判断定义的路径是给谁用的
              • 给客户端浏览器使用:需要加虚拟目录(项目的访问路径)
                • 建议虚拟目录动态获取:request.getContextPath();
                • <a>,<from>重定向。。。
              • 给服务器使用:不需要加虚拟目录
                • 转发路径
    2. 服务器输出字符数据到浏览器

      • 步骤:

        1. 获取字符输出流
        2. 输出数据
      • 注意:

        • 乱码问题:

          1. 告诉浏览器响应体使用的编码

          2. 在获取流之前设置!!!

          3. //简单的形式,设置编码,获取流的默认编码是ISO-8859-1,是在获取流之前设置!!!
            resp.setContentType("text/html;charset=utf-8");
            
    3. 服务器输出字节数据到浏览器

      • 步骤:
        1. 获取字节输出流
        2. 输出数据
    4. 验证码(案例):

      1. 本质:图片

      2. 目的:防止恶意

        <!DOCTYPE html>
        <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>Title</title>
            <script>
                /**
                 * 点击超链接或者图片,需要换一张
                 * 1. 给超链接和图片绑定单击事件
                 * 2.重新设置图片的src属性值
                 */
                window.onload=function (){
                    //1.获取图片对象
                    var img = document.getElementById("checkCode");
                    img.onclick=changeccs
                    var btn = document.getElementById("change");
                    btn.onclick=changeccs
        
                    function changeccs (){
                        //加时间戳
                        alert("改");
                        var data = new Date().getTime();
                        img.src="ccs?"+data;
                    }
        
                }
            </script>
        
        </head>
        <body>
            <img id="checkCode" src="ccs"/>
            <a id="change" href="#">看不清换一张</a>
        </body>
        </html>
        

ServletContext对象

概念:

  1. 代表整个web应用,可以和程序的容器(服务器)来通信
  2. 获取:
    1. 通过request对象获取
      • request。getServletContext();
    2. 通过HTTPServlet获取
      • this.getDervletContext();
  3. 功能:
    1. 获取MIME类型:
      • MIME类型:在互联网通信过程中定义的一种文件数据类型
        • 格式:大类型/小类型 text/html imge/jpeg
      • 获取:String getMimeType(String file);
    2. 域对象:共享数据
      1. setAttribute(String name,Object value);
      2. getAttribute(String name);
      3. removeAttribute(String name);
      4. ServletContext对象范围:所有用户所有请求的数据
    3. 获取文件的真实路径(服务器路径)
      1. 方法:String getRealPath(String path);

案例:

  • 文件下载需求:

    1. 页面显示超链接
    2. 点击超链接后弹出下载提示框
    3. 完成图片文件下载
  • 分析:

    1. 超链接指向的资源如果能够被浏览器解析,则在浏览器中展示,如果不能解析,则弹出下载提示框。不满足需求
    2. 任何资源都必须弹出下载提示框
      • content-disposition:attachment;filename=xxx
  • 步骤:

    1. 定义页面,编辑超链接href属性,指向Servlet,传递资源名称filename

    2. 定义Servlet

      1. 获取文件名称
      2. 使用字节输入流加载文件进内存
      3. 指定response的响应头:content-disposition:attachment;filename=xxx
      4. 将数据写出到response输出流
    3. java部分code,DownloadServletDemo1.java

      package cn.web.download;
      
      import javax.servlet.*;
      import javax.servlet.http.*;
      import javax.servlet.annotation.*;
      import java.io.FileInputStream;
      import java.io.IOException;
      
      @WebServlet("/dld1")
      public class DownloadServletDemo1 extends HttpServlet {
          @Override
          protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              this.doPost(request,response);
          }
      
          @Override
          protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
              //1.获取请求参数,文件名称
              String filename = request.getParameter("filename");
              //2.使用字节输入流加载文件进内存
              //2.1找打文件服务器路径
              ServletContext servletContext = this.getServletContext();//获取对象
              String realPath = servletContext.getRealPath("/img/" + filename);
              //2.2用字节流关联、
              FileInputStream fileInputStream = new FileInputStream(realPath);
              //3.设置response的响应头
              //3.1设置响应头类型:content-type
              String mimeType = servletContext.getMimeType(filename);//获取文件mime类型
              response.setHeader("content-type",mimeType);
              //3.2设置相应头打开方式:content
              response.setHeader("content-disposition","attachment;filename="+filename);
              //4.将输入流数据写出到输出流中
              ServletOutputStream outputStream = response.getOutputStream();
              byte[] buff = new byte[1024*8];
              int len = 0;
              while ((fileInputStream.read(buff)!= -1)){
                  outputStream.write(buff,0,len);
              }
              fileInputStream.close();
          }
      }
      
      
    4. html部分code,download.html

      <!DOCTYPE html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Title</title>
      </head>
      <body>
      <a href="/day15/img/goodgkl.jpg">下载</a>
      <!--<img src="img/goodgkl.jpg" width="580" alt="wu">-->
      <hr>
      <!--<img src="img/goodgkl.jpg">-->
      <a href="/day15/dld1?filename=goodgkl.jpg">下载</a>
      
      
      </body>
      </html>
      
  • 问题:

    • 中文文件名问题
      • 解决思路:
        1. 获取客户daunt使用的浏览器版本信息
        2. 根据不同版本信息,设置filename的编码方式不同

wu–>




下载

 </body>
 </html>
 ```
  • 问题:

    • 中文文件名问题
      • 解决思路:
        1. 获取客户daunt使用的浏览器版本信息
        2. 根据不同版本信息,设置filename的编码方式不同
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

立乱来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值