zoukankan      html  css  js  c++  java
  • 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 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

  • 相关阅读:
    Composite in Javascript
    Model Validation in Asp.net MVC
    HttpRuntime.Cache vs. HttpContext.Current.Cache
    Controller Extensibility in ASP.NET MVC
    The Decorator Pattern in Javascript
    The Flyweight Pattern in Javascript
    Model Binding in ASP.NET MVC
    Asp.net MVC
    jQuery Ajax 实例 全解析
    ASP.NET AJAX入门系列
  • 原文地址:https://www.cnblogs.com/daxiong225/p/8032503.html
Copyright © 2011-2022 走看看