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的更多相关文章

  1. Java ServletContextListener用法

    ServletContext 被 Servlet 程序用来与 Web 容器通信.例如写日志,转发请求.每一个 Web 应用程序含有一个Context,被Web应用内的各个程序共享.因为Context可 ...

  2. [原创]java WEB学习笔记47:Servlet 监听器简介, ServletContext(Application 对象), HttpSession (Session 对象), HttpServletRequest (request 对象) 监听器,利用listener理解 三个对象的生命周期

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

  3. 怎样使用ServletContextListener接口

    ServletContext : 每一个web应用都有一个 ServletContext与之相关联. ServletContext对象在应用启动的被创建,在应用关闭的时候被销毁. ServletCon ...

  4. ServletContextListener作用(转)

    ServletContext 被 Servlet 程序用来与 Web 容器通信.例如写日志,转发请求.每一个 Web 应用程序含有一个Context,被Web应用内的各个程序共享.因为Context可 ...

  5. ServletContextListener 解析用法

    ServletContext 被 Servlet 程序用来与 Web 容器通信.例如写日志,转发请求.每一个 Web 应用程序含有一个Context,被Web应用内的各个程序共享.因为Context可 ...

  6. ServletContextListener 详解

    1.首先来看一看源码 该类的源码 public interface ServletContextListener extends EventListener { /** * Receives noti ...

  7. ServletContextListener作用

    ServletContext 被 Servlet 程序用来与 Web 容器通信.例如写日志,转发请求.每一个 Web 应用程序含有一个Context,被Web应用内的各个程序共享.因为Context可 ...

  8. web.xml中的ServletContextListener

    要想了解ServletContextListener,先看看web.xml中的<listener>配置. 一)web.xml中的内容载入顺序: 首先能够肯定的是,载入顺序与它们在 web. ...

  9. ServletContextListener和ContextLoaderListener的区别

    ServletContext 被 Servlet 程序用来与 Web 容器通信.例如写日志,转发请求.每一个 Web 应用程序含有一个Context,被Web应用内的各个程序共享.因为Context可 ...

随机推荐

  1. Alt+~,Alt+Tab

    Alt+~可以很方便的切换同一个软件中的内容. Alt+Tab可以很方便的切换不同软件之间的内容. 熟练使用,很方便.

  2. java23种设计模式之八: 工厂方法模式

    定义: 定义一个创建产品对象的工厂接口,将产品对象的实际创建工作推迟到具体子工厂类当中.这满足创建型模式中所要求的“创建与使用相分离”的特点. 我们把被创建的对象称为“产品”,把创建产品的对象称为“工 ...

  3. 1.1Spring Boot 环境配置和常用注解

    Spring Boot常用注解:@Service: 注解在类上,表示这是一个业务层bean@Controller:注解在类上,表示这是一个控制层bean@Repository: 注解在类上,表示这是一 ...

  4. 题解 luoguP3554 【[POI2013]LUK-Triumphal arch】

    代码的关键部分 inline void dfs(int u,int fa) { ; for(int i=first[u]; i; i=nxt[i]) { int v=go[i]; if(v==fa)c ...

  5. python学习-42 装饰器 --- 函数闭包1

    函数闭包举例: def father(name): print('hello world') def son(): print('儿子说:我的爸爸是%s' % name) def grandfson( ...

  6. python笔记007-函数

    昨日简要: 1.文件操作: 1.1获得句柄: f = open(‘one.txt’,mode=’’,encoding=’utf-8’) f = open(‘../’) à返回上一层 f = open( ...

  7. 小程序文案过长,‘收起/展开’文字,createSelectorQuery 获取节点成功,boundingClientRect 返回信息null

    问题描述: wxml中id是动态生成的. 获取节点信息是在onReady生命周期函数内延时500ms执行的,select(id)可以获取全部节点信息,boundingClientRect (rect) ...

  8. Linux学习之如何让普通用户获得ROOT权限

    https://blog.csdn.net/qq_41940950/article/details/81044594

  9. 解决使用绝对定位absolute后,margin:0 auto居中方法失效(转)

    https://blog.csdn.net/qq_40678503/article/details/82780680

  10. ( 十二)Json的使用(上)

    一.什么是JSON 1.1 javaScript中定义对象的几种方式 使用内置对象 自定义对象构造 使用JSON符号  (1)使用内置对象 JavaScript可用的内置对象可分为两种: 1,Java ...