zoukankan      html  css  js  c++  java
  • ServletContext与ServletConfig的详解及区别

    转自http://hi.baidu.com/huaxuelili/item/1704a03dbb5cd7f22784f4c6

     

    一、ServletContext详解
    ServletContext是servlet与servlet容器之间的直接通信的接口。Servlet容器在启动一个Web应用时,会为它创建一个servletContext对象。每个web应用有唯一的servletContext对象。同一个web应用的所有servlet对象共享一个serveltContext,servlet对象可以通过它来访问容器中的各种资源。
    servletContext接口提供的方法分为以下几种类型:
    用于在Web应用范围内存取共享数据的方法。
    注:web应用范围具有以下两层含义:
    (1) 表示有web应用的生命周期构成的时间段.
    (2) 表示在web应用的生命周期内所有web组件的集合。
     setAttribute(String name,java.lang.Object object):把一个java对象和一个属性名绑定,并存放到ServletContext中,参数name指定属性名,参数Object表示共享数据。
     getAttribute(String name):根据参数给定的属性名,返回一个Object类型的对象。
     getAttributeNames():返回一个Enumeration对象,该对象包含了所有存放在ServletContext中的属性名。
     removeAttribute(String name):根据参数指定的属性名,从servletContext对象中删除匹配的属性。
    访问当前Web应用的资源
     getContextpath():返回当前web应用的URL入口。
     getInitParameter(String name):返回web应用方位内的匹配的初始化参数值。在web.xml中<web-app>元素中<context-param>元素表示应用范围内的初始化参数。
     getInitParameterNames():返回一个Enumeration对象。
     getServletContextName():返回web应用的名字。即<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()

    二、ServletConfig详解
    Servlet容器初始化一个servlet对象时,会为这个servlet对象创建一个servletConfig对象。在servletConfig对象中包含了servlet的初始化参数信息。此外,servletConfig对象还与servletContext对象关联。Servlet容器在调用servlet对象的init(ServletConfig config)方法时,会把servletConfig对象当做参数传递给servlet对象。Init(ServletConfig config)方法会使得当前servlet对象与servletConfig对象建立关联关系。
    servletConfig接口中定义了一下方法:
     getInitParameter(String   name):根据给定的初始化参数,返回匹配的初始化参数值。
     getInitParameterNmes():返回一个Enumeration对象,里面包含了所有的初始化参数。
     getServletContext():返回一个servletContext()对象,
     getServltName():返回servlet的名字,即web.xml中的<servlet-name>的子元素的值。如果没有配置这个子元素,则返回servlet类的名字。
    例子:
    <servlet>
    <servlet-name>actionServlet</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <load-on-startup>0</load-on-startup>

    <init-param>
       <param-name>color</param-name>
       <param-value>red</param-value>
    </init-param>
    <init-param>
       <param-name>size</param-name>
       <param-value>16</param-value>
    </init-param>

    </servlet>
    <servlet-mapping>
    <servlet-name>actionServlet</servlet-name>
    <url-pattern>*.do</url-pattern>
    </servlet-mapping>
    如上,红色标记处为初始化参数,相当于公有参数。
    在servlet中:

    public class UserDateBaseServlet extends HttpServlet{
    String color = this.getInitParameter("color");
    String size = this.getInitParameter("size");
    System.out.println("颜色是:"+color+"字号是:"+size);
    }
    注:HttpServlt类继承了GenericServlet类,而GenericServlet类实现了ServletConfig接口,因此在HttpServlet类和GenericServlet类及子类中都可以直接调用ServletConfig接口中的方法。

    三、二者区别
    在看web.xml配置文件关于环境初始化参数的配置时,发现了ServletConfig与ServletContext这两个对象的应用,于是就写了一个Servlet来体验了一下。

    首先从作用范围来说,ServletConfig作用于某个特定的Servlet,即从该Servlet实例化,那么就开始有效,但是该Servlet之外的其他Servlet不能访问;ServletContext作用于某个web应用,即在一个web应用中相当于一个全局对象,在Servlet容器启动时就已经加载,对于不同的web应用,有不同的ServletContext。

    其次,来看一下二者参数的使用。如果一个参数为整个web应用所用,那么就配置为ServletContext参数,如下所示:

    <context-param>
       <param-name>encoding</param-name>
       <param-value>gb2312</param-value>
    </context-param>

    如果一个参数仅为一个Servlet所用,那么就应该配置为ServletConfig参数,如下所示:

    <servlet>
       <servlet-name>affice_add</servlet-name>
       <servlet-class>servlet.Affice_add</servlet-class>
       <init-param>
          <param-name>filepath</param-name>
         <param-value>/webContent/affice</param-value>
       </init-param>
    </servlet>

    最后,说明一下参数的获取。访问ServletConfig参数,取得ServletConfig对象后,调用getInitParameter()方法;访问ServletContext对象,只要调用现有的ServletConfig对象的getServletContext()即可,然后同样调用getInitParamter()方法就能获取参数。例如对于上面的参数,可以通过如下方法获取各自参数。

    public class TestServletConfig extends HttpServlet {
       ServletConfig config;

       public void init(ServletConfig config) {
           this.config=config;
       }

       public void doGet(HttpServletRequest request,HttpServletResponse response)
              throws ServletException,IOException {
           String filepath=(String)config.getInitParameter("filepath");
           System.out.println(filepath);
           String encode=(String)config.getServletContext().getInitParameter("encoding");
           System.out.println(encode);
       }

       public void destroy() {
       }
    }
    对上面Servlet编译后,在浏览器中输入http://localhost:8080/my/TestServletConfig(该链接地址与servlet在webx.xml中的配置有关)后,就可以分别对应输出/WebContent/affice和gb2312

  • 相关阅读:
    查询本地ip以及ip地址库查询
    python在linux中import cv2问题
    drf安装与APIView初步分析
    CBV源码分析
    RESTful规范
    Vue路由vue-router
    Django之ModelForm组件
    django路由的反向解析
    django路由系统及分发路由的本质
    前端以及django零碎补充
  • 原文地址:https://www.cnblogs.com/x_wukong/p/3365837.html
Copyright © 2011-2022 走看看