001.Session 学习+ServletContext 对象+ServletConfig 对象+Web.xml 文件使用总结+server.xml 文件

    xiaoxiao2023-09-29  130

    文章目录

    一.Session 学习

    二.ServletContext 对象

    三.ServletConfig 对象

    四.Web.xml 文件使用总结

    五.server.xml 文件


    一.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"   />


     

    最新回复(0)