ServletContext,ServletConfig和Sesion

本文深入解析了Session与ServletContext的工作原理及应用,阐述了它们的区别,包括生命周期、作用域及如何在Web应用中进行数据共享。

 

由于HTTP协议时无状态的,session 记录了一个特定的客户端与服务器会话的状态,是属于特定会话的,其只作用于当前对话,当客户端和服务器断开会话结束或session过期后session就被销毁。

 

ServletContext是一个web应用所共享的,在服务器启动时被创建,服务器关闭时才销毁,作用与应用的整个生命周期,每个WEB应用都用特定的ServletContext。

 

Servlet容器在启动一个Web应用时,会为它创建唯一的ServletContext对象。当Servlet 容器终止一个 Web 应用时,就会销毁它的 ServletContext 对象。由此可见,

ServletContext对象与Web应用具有同样的生命周期。

ServletContext接口提供了一组在Web应用范围内存取共享数据的方法。“范围”在这里有两层含义:

表示一个特定时间段。

表示在特定时间段内可以共享数据的所有Web组件的集合。

Web应用范围具有以下两层含义:

表示由Web应用的生命周期构成的时间段。

表示在Web应用的生命周期内所有Web组件的集合。

存放在Web应用范围内的共享数据具有以下特点:

共享数据的生命周期位于Web应用的生命周期中的一个时间片段内。

共享数据可以被Web应用中的所有Web组件共享。

如何实现向 Web 应用范围内存取共享数据呢?由于 ServletContext 对象具有与Web应用同样长的生命周期,而且ServletContext对象可以被Web应用中的所有Web组件共享,因此可以利用 ServletContext 对象来存取 Web 应用范围内的共享数据,基本思想如下:

面向对象编程的一个基本思想就是万物皆对象,因此,共享数据也理所当然地用java.lang.Object类型的任意Java对象来表示。

只要把代表共享数据的Java对象与ServletContext对象关联,该Java对象的生命周期就依附于 ServletContext 对象的生命周期,并且 Web 组件就可以通过ServletContext对象来访问它。实际上,该Java对象就被存放到Web应用范围内。

在Web应用范围内可以存放各种类型的共享数据。为了方便地存取特定的共享数据,可以把代表共享数据的Java对象作为ServletContext的属性来存放。

每个属性包括一对属性名和属性值,属性值代表共享数据,属性名则用于标识共享数据。

在ServletContext接口中常用的用于存取共享数据的方法包括以下几种。

setAttribute(String name, Object object):向Web应用范围内存入共享数据。参数name指定属性名,参数object表示共享数据。

removeAttribute(String name):根据参数给定的属性名,从Web应用范围内删除匹配的共享数据。

getAttribute(String name):根据参数给定的属性名,返回Web应用范围内匹配的共享数据。

下有一例,可供深刻理解:

一般来说,对整个应用的配置,为了不使用“硬编码”,应该配置为ServletContext参数,比如字
符集设定。
<web-app>
.................
<init-param>
<param-name>charset</param-name> 
<param-value>GB2312</param-value> 
</init-param>
.................
</web-app>
注意以上格式只是2。0以后的标准格式,旧容器(引擎)采用服务商自己的格式配置。注意它的
父元素应该是<web-app>也就是说它是对一个应用作用的。

而如果只有一个特定的servlet要设定的参数,其它servlet不能共享,应该配置为ServletConfig
参数,如一个读取附件的servlet要用到绝对目录,而别的servlet不会用到:
<servlet>
<servlet-name>GetAtt</servlet-name>
<servlet-class>mail.GetAttServlet</servlet-class>
<init-param>
<param-name>absPath</param-name> 
<param-value>/usr/mail/ax/axman/Maildir/</param-value> 
</init-param>
</servlet>
不用说,因为在<servlet>标签中已经指定了name和class,也就是说只有mail.GetAttServlet这个/r
servlet中才能取到path,而别的Servlet是不能取到的。

前面我们讲了对这连个属性的认识,下面让我们来共同学习一下,如何获取这两个对象的参数:

访问ServletConfig参数:
首先要取得ServletConfig对象,然后调用它的getInitParameter();方法。要访问
ServletConfig对象,jsp中直接使用config内置对象,但因为你的JSP编译后的servlet一般不会被
加到web.xml中的,所以一般不会通过jsp来取对本JSP编译后的servlet的配置参数,那么在servlet
中要得到ServletConfig对象有两种方法:

在init()方法中取到:通过init的重载方法传递

.....
public class Test extends HttpServlet 
{
ServletConfig config;
public void init(ServletConfig config) throws ServletException {
this.config = config;
}
..................
}
然后在下面的方法中就可以访问config对象。但要注意,为了确保能从构造方法中到当前servlet的
config对象,应该调用父类的构造方法:
.....
public class Test extends HttpServlet 
{
ServletConfig config;
public void init(ServletConfig config) throws ServletException {
super.init(config);
this.config = config;
}
..................
}

通过getServletConfig()方法直接到时,这样做的好处是不必调手工传递属性,想在任何时候都可
以得到。

要访问ServletContext对象,只要从现有的ServletConfig对象getServletContext()就可以了,然后/r调用它的getInitParameter()方法就可以获取它的参数。

 

在 Tomcat 中,`ServletContext` 是一个全局唯一的对象,代表了 Web 应用的运行时上下文,所有 Servlet 共享该对象。获取 `ServletContext` 的方式主要有以下几种: ### 获取 ServletContext 的方法 #### 1. 通过 HttpServlet 类的方法直接获取 在继承自 `HttpServlet` 的类中,可以直接调用 `getServletContext()` 方法来获取当前应用的 `ServletContext` 实例: ```java protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext servletContext = this.getServletContext(); } ``` 此方法适用于在 Servlet 内部直接访问上下文对象[^1]。 #### 2. 通过 ServletConfig 获取 每个 Servlet 都可以通过其配置对象 `ServletConfig` 来获取 `ServletContext`: ```java protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext servletContext = this.getServletConfig().getServletContext(); } ``` 这种方式利用了 `ServletConfig` 提供的 `getServletContext()` 方法,间接获取上下文对象。 #### 3. 通过请求对象获取 在处理 HTTP 请求的过程中,可以从 `HttpServletRequest` 对象中获取 `ServletContext`: ```java protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext servletContext = req.getServletContext(); } ``` 该方法适用于在请求处理流程中需要访问上下文对象的场景[^2]。 #### 4. 通过会话对象获取 如果已经存在一个用户会话(Session),也可以通过 `HttpSession` 对象来获取 `ServletContext`: ```java protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext servletContext = req.getSession().getServletContext(); } ``` 此方法适用于在会话生命周期内访问上下文对象的需求。 --- ### 使用场景与注意事项 - **唯一性**:每个 Web 应用对应一个 `ServletContext`,它在整个应用中是全局唯一的。 - **共享数据**:可通过 `setAttribute()` `getAttribute()` 在不同组件之间共享数据。 - **资源访问**:支持通过 `getRealPath()` 或 `getResourceAsStream()` 等方法访问 Web 应用中的资源文件。 - **初始化参数**:可读取在 `web.xml` 中配置的上下文初始化参数。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值