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. 在没有任何要求的情况下三种方式 都可以使用 , 但是推荐 使用请求 转发 , 可以减少服务器的访问次数 , 从而 减小服务器 压力

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

  1. 大数据WEB阶段 TransientDateAccessResourceException

    大数据WEB阶段 TransientDateAccessResourceException 一 . 分析 如果数据库保存的字段有时间 , 但是没有给该字段赋值时 ,则该字段默认是0000-00-00 ...

  2. 大数据WEB阶段Spring框架(四)Spring-MVC

    Spring-MVC 零.目录 Spring-MVC介绍 Spring-MVC入门案例 使用注解形式简化Cotroller 配置资源解析器 三种方式获取页面传递过来得参数 获取参数时的乱码问题 日期获 ...

  3. 大数据WEB阶段(八)Tomcat服务器安装与详解、HTTP协议详解

    Tomcat 一. 服务器 动态web资源运行需要服务器环境 客户端发送请求到服务器 , 服务器调用动态web资源 Servlet容器 . web容器 .服务器 Servlet容器 java中的动态资 ...

  4. 大数据WEB阶段(十五)JavaEE三大核心技术之过滤器

    Filter过滤器 一.Filter 过滤器概述 Filter是JavaEE三大核心技术(Servlet . Filter . Listener)之一 FIlter作用是拦截对资源的访问 , 拦截下来 ...

  5. 大数据WEB阶段(十四)JavaEE开发模式

    JavaEE开发模式 零.目录 开发模式发展历程 MVC设计思想的出现 JavaEE经典三层架构 经典三层架构解耦 一.开发模式发展历程 Servlet是JavaEE开发中一种动态web资源开发技术 ...

  6. 大数据WEB阶段总结

    一.概述 HTTP协议 web容器 - Tomcat 静态web资源 - 本质上是文件 html css js 图片 音频 视频 flash- 动态web资源 - 本质上是程序 Servelt JSP ...

  7. 大数据WEB阶段(九)Servlet+Request

    Servlet与Request 一.概述 Servlet 是sun公司提供的一门用于开发动态web资源的技术 按照这套规范写出来的servlet可以放置在web应用中在servlet容器中运行 . 开 ...

  8. 大数据WEB阶段(七)JDBC、数据库批处理、数据库连接池

    JDBC 一.概述 数据库驱动: 数据库厂商提供的用来操作数据库的jar包 JDBC简介 由于各大数据库厂商提供的数据库驱动各不相同, 导致了开发人员的学习成本十分的高. SUN公司为了简化数据库的操 ...

  9. 大数据WEB阶段 (六)MySql详解(一)

    MySql(二) 一.概述 什么是数据库 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,简而言之就是存储数据的仓库. 数据库的分类 层次式数据库.网络式数据库.关系型数据库 数 ...

最新文章

  1. java类安卓app 简介_android.app.Activity 的介绍
  2. pybind 填充数组
  3. linux 提取日志字段,记一次Linux下提取MySQL日志关键字段
  4. 多线程及Thread类、Runnable接口
  5. Android反编译,看这一篇就够了
  6. 华硕afudos刷bios_华硕M2N-MX SE PLUS主板 如何用afudos命令刷BIOS
  7. 推荐 20 款 IDEA 主题!
  8. 51单片机流水灯三种实现方法
  9. 基于CBO的SQL优化和Oracle实例优化
  10. 【mysql】大小写规范
  11. uva 815 Flooded!
  12. Excel读写合集:Excel读写小白从不知所措到轻松上手
  13. 计算机领域职业简介-PM,RD,FE,UE,UI,QA,OP,DBA,BRD,MRD,PRD,FSD等缩写的全称解析
  14. uni-app第三方登录
  15. JS 正则表达式(正则匹配RegExp)
  16. 银行降转账额度 “余额宝”要当心了
  17. 雄关漫道真如铁, 而今迈步从头越
  18. 为电子书迷测评几款PDF阅读器
  19. 调用QQ音乐接口,实现自制MV播放器
  20. 曾仕强:人生只做三件事

热门文章

  1. 每天CookBook之JavaScript-072
  2. 将Apache添加为Linux的服务 实现自启动
  3. [转]内存泄漏简单检测
  4. 给出一个包含n个整数的数列,问整数a在数列中的第一次出现是第几个。
  5. r语言中mpg数据_R语言常用的数据处理的包(1)
  6. 获取界面url_PHP调用百度地图接口,根据IP地址获取地区
  7. Linux环境下安装jenkins
  8. 20155327第三周学习总结
  9. 调用微信和支付宝调三方接口扫描二维码?
  10. Tomcat与Jre绿色环境配置(生产环境)