zoukankan      html  css  js  c++  java
  • ServletContextListener和ServletContext

    web开发中,每个人都必须要深刻掌握的技能——servlet,学习servlet,就必然要理解ServletContext(javax.servle.ServletContext)接口。

    先让我们看下Servlet的实现机制,创建一个servlet,必须要extends javax.servlet.http.HttpServlet类,那些神秘的ServletContext,ServletConfig接口都是怎么来的呢?让我们来看下他们的层次关系:

    画图工具没选好,画不出那种上下级效果...我来大致将下吧。上图中,最下面那个absract class HttpServlet就是我们创建一个servlet必须继承的父类,由图可见,HttpServlet又继承自GenericServlet,这个类我们接触比较少,因为它做的操作比较少,重要的是,GenericServlet实现了两个重要的接口:javax.servlet.Servlet、javax.servlet.ServletConfig。很熟悉吧,没错,我们servlet的生命周期中重要的几个方法正是来自与Servlet接口中的init()、service()、destroy()。再看ServletConfig接口,hey,man,那不就是我们熟悉的getServletContext()方法吗。现在,为什么我们的servlet中能直接调用getServletContext()等方法,一切是不是没那么神秘了?

    接下来,我们继续揭开Servlet的神秘面纱。

    Web容器(如tomcat)在启动的时候,它会为每个应用程序都创建一个对应的ServletContext对象,记住哦,是每个应用对应一个。上图中看到,ServletConfig中有一个getServletContext()的方法可以获得ServletContext对象,那是因为ServletConfig持有ServletContext对象的引用,所以在我们自己的servlet中,可以直接通过getServletContext()方法来获取ServletContext。

    由于一个web应用只有一个ServletContext,所有的servlet都要共享他,所以servlet对象之间可以通过ServletContext对象来实现通讯。

    示例:

    在AServlet中通过以下代码存入共享数据:

    ServletContext context = this.getServletContext();

    context.setAttribute("name","hello");

    在其他Servlet中通过如下代码获取共享数据:

    ServletContext context = this.getServletContext();

    String name = (String)context.getAttibute("name");

    通过上述例子,相信大家对ServletContext应该有一定的认识了,那接下来看下servletContext的getInitParameter()方法,此方法用于获取在web.xml中配置的servlet的启动参数,直接来个例子吧。

    web.xml文件:

    <context-param>
      <param-name>name</param-name>
      <param-value>zhangsan</param-value>
    </context-param>

    <servlet>
        <servlet-name>myServlet</servlet-name>
        <servlet-class>com.MyServlet</servlet-class>
        <init-param>
          <param-name>sex</param-name>
          <param-value>male</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>myServlet</servlet-name>
        <url-pattern>/myServlet</url-pattern>
    </servlet-mapping>

    MyServlet.java:

    ServletContext context=getServletConfig().getServletContext();

    String num=context.getInitParameter("name");// <context-param> 获取得到值

    String count=context.getInitParameter("sex");//<init-param> 获取不到值

    System.out.println("num:"+getServletConfig().getInitParameter("name"));//null获取不到值

    System.out.println("count:"+getServletConfig().getInitParameter("sex"));//male获取到值

    ServletContext的getInitParameter()方法是用于获取全局参数的,ServletConfig的getInitParameter()方法是用于获取当前servlet的参数。其原因正是因为ServletContext只有一份,ServletConfig却有多份。

    ServletContextListener,顾名思义,它能监听ServletContext的生命周期,当Servlet 容器启动或终止Web 应用时,会触发ServletContextEvent 事件,该事件由 ServletContextListener 来处理,此接口两个方法:

    contextDestroyed(ServletContextEvent sce):处理容器销毁,web应用生命周期中最晚执行

    contextInitialized(ServletContextEvent sce):处理容器初始化,web应用生命周期中最早调用

    实现该接口的Listener还需要在web.xml中加上相应配置:

    <listener>
    <listener-class>
    <!-- ServletContextListener的具体实现类 -->
    </listener-class>
    </listener>

  • 相关阅读:
    channel 功能解析
    Docker 使用 Jenkins 镜像创建容器(转)
    使用Gson将Object转String出现u003d 的原因
    Gradle基础
    JAVA HashMap 和 HashSet 的区别
    ViewStub基本用法
    String类的内存分配
    区块链--资产数字化之路
    选择排序
    冒泡排序
  • 原文地址:https://www.cnblogs.com/lsohvaen001/p/7834708.html
Copyright © 2011-2022 走看看