一.Session 学习
问题:Request 对象解决了一次请求内的不同 Servlet 的数据共享问题,那么一个用户的不同请求的处理需要使用相同的数据怎么办呢?
解决:使用 session 技术。
原理:用户使用浏览器第一次向服务器发送请求,服务器在接受到请求后,调用对应的 Servlet 进行处理。在处理过程中会给用户创建一个 session 对象,用来存储用户请求处理相关的公共数据,并将session 对象的 JSESSIONID 以 Cookie 的形式存储在浏览器中(临时存储,浏览器关闭即失效)。用户在发起第二次请求及后续请求时,请求信息中会附带 JSESSIONID,服务器在接收到请求后,调用对应的 Servlet 进行请求处理,同时根据 JSESSIONID 返回其对应的 session 对象。
特点:Session 技术是依赖 Cookie 技术的服务器端的数据存储技术。由服务器进行创建每个用户独立拥有一个 session默认存储时间为 30 分钟。
作用:解决了一个用户的不同请求的数据共享问题。
使用:
* 创建session对象/获取session对象
HttpSession hs=req.getSession();
如果请求中拥有session的标识符也就是JSESSIONID,则返回其对应的session对象
如果请求中没有session的标识符也就是JSESSIONID,则创建新的session对象,并将其JSESSIONID作为从cookie数据存储到浏览器内存中
* 如果session对象是失效了,也会重新创建一个session对象,并将其JSESSIONID存储在浏览器内存中。
* 设置session存储时间
* hs.setMaxInactiveInterval(int seconds);
* 注意:
* 在指定的时间内session对象没有被使用则销毁,如果使用了则重新计时。
* 设置session强制失效
* hs.invalidate();
* 存储和获取数据
* 存储:hs.setAttribute(String name,Object value);
* 获取:hs.getAttribute(String name) 返回的数据类型为Object
* 注意:
* 存储的动作和取出的动作发生在不同的请求中,但是存储要先于取出执行。
* 使用时机:
* 一般用户在登陆web项目时会将用户的个人信息存储到Sesion中,供该用户的其他请求使用。
* 总结:
* session解决了一个用户的不同请求的数据共享问题,只要在JSESSIONID不失效和session对象不失效的情况下。
* 用户的任意请求在处理时都能获取到同一个session对象。
* 作用域:
* 一次会话
* 在JSESSIONID和SESSION对象不失效的情况下为整个项目内。
* session失效处理:
* 将用户请求中的JSESSIONID和后台获取到的SESSION对象的JSESSIONID进行比对,如果一致
* 则session没有失效,如果不一致则证明session失效了。重定向到登录页面,让用户重新登录。
* 注意:
* JSESSIONID存储在了Cookie的临时存储空间中,浏览器关闭即失效。
注意:只要不关闭浏览器,并且 session 不失效的情况下,同一个用户的任意请求在项目的任意 Servlet 中获取到的都是同一个 session对象。
作用域:一次会话
二.ServletContext 对象
问题:Request 解决了一次请求内的数据共享问题,session 解决了用户不同请求的数据共享问题,那么不同的用户的数据共享该怎么办呢?
解决:使用 ServletContext 对象。
作用:解决了不同用户的数据共享问题。
原理:ServletContext 对象由服务器进行创建,一个项目只有一个对象。不管在项目的任意位置进行获取得到的都是同一个对象,那么不同用户发起的请求获取到的也就是同一个对象了,该对象由用户共同拥有。
特点:服务器进行创建,用户共享,一个项目只有一个。
生命周期:服务器启动到服务器关闭。
作用域:项目内
使用:
* 获取ServletContext对象
* //第一种方式:
ServletContext sc=this.getServletContext();
//第二种方式:
ServletContext sc2=this.getServletConfig().getServletContext();
//第三种方式:
ServletContext sc3=req.getSession().getServletContext();
* 使用ServletContext对象完成数据共享
* //数据存储
* sc.setAttribute(String name, Object value);
* //数据获取
* sc.getAttribute("str") 返回的是Object类型
* 注意:
* 不同的用户可以给ServletContext对象进行数据的存取。
* 获取的数据不存在返回null。
* 获取项目中web.xml文件中的全局配置数据
* sc.getInitParameter(String name); 根据键的名字返回web.xml中配置的全局数据的值,返回String类型。如果数据不存在返回null。
* sc.getInitParameterNames();返回键名的枚举
* 配置方式:注意 一组<context-param>标签只能存储一组键值对数据,多组可以声明多个 <context-param>进行存储。
* <context-param>
<param-name>name</param-name>
<param-value>zhangsan</param-value>
</context-param>
作用:将静态数据和代码进行解耦。
获取项目webroot下的资源的绝对路径。
String path=sc.getRealPath(String path);
获取的路径为项目根目录,path参数为项目根目录中的路径
获取webroot下的资源的流对象
InputStream is = sc.getResourceAsStream(String path);
注意:
此种方式只能获取项目根目录下的资源流对象,class文件的流对象需要使用类加载器获取。path参数为项目根目录中的路径。
三.ServletConfig 对象
问题:使用 ServletContext 对象可以获取 web.xml 中的全局配置文件,web.xml 中每个 Servlet 也可以进行单独的配置,那么该怎么获取配置信息呢?
解决:使用 ServletConfig 对象。
作用:ServletConfig 对象是 Servlet 的专属配置对象,每个 Servlet 都单独拥有一个 ServletConfig 对象,用来获取 web.xml 中的配置信息。
使用:获取 ServletConfig 对象,获取 web.xml 中 servlet 的配置信息。
四.Web.xml 文件使用总结
作用:存储项目相关的配置信息,保护 Servlet。解耦一些数据对程序的依赖。
使用位置:每个 Web 项目中,Tomcat 服务器中(在服务器目录 conf 目录中)。
区别:Web 项目下的 web.xml 文件为局部配置,针对本项目的位置。Tomcat 下的 web.xml 文件为全局配置,配置公共信息。
内容(核心组件):全局上下文配置(全局配置参数);Servlet 配置;过滤器配置;监听器配置。
加载顺序:Web 容器会按 ServletContext -> context-param -> listener -> filter -> servlet 这个顺序加载组件,这些元素可配置在 web.xml文件中的任意位置。
加载时机:服务器启动时。
五.server.xml 文件
问题:浏览器发起请求后,服务器根据请求在 webapps 目下调用对应Servlet 进行请求处理。那么为什么是 webapps 目录难道不能是其他的目录吗?
解决:了解 server.xml 文件的配置信息。
Server.xml 文件核心组件:
热部署:<Context path ="/Pet" reloadable ="true" docBase ="F:/PetWeb" />