004Session 学习+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"   />

发布了45 篇原创文章 · 获赞 7 · 访问量 2471

猜你喜欢

转载自blog.csdn.net/weixin_44145972/article/details/90543898