ServletContext,ServletConfig和Sesion

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

由于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()方法就可以获取它的参数。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值