ServletContext与ServletConfig的深度分析

来源:互联网 发布:万网域名别名解析 编辑:程序博客网 时间:2024/05/08 12:10

ServletContext与ServletConfig的深度分析

 

对于web容器来说,ServletContext接口定义了一个servlet环境对象,这个对象定义了一个在servlet引擎上的servlet的视图。通过使用这个对象,servlet可以记录事件,得到资源并得到来自servlet的引擎类。

servlet 容器在启动时会加载web应用,并为每个web应用创建唯一的servlet context对象,可以把ServletContext看成是一个Web 应用的服务器端组件的共享内存,在ServletContext中可以存放共享数据,他提供了4个读取和设置共享数据的方法。具体见api帮助文档。

另外,ServletContext对象只在web应用被关闭的时候才被销毁,不同的web应用,ServletContext各自独立存在。

一个web应用由jsp,servlet,javabean等web组件的集合构成,每一个web应用,容器都会有一个背景对象,而 javax.servlet.ServletContext接口就提供了访问这个背景对象的途径。你可以通过一个servlet实例的 getServletContext()方法得到该servlet运行其中的这个背景对象,从这个背景对象中你可以访问如下信息资源:

1.初始化参数

2.存储在背景中的对象

3.与背景关联的资源

4.日志

最后针对ServletContext我自己的总结是:

ServletContext即servlet容器,其内提供的方法可以在同一web应用下的所有servlet中被使用

而对于config对象来说,他与context相比,就有了很大的局限性。

当ServletConfig对象在servlet中被实例化后,对任何客户端在任何时候访问有效。但是一个servlet的ServletConfig对象不能被另一个servlet访问,也就是说,在本servlet声明后的ServletConfig只能在本servlet内被访问,属于内部持久有效的变量。

 

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

 

一般来说,对整个应用的配置,为了不使用“硬编码”,应该配置为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对象有两种方法:

 

在inii()方法中取到:通过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()方法就可以获取它的参数。
ServletConfig对象从init()方法初始化。

 

按说:ServletContext对象的作用域比ServletConfig作用域大,为什么要从ServletConfig中到得

ServletContext 对象呢?我个人认为:容器保存了很多个ServletContext对象,请求时容器到底取哪一个\r给你呢?那就取其中包含ServletConfig 信息的那个给你,就是说取ServletConfig对象的父级对象。就好象HttpSession要从requset中取得一样,就是取那个包含当前 request对象的session对象给你,这只是我的个人想法,还没有来得及看具体实现。反正就这么用吧。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 百度搜索网页打不开怎么办? 原生家庭很糟糕怎么办 白色油漆变黄怎么办 白油漆家具泛黄怎么办 交通电子眼60分怎么办 被公司罚款了怎么办 公司对员工罚款怎么办 高一军训洗漱怎么办 吃精神病药发胖怎么办 神经病人不吃药怎么办 事故全责不赔钱怎么办 吃精神药物发胖怎么办 郑州出院限号怎么办 林场改革森林消防怎么办 网络课没有看完怎么办 福建省会计证未换怎么办 国税地税登记后怎么办 网上发票领不了怎么办 合肥餐饮怎么办环评 地税财务报表上传错误怎么办? 平安体检卡过期怎么办 到医院挂号后怎么办 一吹风就头痛怎么办 平安口袋e怎么办离职 学员学分卡号怎么办 华医网注册错了怎么办 医师继续教育学分不够怎么办 执业医师学分卡怎么办 护士学分5年没办怎么办 华医网职称录入错误怎么办 在北京没有学历怎么办 继续教育证书丢了怎么办 继续教育证丢了怎么办 继续教育档案丢了怎么办 现在会计证丢了怎么办 初级准考证丢了怎么办 协助调查48小时怎么办 有个抑郁症父亲怎么办 法院不给立案怎么办 眼睛发炎有眼屎怎么办 外伤后眼白出血怎么办