ServletContextListener Servlet Listener 示例

ServletContextListener是我们拥有的许多Servlet Listener之一,这是Java Web Application系列中的第五篇文章,您可能还想查看之前的四篇文章。

Java Web Application 2. Servlets in Java 3. Servlet Session Management 4. Servlet Filter

服务员听力

ServletContextListener, servlet listener, servlet listener example, ServletContextListener example In this tutorial, we will look into servlet listener, benefits of servlet listeners, some common tasks that we can do with listeners, servlet API listener interfaces and Event objects. In the end we will create a simple web project to show example of commonly used Listener implementation for ServletContext, Session and ServletRequest.

為什麼我們要使用 Servlet Listener?(#servlet-listener) 2. Servlet Listener Interfaces and Event Objects 3. Servlet Listener Configuration 6. [ServletContextAttributeListener]#(ServletContextAttributeListener) 5. ServletContextLeristener 6. [ServletContextAttributeListener]#(ServletContextAtt

我们知道,使用`ServletContext',我们可以创建一个具有应用范围的属性,所有其他服务器都可以访问,但我们可以初始化ServletContext init参数,在部署描述符(web.xml)中仅作String. 如果我们的应用程序面向数据库, 我们希望在 ServletContext 为数据库连接设置一个属性 。 如果应用程序有一个单一的切入点(用户登录),那么可以在第一个服务器请求中完成,但如果我们有多个切入点,那么在任何地方完成,将会导致大量的代码冗余. 另外,如果数据库被关闭或配置不当,我们将不知道直到第一个客户端请求来到服务器. 为了处理这些场景,servlet API提供了听取器接口,我们可以执行和配置来聆听一个事件并进行某些操作. ** Event ** 是某事的发生,在网络应用世界中,一个事件可以是应用程序初始化,破坏应用程序,客户端请求,创建/破坏会话,会话中的属性修改等. Servlet API 提供了不同类型的收听器接口,我们可以在web.xml中执行并配置,以便在某个特定事件发生时处理某事. 例如,在以上情景中,我们可以为应用程序启动事件创建一个倾听器来读取上下文参数并创建数据库连接,并将其设定为上下文属性,供其他资源使用。 QQ 服务器收听器接口和事件对象

Servlet API 为不同类型的事件提供不同类型的倾听器。倾听器接口声明与一组类似事件工作方法,例如,我们有 ServletContext Listener来倾听启动和关闭事件的背景。

  1. javax.servlet.AsyncEvent -- -- 当在Servlet请求上启动同步操作时(通过给Servlet Request#startAsync或Servlet Request#stAsync(Servlet Request,ServletResponse))的呼叫)被解雇的事件已完成、超时或产生错误。
  2. javax.servlet.http.HtpSessionBinding 事件 - 此类事件要么发送到从会话绑定或未绑定时执行 HttpSessionBindingListers 的对象,要么发送到在 web.xml 中配置的 HttpSessionAttize Listers 任何属性绑定、未绑定或替换到会话中。 会话以呼叫 Httpsession 约束对象 。 将对象通过呼叫 HttpSession 来属性和解封。 删除属性 。 当对象从会话中删除时, 我们可以使用此事件来清理活动 。
  3. ** javax. servlet.http.Httpsession 活动** - 这是网络应用程序中事件更改会话通知的类 。
  4. ** javax. servlet. Servlet ContextAttize 事件** - 关于网络应用程序 ServletContext 属性变化的通知的事件类.
  5. **javax. servlet. ServletContextEvent ** - 这是更改网络应用程序 servlet 上下文的事件类 。
  6. ** javax. servlet 。 服务请求 事件** -- -- 此类事件表示服务请求的生命周期事件。 事件来源于此网络应用程序的ServletContext. (_) )7. javax. servlet.Servlet 请求属性 事件 - 这是应用程序中服务器请求属性更改通知的事件类 。 (单位:千美元) (英语)

Servlet API 提供以下 Listener 接口。

  1. javax.servlet.AsyncListener - 接收关于ServletContext生命周期变化的通知活动的接口. .Servlet.servlet.servlet.servlet.servlet.servlet.syncListers** - 接收关于ServletContext生命周期变化的通知活动的接口. 3.servlet.servlet.servlet.ServtextTextAprestListers** - 接收关于ServletContext属性变化的通知活动的接口.( _serv.serv.serv.servt.servt.serv.serv.serv.t.serv.serv.serv. )7. javax.servlet.http.HttpSessionBindingListener - 当一个对象受会话约束或未受会话约束时,该对象要被通知.
  2. javax.servlet.HttpSessionListener - 用于接收HtpSession属性变化的通知事件的接口.
  3. javax.servlet.http.HttpSessionActivationListener - 约束到会话的物体可以听容器活动,通知它们会话将被钝化并启动会话. 在VMs之间迁移会话或持续会话的容器必须通知执行HttpSession Activation Listener的会话的所有属性。 (_) )10 (英语). QQ 服务器收听器配置( _)

我们可以使用 @WebListener [annotation](/community/tutorials/java-annotations Java Annotations Tutorial with Custom Annotation Example and Parsing using Reflection)来宣布一个类为Listener,但该类应该实现一个或多个Listener接口。

1<listener>
2    <listener-class>
3    com.journaldev.listener.AppContextListener
4    </listener-class>
5</listener>
  1. 服务器倾听器示例

Let's create a simple web application to see servlet listener in action. We will create dynamic web project in Eclipse ServletListenerExample those project structure will look like below image. Servlet Listener, Servlet Listener Example, ServletContextListener web.xml: In deployment descriptor, I will define some context init params and listener configuration.

 1<?xml version="1.0" encoding="UTF-8"?>
 2<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://java.sun.com/xml/ns/javaee" xsi:schemaLocation="https://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
 3  <display-name>ServletListenerExample</display-name>
 4
 5  <context-param>
 6    <param-name>DBUSER</param-name>
 7    <param-value>pankaj</param-value>
 8  </context-param>
 9  <context-param>
10    <param-name>DBPWD</param-name>
11    <param-value>password</param-value>
12  </context-param>
13  <context-param>
14    <param-name>DBURL</param-name>
15    <param-value>jdbc:mysql://localhost/mysql_db</param-value>
16  </context-param>
17
18  <listener>
19    <listener-class>com.journaldev.listener.AppContextListener</listener-class>
20  </listener>
21  <listener>
22    <listener-class>com.journaldev.listener.AppContextAttributeListener</listener-class>
23  </listener>
24  <listener>
25    <listener-class>com.journaldev.listener.MySessionListener</listener-class>
26  </listener>
27  <listener>
28    <listener-class>com.journaldev.listener.MyServletRequestListener</listener-class>
29  </listener>
30</web-app>

DBConnectionManager:这是数据库连接的类,为了简单,我不提供实际数据库连接的代码。

 1package com.journaldev.db;
 2
 3import java.sql.Connection;
 4
 5public class DBConnectionManager {
 6
 7    private String dbURL;
 8    private String user;
 9    private String password;
10    private Connection con;
11    
12    public DBConnectionManager(String url, String u, String p){
13    	this.dbURL=url;
14    	this.user=u;
15    	this.password=p;
16    	//create db connection now
17    	
18    }
19    
20    public Connection getConnection(){
21    	return this.con;
22    }
23    
24    public void closeConnection(){
25    	//close DB connection here
26    }
27}

MyServlet:一个简单的 servlet 类,我将与会话、属性等工作。

 1package com.journaldev.servlet;
 2
 3import java.io.IOException;
 4import java.io.PrintWriter;
 5
 6import javax.servlet.ServletContext;
 7import javax.servlet.ServletException;
 8import javax.servlet.annotation.WebServlet;
 9import javax.servlet.http.HttpServlet;
10import javax.servlet.http.HttpServletRequest;
11import javax.servlet.http.HttpServletResponse;
12import javax.servlet.http.HttpSession;
13
14@WebServlet("/MyServlet")
15public class MyServlet extends HttpServlet {
16    private static final long serialVersionUID = 1L;
17
18    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
19    		ServletContext ctx = request.getServletContext();
20    		ctx.setAttribute("User", "Pankaj");
21    		String user = (String) ctx.getAttribute("User");
22    		ctx.removeAttribute("User");
23    		
24    		HttpSession session = request.getSession();
25    		session.invalidate();
26    		
27    		PrintWriter out = response.getWriter();
28    		out.write("Hi "+user);
29    }
30
31}

现在我们将实施倾听者类,我为常用的倾听者提供示例倾听者类 - ServletContextListener, ServletContextAttributeListener, ServletRequestListener和HttpSessionListener。

我们将阅读 servlet 背景 init 参数,创建 DBConnectionManager 对象,并将其设置为 ServletContext 对象的属性。

 1package com.journaldev.listener;
 2
 3import javax.servlet.ServletContext;
 4import javax.servlet.ServletContextEvent;
 5import javax.servlet.ServletContextListener;
 6import javax.servlet.annotation.WebListener;
 7
 8import com.journaldev.db.DBConnectionManager;
 9
10@WebListener
11public class AppContextListener implements ServletContextListener {
12
13    public void contextInitialized(ServletContextEvent servletContextEvent) {
14    	ServletContext ctx = servletContextEvent.getServletContext();
15    	
16    	String url = ctx.getInitParameter("DBURL");
17    	String u = ctx.getInitParameter("DBUSER");
18    	String p = ctx.getInitParameter("DBPWD");
19    	
20    	//create database connection from init parameters and set it to context
21    	DBConnectionManager dbManager = new DBConnectionManager(url, u, p);
22    	ctx.setAttribute("DBManager", dbManager);
23    	System.out.println("Database connection initialized for Application.");
24    }
25
26    public void contextDestroyed(ServletContextEvent servletContextEvent) {
27    	ServletContext ctx = servletContextEvent.getServletContext();
28    	DBConnectionManager dbManager = (DBConnectionManager) ctx.getAttribute("DBManager");
29    	dbManager.closeConnection();
30    	System.out.println("Database connection closed for Application.");
31    	
32    }
33    
34}

30、### ServletContextAttributeListener

一个简单的实现,用于在 servlet 环境中添加、删除或更换属性时记录事件。

 1package com.journaldev.listener;
 2
 3import javax.servlet.ServletContextAttributeEvent;
 4import javax.servlet.ServletContextAttributeListener;
 5import javax.servlet.annotation.WebListener;
 6
 7@WebListener
 8public class AppContextAttributeListener implements ServletContextAttributeListener {
 9
10    public void attributeAdded(ServletContextAttributeEvent servletContextAttributeEvent) {
11    	System.out.println("ServletContext attribute added::{"+servletContextAttributeEvent.getName()+","+servletContextAttributeEvent.getValue()+"}");
12    }
13
14    public void attributeReplaced(ServletContextAttributeEvent servletContextAttributeEvent) {
15    	System.out.println("ServletContext attribute replaced::{"+servletContextAttributeEvent.getName()+","+servletContextAttributeEvent.getValue()+"}");
16    }
17
18    public void attributeRemoved(ServletContextAttributeEvent servletContextAttributeEvent) {
19    	System.out.println("ServletContext attribute removed::{"+servletContextAttributeEvent.getName()+","+servletContextAttributeEvent.getValue()+"}");
20    }
21    
22}

HttpSessionListener

一个简单的实现,用于在会话创建或破坏时记录事件。

 1package com.journaldev.listener;
 2
 3import javax.servlet.annotation.WebListener;
 4import javax.servlet.http.HttpSessionEvent;
 5import javax.servlet.http.HttpSessionListener;
 6
 7@WebListener
 8public class MySessionListener implements HttpSessionListener {
 9
10    public void sessionCreated(HttpSessionEvent sessionEvent) {
11    	System.out.println("Session Created:: ID="+sessionEvent.getSession().getId());
12    }
13
14    public void sessionDestroyed(HttpSessionEvent sessionEvent) {
15    	System.out.println("Session Destroyed:: ID="+sessionEvent.getSession().getId());
16    }
17    
18}

36###服务RequestListener

简单地实现ServletRequestListener接口,在请求初始化和破坏时登录ServletRequest IP地址。

 1package com.journaldev.listener;
 2
 3import javax.servlet.ServletRequest;
 4import javax.servlet.ServletRequestEvent;
 5import javax.servlet.ServletRequestListener;
 6import javax.servlet.annotation.WebListener;
 7
 8@WebListener
 9public class MyServletRequestListener implements ServletRequestListener {
10
11    public void requestDestroyed(ServletRequestEvent servletRequestEvent) {
12    	ServletRequest servletRequest = servletRequestEvent.getServletRequest();
13    	System.out.println("ServletRequest destroyed. Remote IP="+servletRequest.getRemoteAddr());
14    }
15
16    public void requestInitialized(ServletRequestEvent servletRequestEvent) {
17    	ServletRequest servletRequest = servletRequestEvent.getServletRequest();
18    	System.out.println("ServletRequest initialized. Remote IP="+servletRequest.getRemoteAddr());
19    }
20    
21}

现在,当我们将部署我们的应用程序并访问MyServlet在浏览器中的URL https://localhost:8080/ServletListenerExample/MyServlet,我们将在服务器日志文件中看到以下日志。

 1ServletContext attribute added::{DBManager,com.journaldev.db.DBConnectionManager@4def3d1b}
 2Database connection initialized for Application.
 3ServletContext attribute added::{org.apache.jasper.compiler.TldLocationsCache,org.apache.jasper.compiler.TldLocationsCache@1594df96}
 4
 5ServletRequest initialized. Remote IP=0:0:0:0:0:0:0:1%0
 6ServletContext attribute added::{User,Pankaj}
 7ServletContext attribute removed::{User,Pankaj}
 8Session Created:: ID=8805E7AE4CCCF98AFD60142A6B300CD6
 9Session Destroyed:: ID=8805E7AE4CCCF98AFD60142A6B300CD6
10ServletRequest destroyed. Remote IP=0:0:0:0:0:0:0:1%0
11
12ServletRequest initialized. Remote IP=0:0:0:0:0:0:0:1%0
13ServletContext attribute added::{User,Pankaj}
14ServletContext attribute removed::{User,Pankaj}
15Session Created:: ID=88A7A1388AB96F611840886012A4475F
16Session Destroyed:: ID=88A7A1388AB96F611840886012A4475F
17ServletRequest destroyed. Remote IP=0:0:0:0:0:0:0:1%0
18
19Database connection closed for Application.

注意日志的序列,它是执行的顺序. 最后一个日志将出现在你关闭应用程序或关闭容器时。

这是所有听者在servlet,我们将看看饼干和一些常见servlet的例子接下来. 你可以下载的项目从下面的链接和玩它来了解更多。

下载服务器听众示例项目

请参阅关于 系列的下一篇文章(社区/教程/java-servlet-cookies-example Servlet Cookie 示例教程)

Published At
Categories with 技术
Tagged with
comments powered by Disqus