码迷,mamicode.com
首页 > 其他好文 > 详细

ServletContextListener和ServletContext

时间:2017-11-14 22:31:27      阅读:264      评论:0      收藏:0      [点我收藏+]

标签:接口   正是   配置   size   blank   ram   contex   ping   target   

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>

ServletContextListener和ServletContext

标签:接口   正是   配置   size   blank   ram   contex   ping   target   

原文地址:http://www.cnblogs.com/lsohvaen001/p/7834708.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!