大数据WEB阶段 (十)Response、ServletConfig、ServletContext、资源跳转三种方式

本文详细介绍了Servlet技术中的Response、ServletConfig及ServletContext对象的功能与使用方法,包括Response的状态码设置、响应头设置、输出信息到客户端等内容;同时阐述了ServletConfig与ServletContext的作用及如何获取它们;最后对比了三种资源跳转方式的特点与应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Response、ServletConfig、ServletContext、资源跳转三种方式


(一)Response

一、Response概述

  1. 在doGet和doPost方法的参数中,HttpServletRequest代表的是http请求,而HttServletResponse代表的是http响应。想要获取请求中的信息时使用HttpServletRequest对象,而有数据需要发送给客户端时,就要用到HttpServletResponse对象了。

二、Response继承结构

  1. 我们通常简称为response , 但实际上是servletResponse接口 , 其中定义了很多与响应相关的方法 , HttpServletResponse是ServletResponse的接口的子接口 , 在ServletResponse的基础上增加了很多和 http协议相关的方法。

三、Response常用方法

  1. 设置状态码
    1. setStatus(int sc)
    2. setStatus(int sc , String sm)
  2. 设置响应头
    1. setIntHeader(String name , int value)
    2. setHeader(String name , String value)
    3. setDateHeader(String name , long date)
    4. addHeader(String name , int value)
    5. addIntHeader(String name , String value)
  3. 获取输出流
    1. PrintWriter getWriter() 字符输出流
    2. ServletOutputStream getOutputStream() 字节输出流

四、Response输出信息到客户端

  1. 向 客户端输出英文数据
  2. 向客户端输出中文数据测试时出现了乱码
  3. 响应乱码的处理

    1. 乱码结果分析
      1. 乱码的产生大多是由编码和解码时 使用的码表 不一致造成的
      2. 服务器端如果不指定 , 默认使用ISO-8859-1码表进行编码后发送数据
      3. 客户端如果不指定 , 默认使用客户端所在的操作系统的平台默认编码(windows默认gbk , linux默认u8)
    2. 乱码结果的处理

      1. 可以通过设置response.serCharacter(“utf-8”)来指定服务端发送数据时编码使用gbk , 注意:这行代码必须出现在任何输出数据的代码之前 , 否则不起作用 。
      2. 重新测试后发现乱码不在是“??”而是 变成了三个字符的 乱码
      3. 分析:
        1. 服务器使用 utf-8编码时两个字符占用 6个字节 , 但是客户端使用gbk解码 , gbk中每个字符占2个字节 , 所以最后产生了一个三个字符的字符串
      4. 处理

        1. 我们需要指定客户端使用与服务端 一致的 码表进行解码 ,才能保证数据正确

          response.setContentType("text/html;charset=utf-8");
          或
          response.setHeader("Content-Type","text/html;charset=utf-8")
          
    3. Response输出数据时的细节
      1. getWriter()与getoutputStream()这两个方法互斥 , 调用了其中一个就不能在调用另一个 , 因为服务器需要明确数据发送前是否需要编码(字符输出流发送前需要编码 , 而字节输出流发送前不需要) 。
      2. servlet程序向ServletOutputStream或PrintWriter对象中写入数据的数据将被 Servlet引擎从response获取 , servlet引擎将这些 数据当做响应消息的正文 , 然后再与响应状态和 各种响应头组合后发向客户端
      3. Servlet的service方法被调用结束后 , servlet引擎会检查 PrintWriter和ServletOutputStream对象是否被关闭 , 如果没有则servlet引擎将调用close方法关闭输出流对象

五、Response实现重定向

  1. HTTP协议中提供了 302状态码和location响应头 , 通知浏览器收到响应后立即自动访问location中的制定地址 , 从而跳转访问 另一个地址

    response.setState(302);
    response.setHeader("Location",url);
    

  2. 观察地址栏发生了变化 , 所以实际上是进行了两次请求 。

六、Response实现定时刷新

  1. 在HTTP协议中提供了refresh响应头 , 可以命令浏览器的定时刷新 。

    response.setHeader("refresh","3");//浏览器端每隔3秒自动刷新一次
    response.setHeader("refresh","3;url=xxx");//浏览器3秒后刷新跳转到制定url
    
  2. 案例: 注册成功后提示:恭喜注册才成功 , 3秒后跳转到主页

七、Response禁止浏览器缓存

  1. 各大浏览器为了减小服务器的压力 , 会在第一次访问到资源后对资源进行缓存 ,, 之后在访问相同的地址时 , 就不会实际访问服务器 , 而是读取缓存 。
  2. 这种缓存一定 程度上提高了浏览器的响应速度,减小了服务器压力 , 在大多数情况下是好的 ,但是在某些场景下可能会有问题 。 如:验证码的显示 、 股票走势 、 火车票余量。。。
  3. 禁止浏览器缓存资源

    response.setDateHeader("Expires",0);
    response.setHeader("cache-control","no-cache");
    response.setHeader("Pragma","no-cacahe");
    

(二)ServletConfig

一、概述

  1. ServletConfig代表Servlet在web.xml中的配置信息

二、获取ServletConfig

  1. 在servlet接口中init方法参数就是ServletConfig , 在Servlet创建出来时init方法被立即调用 , 由容器传入ServletConfig对象 。
  2. 在GenericServlet中 , 实现了这个方法 , 就爱那个ServletConfig设置成了类的成员变量 , 并提供了getServletConfig的方法 , 获取该对象 。
  3. 我们实现的servlet都直接或间接继承了GenericServlet , 所以可以直接调用getServletConfig() 方法 。 获取该对象 。

三、ServletConfig获取初始化参数

  1. 配置初始化参数
    1. 在web.xml文件中的servlet标签中可以配置一个或多个init-param标签 , 用来为当前 servlet配置一些自定义的参数 , 成为 servlet初始化参数
  2. 通过servletConfig获取初始化参数
    1. 在servletconfig身上有一些方法可以获取初始化参数
    2. 示例:

(三)servletContext对象

一、ServletContext概述

  1. ServletContext对象代表当前web应用 , 当服务器启东时 , 服务器会依次加载 web应用 , 每一个web应用加载完成之后都会创建一个ServletContext对象唯一代表该应用 , 这个对象一直存活 , 知道web应用被移除容器 , 获取 服务器关闭时随着应用被销毁 。

二、获取ServletContext对象

  1. ServletConfig对象身上提供了getServletContext()方法来获取ServletContext对象
  2. 而在GenericServlet中也提供了便捷的getServletContext()方法 , 我们创建的Servlet间接继承至GenericServlet , 所以可以直接调用getServletContext() .

三、ServletContext对象读取web应用初始化参数

  1. 我们可以在web.xml文件中利用context-param标签为整个应用配置初始化信息

    <context-param>
        <param-name>encode</param-name>
        <param-value>utf-8</param-value>
    </context-param>
    
  2. 可以利用ServletContext对象的如下方法获取初始化信息:

    ServletContext.getInitParameter();
    ServletContext.getInitParameterName()
    
  3. ServletContext对象作为域对象使用
    1. 作用范围: 整个web应用
    2. 生命周期:随web应用的生而生 , 灭而灭 。
    3. 操作域的方法:
      1. setAttribute(String name , Object obj);//向域中设置数据
      2. Object getAttribute(String name);//从域中获取数据
      3. removeAttribute(String name);//从域中移除数据
  4. ServletContext对象读取web资源

    1. 路径难题
      1. 在web环境中读取资源时 , 如果写的是相对路径 , 则在 tomcat/bin目录下寻找资源 。 如果写的是绝对路径 , 则在tomcat所在的根目录下寻找资源 。 如果写的是从盘符开始的绝对路径可以正确找到资源 , 但是项目一旦开发完成发布到服务器中绝对路径会随之改变 。
    2. ServletContext读取资源
      1. ServletCotext.getRealPath(“xxx”); —这个方法会在传入的路径之前拼接当前 web应用的硬盘路径(此时的xxxx代表的是目标资源在webRoot目录中的相对路径) , 从而得到动态的web资源绝对路径。
    3. 类加载器读取资源

      1. 在web开发时, 有时没法拿到ServletContext对象, 此时 可以使用类加载器加载资源文件
      2. 类加载器可以加载class文件 , 也可以 加载其他类型的资源文件
      3. 在ClassLoader上提供了getResource(“相对于类加载目录路径”)可以加载 资源 , 但是要求这个路径给一个相对于类加载器加载类的目录的路径(WEB-INF/classes)

        String path = 当前类名.class.getClassLoader().getResource("xxx").getPath();
        

(四)实现资源跳转

一、三种资源跳转方式

  1. Response请求重定向
  2. Response定时刷新
  3. Resquest请求转发

二、三种资源跳转方式的比较

  1. 不同特点
    1. 转法是服务 器内部资源的跳转 , 重定向是通过302+Loaction实现浏览器跳转访问 。
    2. 转发是一次请求一次响应 , 重定向是两次请求两次响应 。
    3. 转发地址栏不发生变化 , 重定向地址栏 会发生变化
    4. 转发之后request不变 , 重定向会产生两个不同的request
  2. 应用场景
    1. 如果希望资源跳转的过程中使用request域传输数据 , 必须用转发
    2. 如果希望资源跳转后地址栏发生改变 , 则必须用重定向或定时刷新
    3. 如果希望在跳转时展示一些数据 , 则 必须使用定时刷新
    4. 在没有任何要求的情况下三种方式 都可以使用 , 但是推荐 使用请求 转发 , 可以减少服务器的访问次数 , 从而 减小服务器 压力
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值