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可 ...
随机推荐
- Python基础——循环语句、条件语句、函数、类
注:运行环境 Python3 1.循环语句 (1)for循环 注:for i in range(a, b): #从a循环至b-1 for i in range(n): #从0循环至n-1 ...
- U1. 广度优先搜索(BFS)和 广度优先搜索(DFS)
广度优先搜索用栈(stack)来实现,整个过程可以想象成一个倒立的树形: 1.把根节点压入栈中. 2.每次从栈中弹出一个元素,搜索所有在它下一级的元素,把这些元素压入栈中.并把这个元素记为它下一级元素 ...
- ABP中的本地化处理(上)
今天这篇文章主要来总结一下ABP中的多语言是怎么实现的,在后面我们将结合ABP中的源码和相关的实例来一步步进行说明,在介绍这个之前我们先来看看ABP的官方文档,通过这个文档我们就知道怎样在我们的系统中 ...
- Jmeter CSV操作
统计行号列号 import java.io.BufferedReader; import java.io.FileReader; import java.io.File; print("== ...
- day0~day13
day0 day1 day2 day4 day5 day7 day9 day10 day12 day13
- python之SQLite笔记
sqlite3 打开文件并创建游标 conn = sqlite3.connect('adressbook.db')c = conn.cursor() 连接对象:sqlite3.connect('数据文 ...
- c++博客转载
C++ 中文件流(fstream)的使用方法及示例 http://blog.jobbole.com/108649/ qt中文乱码问题: https://blog.csdn.net/brave_hear ...
- Codeforces 1249 D2. Too Many Segments (hard version)
传送门 贪心 对于第一个不合法的位置,我们显然要通过删除几个覆盖了它的区间来使这个位置合法 显然删右端点更靠右的区间是更优的,所以就考虑优先删右端点靠右的,然后再考虑下一个不合法位置 用一个 $set ...
- CCF 201712-1 最小差值
题目: 问题描述 给定n个数,请找出其中相差(差的绝对值)最小的两个数,输出它们的差值的绝对值. 输入格式 输入第一行包含一个整数n. 第二行包含n个正整数,相邻整数之间使用一个空格分隔. 输出格式 ...
- 十三、Vue中的computed属性
以下抄自https://www.cnblogs.com/gunelark/p/8492468.html 看了网上很多资料,对vue的computed讲解自己看的都不是很清晰,今天忙里抽闲,和同事们又闲 ...