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>
ServletContextListener和ServletContext的更多相关文章
- Java ServletContextListener用法
ServletContext 被 Servlet 程序用来与 Web 容器通信.例如写日志,转发请求.每一个 Web 应用程序含有一个Context,被Web应用内的各个程序共享.因为Context可 ...
- [原创]java WEB学习笔记47:Servlet 监听器简介, ServletContext(Application 对象), HttpSession (Session 对象), HttpServletRequest (request 对象) 监听器,利用listener理解 三个对象的生命周期
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- 怎样使用ServletContextListener接口
ServletContext : 每一个web应用都有一个 ServletContext与之相关联. ServletContext对象在应用启动的被创建,在应用关闭的时候被销毁. ServletCon ...
- ServletContextListener作用(转)
ServletContext 被 Servlet 程序用来与 Web 容器通信.例如写日志,转发请求.每一个 Web 应用程序含有一个Context,被Web应用内的各个程序共享.因为Context可 ...
- ServletContextListener 解析用法
ServletContext 被 Servlet 程序用来与 Web 容器通信.例如写日志,转发请求.每一个 Web 应用程序含有一个Context,被Web应用内的各个程序共享.因为Context可 ...
- ServletContextListener 详解
1.首先来看一看源码 该类的源码 public interface ServletContextListener extends EventListener { /** * Receives noti ...
- ServletContextListener作用
ServletContext 被 Servlet 程序用来与 Web 容器通信.例如写日志,转发请求.每一个 Web 应用程序含有一个Context,被Web应用内的各个程序共享.因为Context可 ...
- web.xml中的ServletContextListener
要想了解ServletContextListener,先看看web.xml中的<listener>配置. 一)web.xml中的内容载入顺序: 首先能够肯定的是,载入顺序与它们在 web. ...
- ServletContextListener和ContextLoaderListener的区别
ServletContext 被 Servlet 程序用来与 Web 容器通信.例如写日志,转发请求.每一个 Web 应用程序含有一个Context,被Web应用内的各个程序共享.因为Context可 ...
随机推荐
- [知乎]鲲鹏920对比intel8180
作者:韩朴宇链接:https://www.zhihu.com/question/308298687/answer/568737742来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请 ...
- SQL入门经典(第四版)学习记录——SQL语法(二)
一.创建表 create table 表里包含什么类型的数据 表的名称是什么 主键 列的名称是什么 每一列的数据类型是什么 每一列的长度是多少 表里哪些列可以是空的 语法: create table ...
- kibana发音 logstash发音 ElasticSearch发音 音标 翻译
kibana [kɪbana] 剋吧那 kei ba na == 扩展 logstash [lɔɡ] [stæ:ʃ] 楼个四die吃 == ElasticSearch [ɪˈlæstɪk] [sɜːt ...
- char. 类型篇
对于强类型的c语言,类型贯穿着整个语言体系,掌握好类型,学c语言就相当上手 .. 计算机的内存被分成一个个的储存单元. 一个储存单元=1 byte=8 bit 对于基本整型类型.char = ...
- 官网下载CentOS教程(各版本)
1.进入官网,并点击下图所示的红框(alternative downloads) 官网网址:https://www.centos.org/download/ 2.在往下翻,可以看到如下图的历史版本, ...
- java 字符串处理的
@Test public void testString(){ /*字符串处理 */ String email="123456789@qq.com"; System.out.pri ...
- (九)Struts标签基础(二)
2.3 非表单标签 2.3.1 <s:actionerror>标签, this.addActionError("错误信息1"); //使用addActionErro ...
- (十一)mybatis之整合ehcache缓存
一.二级缓存 大家都知道使用mybatis就要先获取sqlsessionfactory,继而使用sqlsession来和数据库交互,每次只需要使用sqlsession对象提供的方法就好,当我们需要第一 ...
- shell取消键盘回显
使用下面这个命令取消回显 stty -echo 使用下面这个命令打开回显 stty echo
- rabbit MQ 的环境及命令使用(一)
RabbitMQ依赖erlang,所以先安装erlang,然后再安装RabbitMQ; 先安装erlang,双击erlang的安装文件即可,然后配置环境变量: ERLANG_HOME=D:\Progr ...