大数据WEB阶段 (十)Response、ServletConfig、ServletContext、资源跳转三种方式
Response、ServletConfig、ServletContext、资源跳转三种方式
—
(一)Response
一、Response概述
- 在doGet和doPost方法的参数中,HttpServletRequest代表的是http请求,而HttServletResponse代表的是http响应。想要获取请求中的信息时使用HttpServletRequest对象,而有数据需要发送给客户端时,就要用到HttpServletResponse对象了。
二、Response继承结构
- 我们通常简称为response , 但实际上是servletResponse接口 , 其中定义了很多与响应相关的方法 , HttpServletResponse是ServletResponse的接口的子接口 , 在ServletResponse的基础上增加了很多和 http协议相关的方法。
三、Response常用方法
- 设置状态码
- setStatus(int sc)
- setStatus(int sc , String sm)
- 设置响应头
- setIntHeader(String name , int value)
- setHeader(String name , String value)
- setDateHeader(String name , long date)
- addHeader(String name , int value)
- addIntHeader(String name , String value)
- 获取输出流
- PrintWriter getWriter() 字符输出流
- ServletOutputStream getOutputStream() 字节输出流
四、Response输出信息到客户端
- 向 客户端输出英文数据
- 向客户端输出中文数据测试时出现了乱码
响应乱码的处理
- 乱码结果分析
- 乱码的产生大多是由编码和解码时 使用的码表 不一致造成的
- 服务器端如果不指定 , 默认使用ISO-8859-1码表进行编码后发送数据
- 客户端如果不指定 , 默认使用客户端所在的操作系统的平台默认编码(windows默认gbk , linux默认u8)
乱码结果的处理
- 可以通过设置response.serCharacter(“utf-8”)来指定服务端发送数据时编码使用gbk , 注意:这行代码必须出现在任何输出数据的代码之前 , 否则不起作用 。
- 重新测试后发现乱码不在是“??”而是 变成了三个字符的 乱码
- 分析:
- 服务器使用 utf-8编码时两个字符占用 6个字节 , 但是客户端使用gbk解码 , gbk中每个字符占2个字节 , 所以最后产生了一个三个字符的字符串
处理
我们需要指定客户端使用与服务端 一致的 码表进行解码 ,才能保证数据正确
response.setContentType("text/html;charset=utf-8"); 或 response.setHeader("Content-Type","text/html;charset=utf-8")
- Response输出数据时的细节
- getWriter()与getoutputStream()这两个方法互斥 , 调用了其中一个就不能在调用另一个 , 因为服务器需要明确数据发送前是否需要编码(字符输出流发送前需要编码 , 而字节输出流发送前不需要) 。
- servlet程序向ServletOutputStream或PrintWriter对象中写入数据的数据将被 Servlet引擎从response获取 , servlet引擎将这些 数据当做响应消息的正文 , 然后再与响应状态和 各种响应头组合后发向客户端
- Servlet的service方法被调用结束后 , servlet引擎会检查 PrintWriter和ServletOutputStream对象是否被关闭 , 如果没有则servlet引擎将调用close方法关闭输出流对象
- 乱码结果分析
五、Response实现重定向
HTTP协议中提供了 302状态码和location响应头 , 通知浏览器收到响应后立即自动访问location中的制定地址 , 从而跳转访问 另一个地址
response.setState(302); response.setHeader("Location",url);
- 观察地址栏发生了变化 , 所以实际上是进行了两次请求 。
六、Response实现定时刷新
在HTTP协议中提供了refresh响应头 , 可以命令浏览器的定时刷新 。
response.setHeader("refresh","3");//浏览器端每隔3秒自动刷新一次 response.setHeader("refresh","3;url=xxx");//浏览器3秒后刷新跳转到制定url
- 案例: 注册成功后提示:恭喜注册才成功 , 3秒后跳转到主页
七、Response禁止浏览器缓存
- 各大浏览器为了减小服务器的压力 , 会在第一次访问到资源后对资源进行缓存 ,, 之后在访问相同的地址时 , 就不会实际访问服务器 , 而是读取缓存 。
- 这种缓存一定 程度上提高了浏览器的响应速度,减小了服务器压力 , 在大多数情况下是好的 ,但是在某些场景下可能会有问题 。 如:验证码的显示 、 股票走势 、 火车票余量。。。
禁止浏览器缓存资源
response.setDateHeader("Expires",0); response.setHeader("cache-control","no-cache"); response.setHeader("Pragma","no-cacahe");
(二)ServletConfig
一、概述
- ServletConfig代表Servlet在web.xml中的配置信息
二、获取ServletConfig
- 在servlet接口中init方法参数就是ServletConfig , 在Servlet创建出来时init方法被立即调用 , 由容器传入ServletConfig对象 。
- 在GenericServlet中 , 实现了这个方法 , 就爱那个ServletConfig设置成了类的成员变量 , 并提供了getServletConfig的方法 , 获取该对象 。
- 我们实现的servlet都直接或间接继承了GenericServlet , 所以可以直接调用getServletConfig() 方法 。 获取该对象 。
三、ServletConfig获取初始化参数
- 配置初始化参数
- 在web.xml文件中的servlet标签中可以配置一个或多个init-param标签 , 用来为当前 servlet配置一些自定义的参数 , 成为 servlet初始化参数
- 通过servletConfig获取初始化参数
- 在servletconfig身上有一些方法可以获取初始化参数
- 示例:
(三)servletContext对象
一、ServletContext概述
- ServletContext对象代表当前web应用 , 当服务器启东时 , 服务器会依次加载 web应用 , 每一个web应用加载完成之后都会创建一个ServletContext对象唯一代表该应用 , 这个对象一直存活 , 知道web应用被移除容器 , 获取 服务器关闭时随着应用被销毁 。
二、获取ServletContext对象
- ServletConfig对象身上提供了getServletContext()方法来获取ServletContext对象
- 而在GenericServlet中也提供了便捷的getServletContext()方法 , 我们创建的Servlet间接继承至GenericServlet , 所以可以直接调用getServletContext() .
三、ServletContext对象读取web应用初始化参数
我们可以在web.xml文件中利用context-param标签为整个应用配置初始化信息
<context-param><param-name>encode</param-name><param-value>utf-8</param-value> </context-param>
可以利用ServletContext对象的如下方法获取初始化信息:
ServletContext.getInitParameter(); ServletContext.getInitParameterName()
- ServletContext对象作为域对象使用
- 作用范围: 整个web应用
- 生命周期:随web应用的生而生 , 灭而灭 。
- 操作域的方法:
- setAttribute(String name , Object obj);//向域中设置数据
- Object getAttribute(String name);//从域中获取数据
- removeAttribute(String name);//从域中移除数据
ServletContext对象读取web资源
- 路径难题
- 在web环境中读取资源时 , 如果写的是相对路径 , 则在 tomcat/bin目录下寻找资源 。 如果写的是绝对路径 , 则在tomcat所在的根目录下寻找资源 。 如果写的是从盘符开始的绝对路径可以正确找到资源 , 但是项目一旦开发完成发布到服务器中绝对路径会随之改变 。
- ServletContext读取资源
- ServletCotext.getRealPath(“xxx”); —这个方法会在传入的路径之前拼接当前 web应用的硬盘路径(此时的xxxx代表的是目标资源在webRoot目录中的相对路径) , 从而得到动态的web资源绝对路径。
类加载器读取资源
- 在web开发时, 有时没法拿到ServletContext对象, 此时 可以使用类加载器加载资源文件
- 类加载器可以加载class文件 , 也可以 加载其他类型的资源文件
在ClassLoader上提供了getResource(“相对于类加载目录路径”)可以加载 资源 , 但是要求这个路径给一个相对于类加载器加载类的目录的路径(WEB-INF/classes)
String path = 当前类名.class.getClassLoader().getResource("xxx").getPath();
- 路径难题
(四)实现资源跳转
一、三种资源跳转方式
- Response请求重定向
- Response定时刷新
- Resquest请求转发
二、三种资源跳转方式的比较
- 不同特点
- 转法是服务 器内部资源的跳转 , 重定向是通过302+Loaction实现浏览器跳转访问 。
- 转发是一次请求一次响应 , 重定向是两次请求两次响应 。
- 转发地址栏不发生变化 , 重定向地址栏 会发生变化
- 转发之后request不变 , 重定向会产生两个不同的request
- 应用场景
- 如果希望资源跳转的过程中使用request域传输数据 , 必须用转发
- 如果希望资源跳转后地址栏发生改变 , 则必须用重定向或定时刷新
- 如果希望在跳转时展示一些数据 , 则 必须使用定时刷新
- 在没有任何要求的情况下三种方式 都可以使用 , 但是推荐 使用请求 转发 , 可以减少服务器的访问次数 , 从而 减小服务器 压力
大数据WEB阶段 (十)Response、ServletConfig、ServletContext、资源跳转三种方式相关推荐
- 大数据WEB阶段 TransientDateAccessResourceException
大数据WEB阶段 TransientDateAccessResourceException 一 . 分析 如果数据库保存的字段有时间 , 但是没有给该字段赋值时 ,则该字段默认是0000-00-00 ...
- 大数据WEB阶段Spring框架(四)Spring-MVC
Spring-MVC 零.目录 Spring-MVC介绍 Spring-MVC入门案例 使用注解形式简化Cotroller 配置资源解析器 三种方式获取页面传递过来得参数 获取参数时的乱码问题 日期获 ...
- 大数据WEB阶段(八)Tomcat服务器安装与详解、HTTP协议详解
Tomcat 一. 服务器 动态web资源运行需要服务器环境 客户端发送请求到服务器 , 服务器调用动态web资源 Servlet容器 . web容器 .服务器 Servlet容器 java中的动态资 ...
- 大数据WEB阶段(十五)JavaEE三大核心技术之过滤器
Filter过滤器 一.Filter 过滤器概述 Filter是JavaEE三大核心技术(Servlet . Filter . Listener)之一 FIlter作用是拦截对资源的访问 , 拦截下来 ...
- 大数据WEB阶段(十四)JavaEE开发模式
JavaEE开发模式 零.目录 开发模式发展历程 MVC设计思想的出现 JavaEE经典三层架构 经典三层架构解耦 一.开发模式发展历程 Servlet是JavaEE开发中一种动态web资源开发技术 ...
- 大数据WEB阶段总结
一.概述 HTTP协议 web容器 - Tomcat 静态web资源 - 本质上是文件 html css js 图片 音频 视频 flash- 动态web资源 - 本质上是程序 Servelt JSP ...
- 大数据WEB阶段(九)Servlet+Request
Servlet与Request 一.概述 Servlet 是sun公司提供的一门用于开发动态web资源的技术 按照这套规范写出来的servlet可以放置在web应用中在servlet容器中运行 . 开 ...
- 大数据WEB阶段(七)JDBC、数据库批处理、数据库连接池
JDBC 一.概述 数据库驱动: 数据库厂商提供的用来操作数据库的jar包 JDBC简介 由于各大数据库厂商提供的数据库驱动各不相同, 导致了开发人员的学习成本十分的高. SUN公司为了简化数据库的操 ...
- 大数据WEB阶段 (六)MySql详解(一)
MySql(二) 一.概述 什么是数据库 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库,简而言之就是存储数据的仓库. 数据库的分类 层次式数据库.网络式数据库.关系型数据库 数 ...
最新文章
- java类安卓app 简介_android.app.Activity 的介绍
- pybind 填充数组
- linux 提取日志字段,记一次Linux下提取MySQL日志关键字段
- 多线程及Thread类、Runnable接口
- Android反编译,看这一篇就够了
- 华硕afudos刷bios_华硕M2N-MX SE PLUS主板 如何用afudos命令刷BIOS
- 推荐 20 款 IDEA 主题!
- 51单片机流水灯三种实现方法
- 基于CBO的SQL优化和Oracle实例优化
- 【mysql】大小写规范
- uva 815 Flooded!
- Excel读写合集:Excel读写小白从不知所措到轻松上手
- 计算机领域职业简介-PM,RD,FE,UE,UI,QA,OP,DBA,BRD,MRD,PRD,FSD等缩写的全称解析
- uni-app第三方登录
- JS 正则表达式(正则匹配RegExp)
- 银行降转账额度 “余额宝”要当心了
- 雄关漫道真如铁, 而今迈步从头越
- 为电子书迷测评几款PDF阅读器
- 调用QQ音乐接口,实现自制MV播放器
- 曾仕强:人生只做三件事