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 ServletExceptionIOException

◆ 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 ServletExceptionIOException

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 ServletExceptionIOException

◆ public void service(ServletRequest req,ServletResponse res) throws ServletExceptionIOException

 

二、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的详解及区别的更多相关文章

  1. ServletContext与ServletConfig的详解及区别

    转自http://hi.baidu.com/huaxuelili/item/1704a03dbb5cd7f22784f4c6 一.ServletContext详解ServletContext是serv ...

  2. Servlet技术——request、respone详解

    Servlet之request.respone详解 Request (一) 概述 request是Servlet.service()方法的一个参数,在客户端发出每个请求时,服务器都会创建一个reque ...

  3. 分布式缓存Memcached/memcached/memcache详解及区别

    先来解释下标题中的三种写法:首字母大写的Memcached,指的是Memcached服务器,就是独立运行Memcached的后台服务器,用于存储缓存数据的“容器”.memcached和memcache ...

  4. Sql Server 中 GAM、SGAM、PAM、IAM、DCM 和 BCM 的详解与区别

    Sql Server 中 GAM.SGAM.PAM.IAM.DCM 和 BCM 的详解与区别   GAM.SGAM.PAM.IAM.DCM 和 BCM 都是 SQL Server 中用来管理空间分配的 ...

  5. Python中%r和%s的详解及区别_python_脚本之家

    Python中%r和%s的详解及区别_python_脚本之家 https://www.jb51.net/article/108589.htm

  6. List、Set、Map详解及区别

    一.List接口 List是一个继承于Collection的接口,即List是集合中的一种.List是有序的队列,List中的每一个元素都有一个索引:第一个元素的索引值是0,往后的元素的索引值依次+1 ...

  7. C++的三种继承方式详解以及区别

    目录 目录 C++的三种继承方式详解以及区别 前言 一.public继承 二.protected继承 三.private继承 四.三者区别 五.总结 后话 C++的三种继承方式详解以及区别 前言 我发 ...

  8. web.xml 中的listener、 filter、servlet 加载顺序及其详解

    在项目中总会遇到一些关于加载的优先级问题,近期也同样遇到过类似的,所以自己查找资料总结了下,下面有些是转载其他人的,毕竟人家写的不错,自己也就不重复造轮子了,只是略加点了自己的修饰. 首先可以肯定的是 ...

  9. 转:web.xml 中的listener、 filter、servlet 加载顺序及其详解

    在项目中总会遇到一些关于加载的优先级问题,刚刚就遇到了一个问题,由于项目中使用了quartz任务调度,quartz在web.xml中是使用listener进行监听的,使得在tomcat启动的时候能马上 ...

随机推荐

  1. Oracle常用SQL语句大全

    常用Oracle数据库SQL语句汇总. 1.常用操作 --清空回收站purge recyclebin;--查询回收站select * from recyclebin--查询Oracle版本信息sele ...

  2. 剖析虚幻渲染体系(08)- Shader体系

    目录 8.1 本篇概述 8.2 Shader基础 8.2.1 FShader 8.2.2 Shader Parameter 8.2.3 Uniform Buffer 8.2.4 Vertex Fact ...

  3. Wordpress 4.6 任意命令执行漏洞(PwnScriptum)

    漏洞存在后台登录地方的找回密码页面:http://192.168.49.2:8080/wp-login.php?action=lostpassword 抓包进行修改包 输入一个存在的用户,然后点击获取 ...

  4. Git,Linux,Ubuntu,Tmux的常用命令

    常用的连接 Git命令 廖雪峰的Git教程 Git常用命令 ubuntu16.04之GitHub入门教程 Linux相关 tmux命令 Ubuntu常用命令速查手册 Linux 命令大全 其它工具 M ...

  5. 大数据学习(14)—— HBase进阶

    HBase读写流程 在网上找了一张图,这个画的比较简单,就拿这个图来说吧. 写流程 1.当Client发起一个Put请求时,首先访问Zookeeper获取hbase:meta表. 2.从hbase:m ...

  6. SQL Server 行转列 列转行操作

    1.多行转成一行(并以','分开) 表数据如下图: 查询结果如下图: SQL查询脚本: SELECT addPer, house_code = (STUFF((SELECT ',' + house_c ...

  7. 获取异常信息里再出异常就找不到日志了,我TM人傻了

    本系列是 我TM人傻了 系列第三期[捂脸],往期精彩回顾: 升级到Spring 5.3.x之后,GC次数急剧增加,我TM人傻了 这个大表走索引字段查询的 SQL 怎么就成全扫描了,我TM人傻了 最近组 ...

  8. Android NDK 直播推流与引流

    本篇介绍一下直播技术中推流与引流的简单实现. 1.流媒体服务器测试 首先利用快直播 app (其他支持 RTMP 推流与引流的 app 亦可)和 ffplay.exe 对流媒体服务器进行测试. 快直播 ...

  9. 阿里、腾讯、百度、网易、美团Android面试经验分享,拿到了百度、腾讯offer

    基本情况 2021届普通本科,Android开发岗. 此文主要是2020年秋招面试经验汇总,最终拿到了百度.腾讯的offer. 主要包括阿里三面,腾讯四面,百度三面,网易三面,美团一场面完. 阿里(由 ...

  10. Docker for windows安装与使用

    1.安装Docker for windows之前,需要将系统的hyper-v功能打开 2.下载Docker for windows进行安装 访问url:https://docs.docker.com/ ...