栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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

文章目录
  • HTTP响应消息&response对象&ServletContext对象
    • 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
      
      
      
      
        
          $Title$
        
        
        $END$
        
      
      
      
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();
                • ,重定向。。。
              • 给服务器使用:不需要加虚拟目录
                • 转发路径
    2. 服务器输出字符数据到浏览器

      • 步骤:

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

        • 乱码问题:

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

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

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

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

      1. 本质:图片

      2. 目的:防止恶意

        
        
        
            
            Title
            
        
        
        
            
            看不清换一张
        
        
        
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

      
      
      
          
          Title
      
      
      下载
      
      
      下载
  • 问题:

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

––>




下载

 
 
 ```
  • 问题:

    • 中文文件名问题
      • 解决思路:
        1. 获取客户daunt使用的浏览器版本信息
        2. 根据不同版本信息,设置filename的编码方式不同
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/678954.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号