• 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

  • 相关阅读:
    map映射的用法
    相似的字串(hash+二分)
    进制 /字符串 hash
    CF#632 C.Eugene and an array
    2020牛客寒假算法基础集训营6 H-云
    Educational Codeforces Round 80 (Div. 2)
    Codeforces Round #601 (Div. 2)补题
    luogu-单调队列/单调栈专题
    Comet OJ
    Comet OJ
  • 原文地址:https://www.cnblogs.com/daxiong225/p/8032503.html
Copyright © 2020-2023  润新知