Servlet、ServletContext与ServletConfig的详解及区别
Servlet、ServletContext与ServletConfig的详解及区别
一、Servlet详解
Servlet是一个interface,全局限定名:javax.servlet.Servlet,其子接口为:HttpJspPage,JspPage,其实现类为:FacesServlet(fianl),GenericServlet(abstract),HttpServlet(abstract)。抽象类GenericServlet直接 implements Servlet,抽象类HttpServlet直接 extends GenericServlet,它们具有统一的方法(继承于Servlet):
◆ void init(ServletConfig config) throwsServletException
◆ServletConfig getServletConfig()
◆ void service(ServletRequest request,ServletResponse response) throws ServletException, IOException
◆ String getServletInfo()
◆ void destroy()
public abstract class GenericServlet extends Object implements Servlet,ServletConfig,Serializable:
GenericServlet有两个重载的init方法,无参的init方法一定会被调用,目的是为了保证Servlet的正确初始化,有参的init方法提供自定义初始化。
◆ public void init() throws ServletException
◆ public void init(ServletConfig config) throwsServletException
GenericServlet的service方法是抽象方法:
◆ public abstract void service(ServletRequest req,ServletResponse res) throws ServletException, IOException
public abstract class HttpServlet extends GenericServlet:
HttpServlet有两个重载的service方法,其protected的是可以被子类继承重写的(没必要override,一般override doXXX方法),其public的是负责接收容器转发传入的client requests,然后Dispaches给protected的,protected的最后调用doXXX方法,完成请求接收处理。也可以直接override(重写) protected的,在重写的service方法中完成请求接收处理,而不去最后调用doXXX方法。
◆ protected void service(HttpServletRequest req,HttpServletResponse resp) throws ServletException, IOException
◆ public void service(ServletRequest req,ServletResponse res) throws ServletException, IOException
二、ServletContext详解
ServletContext是servlet与servlet容器之间的直接通信的接口。Servlet容器在启动一个Webapp时,会为它创建一个ServletContext对象,即servlet上下文环境。每个webapp都有唯一的ServletContext对象。同一个webapp的所有servlet对象共享一个ServeltContext,servlet对象可以通过ServletContext来访问容器中的各种资源。
ServletContext接口提供的方法分为以下几种类型:
用于在Webapp范围内存取共享数据的方法。
注:webapp范围具有以下两层含义:
(1) 表示有webapp的生命周期构成的时间段。
(2) 表示在webapp的生命周期内所有web组件的集合。
◆ setAttribute(String name, java.lang.Object object):以键值对的形式,把一个java对象和一个属性名绑定,并存放到ServletContext中,参数name指定属性名,参数Object表示共享数据。
◆ getAttribute(String name):根据参数给定的属性名,返回一个Object类型的对象。
◆ getAttributeNames():返回一个Enumeration对象,该对象包含了所有存放在ServletContext中的属性名。
◆ removeAttribute(String name):根据参数指定的属性名,从servletContext对象中删除匹配的属性。
访问当前Webapp的资源
◆ getContextpath():返回当前webapp的URL入口。
◆ getInitParameter(String name):返回webapp配置文件中匹配的初始化参数值。在web.xml中<web-app>元素中<context-param>子元素表示Webapp应用范围内的初始参数。
◆ getInitParameterNames():返回一个Enumeration对象,该对象包含了所有存放在web.xml中<web-app>元素中<context-param>子元素的初始化参数名。
◆ getServletContextName():返回webapp名称。即<web-app>元素中<display-name>子元素的值。
◆ getRequestDispatcher(String path):返回一个用于向其他web组件转发请求的RequestDispatcher对象。
访问servlet容器的相关信息
◆ getContext(String uripath):根据参数指定的url,返回当前servlet容器中其他web应用的servletContext()对象。
访问web容器的相关信息
◆ getMajorVersion():返回servlet容器支持的java servlet API 的主版本号。
◆ getMinorVersion():返回servlet容器支持的java Servlet API的次版本号。
◆ getServerInfo():返回servlet容器的名字和版本。
访问服务器端的文件系统资源
◆ getRealPath(String path):根据参数指定的虚拟路径,返回文件系统中的一个真实的路径。
◆ getResource(String path):返回一个映射到参数指定的路径的url。
◆ getResourceAsStream(String path):返回一个用于读取参数指定的文件的输入流。(把文件读到输入流中去)
◆ getMimeType(String file):返回参数指定的文件的MIME类型。
输出日志
◆ log(String msg):向servlet的日志文件中写日志。
◆ log(String message, java.lang.Throwable throwable):向servlet的日志文件中写错误日志,以及异常的堆栈信息。
ServletContext对象获得几种方式:
javax.servlet.http.HttpSession.getServletContext()
javax.servlet.jsp.PageContext.getServletContext()
javax.servlet.ServletConfig.getServletContext()
以上是servlet2.5版本及以前的获取方法。
servlet3.0中新增方法:
javax.servlet.ServletRequest.getServletContext()
三、ServletConfig详解
Jsp/Servlet容器初始化一个Servlet类型的对象时,会为这个Servlet对象创建一个ServletConfig对象。在ServletConfig对象中包含了Servlet的初始化参数信息。此外,ServletConfig对象还与ServletContext对象关联。Jsp/Servlet容器在调用Servlet对象的init(ServletConfig config)方法时,会把ServletConfig类型的对象当做参数传递给servlet对象。Init(ServletConfig config)方法会使得当前servlet对象与ServletConfig类型的对象建立关联关系。
ServletConfig接口中定义了以下方法:
◆ getInitParameter(String name):根据给定的初始化参数,返回匹配的初始化参数值。
◆ getInitParameterNames():返回一个Enumeration对象,该对象包含了所有存放在web.xml中<web-app>元素<servlet>子元素<init-param>中的所有的初始化参数名。
◆ getServletContext():返回一个servletContext()对象,
◆ getServltName():返回servlet的名字,即web.xml中的相对应的servlet的子元素<servlet-name>的值。如果没有配置这个子元素,则返回servlet类的全局限定名。
Example:
<servlet>
<servlet-name>actionServlet</servlet-name>
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>first</param-name>
<param-value>netfish</param-value>
</init-param>
<init-param>
<param-name>last</param-name>
<param-value>blog</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>actionServlet</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
如上,红色标记处为初始化参数,相当于servlet共享参数。
在servlet中:
public class BlogServlet extends HttpServlet {
String first = this.getInitParameter("first");
String last = this.getInitParameter("last");
System.out.println("第一个参数:" + first + "第二个参数:" + last);
}
注:HttpServlet类继承了GenericServlet类,而GenericServlet类实现了ServletConfig接口,因此在HttpServlet类和GenericServlet类及子类中都可以直接调用ServletConfig接口中的方法。
四、ServletContext和ServletConfig二者区别
从作用范围来说,ServletConfig作用于某个特定的Servlet,即从该Servlet实例化,那么就开始有效,但是该Servlet之外的其他Servlet不能访问;ServletContext作用于某个webapp,即在一个webapp中相当于一个全局对象,在Servlet容器启动时就已经加载,对于不同的webapp,有不同的ServletContext。
其次,来看一下二者参数的使用。如果一个参数为整个webapp所用,那么就配置为ServletContext参数,如下所示:
<context-param>
<param-name>ContextParam</param-name>
<param-value>hello, this is ServletContext param.</param-value>
</context-param>
如果一个参数仅为一个Servlet所用,那么就应该配置为ServletConfig参数,如下所示:
<servlet>
<servlet-name>servlet名称</servlet-name>
<servlet-class>servlet全局限定名</servlet-class>
<init-param>
<param-name>ServletParam</param-name>
<param-value>hello, this is ServletConfig param.</param-value>
</init-param>
</servlet>
最后,说明一下参数的获取。访问ServletConfig参数,取得ServletConfig对象后,调用getInitParameter()方法;访问ServletContext对象,只要调用现有的ServletConfig对象的getServletContext()即可,然后同样调用getInitParamter()方法就能获取参数。例如对于上面的参数,可以通过如下方法获取各自参数。
public class GetParam extends HttpServlet {
ServletConfig config;
public void init(ServletConfig config) {
this.config=config;
}
public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException {
String servletparam=(String)config.getInitParameter("ServletParam");
System.out.println(servletparam);
String contextparam = (String)config.getServletContext().getInitParameter("ContextParam");
System.out.println(contextparam);
}
public void destroy() {
}
}
对上面Servlet编译后,部署到Tomcat中,启动,在浏览器中输入http://localhost:8080/webapp名称/GetParam(该链接地址在webx.xml中配置)访问,就可以分别在控制台输出hello, this is ServletConfig param.
hello, this is ServletContext param.
转载来自http://blog.csdn.net/u012077981/article/details/17137705
Servlet、ServletContext与ServletConfig的详解及区别的更多相关文章
- ServletContext与ServletConfig的详解及区别
转自http://hi.baidu.com/huaxuelili/item/1704a03dbb5cd7f22784f4c6 一.ServletContext详解ServletContext是serv ...
- Servlet技术——request、respone详解
Servlet之request.respone详解 Request (一) 概述 request是Servlet.service()方法的一个参数,在客户端发出每个请求时,服务器都会创建一个reque ...
- 分布式缓存Memcached/memcached/memcache详解及区别
先来解释下标题中的三种写法:首字母大写的Memcached,指的是Memcached服务器,就是独立运行Memcached的后台服务器,用于存储缓存数据的“容器”.memcached和memcache ...
- Sql Server 中 GAM、SGAM、PAM、IAM、DCM 和 BCM 的详解与区别
Sql Server 中 GAM.SGAM.PAM.IAM.DCM 和 BCM 的详解与区别 GAM.SGAM.PAM.IAM.DCM 和 BCM 都是 SQL Server 中用来管理空间分配的 ...
- Python中%r和%s的详解及区别_python_脚本之家
Python中%r和%s的详解及区别_python_脚本之家 https://www.jb51.net/article/108589.htm
- List、Set、Map详解及区别
一.List接口 List是一个继承于Collection的接口,即List是集合中的一种.List是有序的队列,List中的每一个元素都有一个索引:第一个元素的索引值是0,往后的元素的索引值依次+1 ...
- C++的三种继承方式详解以及区别
目录 目录 C++的三种继承方式详解以及区别 前言 一.public继承 二.protected继承 三.private继承 四.三者区别 五.总结 后话 C++的三种继承方式详解以及区别 前言 我发 ...
- web.xml 中的listener、 filter、servlet 加载顺序及其详解
在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...
- 转:web.xml 中的listener、 filter、servlet 加载顺序及其详解
在项目中总会遇到一些关于加载的优先级问题,刚刚就遇到了一个问题,由于项目中使用了quartz任务调度,quartz在web.xml中是使用listener进行监听的,使得在tomcat启动的时候能马上 ...
随机推荐
- final修饰符(7)-缓存实例的不可变类
不可变类的实例状态不可改变,可以很方便地被多个对象所共享,可以考虑缓存这种不可变类的实例
- [刘阳Java]_eayui-pagination分页组件_第5讲
分页组件也是很基本的应用,这里我只给出一段简单的代码 关键注意一点:分页组件可以在上面添加buttons按钮,或者自定义分页组件的外观.这些内容需要自行的查看EasyUI的API文档 <!DOC ...
- CF1330B题解
题意: 给定一个长为 \(n\) 序列 \(a\) ,问是否能分成两个排列,并输出方案 (排列:从 \(1-n\) 中选取不同的 \(n\) 个元素组成的序列) 思路: 观察数据范围可以猜出,这题 \ ...
- 整理最近用的Mongo查询语句
背景 最近做了几个规则逻辑.用到mongo查询比较多,就是查询交易信息跑既定规则筛选出交易商户,使用聚合管道进行统计和取出简单处理后的数据,用SQL代替业务代码逻辑的判断. 方法 MongoDB聚合使 ...
- Mysql分区表使用
一.什么是分区表 分区表就是按一定规则将一张表分割成多个部分,达到和物理分表同样的效果,但操作起来更 简单,不同于物理分表那样使用时还需要指定使用的数据表.对于使用者来说和操作普通表无差别. 二.优势 ...
- cJSON解析数据如何避免过多if-else,实现解耦
代码展示: 数据接收函数内,解析cJSON数据时,一不小心就会冒出来一大堆if语句在一个函数内,后续想要新增网络功能时,必然又会导致需要在mqtt订阅函数内去新增部分代码,实现解析新的报文. 这显然耦 ...
- dio框架访问云函数参数传递问题(以腾讯云中的云函数为例子)第一部
dd云函数其实比较普及,这里以腾讯云的云函数为例,传递参数完成简单的账号注册. 一.第一步先注册腾讯云账号,这里不过多阐述,接着点击 控制台 进入开发者界面.(注意提前进行实名认证) 二.开发者界面如 ...
- .net 知新:【4】NuGet简介和使用
在包管理以前我们在项目中引用第三方包通常是去下载dll放到项目中再引用,后来逐渐发展成各种包管理工具,nuget就是一种工具,适用于任何现代开发平台的基本工具可充当一种机制,通过这种机制,开发人员可以 ...
- C语言中变参函数传参探究
背景引入 近期在看一本书,叫做<嵌入式C语言自我修养>,写的内容对我帮助很大,是一本好书.在第6章,GNU C编译器扩展语法精讲一节,这本书给出了一些变参函数的例子: //1.变参函数初体 ...
- 浅谈C#取消令牌CancellationTokenSource
前言 相信大家在使用C#进行开发的时候,特别是使用异步的场景,多多少少会接触到CancellationTokenSource.看名字就知道它和取消异步任务相关的,而且一看便知大名鼎鼎的Cancella ...