JSP用ServletListener监听连接Mysql数据库

本例程所使用的运行环境及资源: 

1. Tomcat 5.52. Mysql 4.13. mysql jdbc驱动:3.1.13 

首先我们简单了解下servlet listener 

一,什么是Servlet的监听器 使用Listener接口,监听在容器中某一个执行程序,根据应用程序需求做出适当的响应. 

截至到Servlet2.4,共有8个Listener接口,6个Event类.二,Listener接口和Event类对应Listener接口,Event类ServletContextListener,ServletContextEventServletContextAttributeListener,ServletContextAttributeEventHttpSessionListener,HttpSessionEventHttpSessionActivationListener,HttpSessionEventHttpSessionAttributeListener,HttpSessionBindingEventHttpSessionBindingListener,HttpSessionBindingEventServletRequestListener,ServletRequestEventServletRequestAttributeListener,ServletRequestAttributeEvent 

分别介绍:ServletContext相关监听接口补充知识:通过ServletContext 的实例可以存取应用程序的全局对象以及初始化阶段的变量.在JSP文件中,application 是 ServletContext 的实例,由JSP容器默认创建.Servlet 中调用 getServletContext()方法得到 ServletContext 的实例.注意:全局对象即Application范围对象,初始化阶段的变量指在web.xml中,经由元素所设定的变量,它的范围也是Application范围,例如:Namebrowser当容器启动时,会建立一个Application范围的对象,若要在JSP网页中取得此变量时:String name = (String)application.getInitParameter("Name");或者使用EL时:${initPara.name}若是在Servlet中,取得Name的值方法:String name = (String)ServletContext.getInitParameter("Name"); 

1.ServletContextListener: 

用于监听WEB 应用启动和销毁的事件,监听器类需要实现

javax.servlet.ServletContextListener 接口.ServletContextListener 是 ServletContext 的监听者,如果 ServletContext 发生变化,如服务器启动时 ServletContext 被创建,服务器关闭时 ServletContext 将要被销毁. 

ServletContextListener接口的方法:

 void contextInitialized(ServletContextEvent sce)通知正在接受的对象,应用程序已经被加载及初始化. 

void contextDestroyed(ServletContextEvent sce)通知正在接受的对象,应用程序已经被载出.

 ServletContextEvent中的方法: 

ServletContext getServletContext()取得ServletContext对象 

 

2.ServletContextAttributeListener:用于监听WEB应用属性改变的事件,包括:增加属性,删除属性,修改属性,监听器类需要实现javax.servlet.ServletContextAttributeListener接口. 

ServletContextAttributeListener接口方法: 

void attributeAdded(ServletContextAttributeEvent scab)若有对象加入Application的范围,通知正在收听的对象

 void attributeRemoved(ServletContextAttributeEvent scab)若有对象从Application的范围移除,通知正在收听的对象 

void attributeReplaced(ServletContextAttributeEvent scab)若在Application的范围中,有对象取代另一个对象时,通知正在收听的对象

 ServletContextAttributeEvent中的方法

:java.lang.String getName()回传属性的名称

 java.lang.Object getValue()回传属性的值HttpSession相关监听接口

 

 1.HttpSessionBindingListener接口 

注意:HttpSessionBindingListener接口是唯一不需要再web.xml中设定的Listener当我们的类实现了HttpSessionBindingListener接口后,只要对象加入Session范围(即调用HttpSession对象的setAttribute方法的时候)或从Session范围中移出(即调用HttpSession对象的 removeAttribute方法的时候或Session Time out的时候)时,容器分别会自动调用下列两个方法: 

void valueBound(HttpSessionBindingEvent event)void valueUnbound(HttpSessionBindingEvent event)思考:如何实现记录网站的客户登录日志, 统计在线人数?2.HttpSessionAttributeListener接口HttpSessionAttributeListener监听HttpSession中的属性的操作.当 在Session增加一个属性时,激发attributeAdded(HttpSessionBindingEvent se) 方法;当在Session删除一个属性时,激发attributeRemoved(HttpSessionBindingEvent se)方法;当在Session属性被重新设置时,激发attributeReplaced(HttpSessionBindingEvent se) 方法.这和ServletContextAttributeListener比较类似.

 3.HttpSessionListener接口 

HttpSessionListener监听 

HttpSession的操作.当创建一个Session时,激发session Created(HttpSessionEvent se)方法;当销毁一个Session时,激发sessionDestroyed (HttpSessionEvent se)方法. 

4.HttpSessionActivationListener接口主要用于同一个Session转移至不同的JVM的情形.ServletRequest监听接口 

1.ServletRequestListener接口和ServletContextListener接口类似的,这里由ServletContext改为ServletRequest2.ServletRequestAttributeListener接口和ServletContextListener接口类似的,这里由ServletContext改为ServletRequest有的listener可用于统计网站在线人数及访问量. 

如下:服务器启动时(实现ServletContextListener监听器contextInitialized方法),读取数据库,并将其用一个计数变量保存在application范围内session创建时(实现HttpSessionListener监听器sessionCreated方法),读取计数变量加

1并重新保存服务器关闭时(实现ServletContextListener监听器contextDestroyed方法),

更新数据库

 三,实现监听器的简单基本步骤 

1,实现相应监听器接口2,实现监听器方法3,在web.xml中配置……..下面我们用Servlet Listener来连接MYSQL数据库首先创建一个监听器servlet,这个监听器用来初始化共享资源,本例中主要用来在应用中创建数据源,把这个类置于WEB-INF/classes/servlets/目录下,

代码如下:

 /*****ResourceManagerListener.java** 资源初始化监听器*/

 package servlets;

 

 import javax.servlet. * ; 

import javax.servlet.http. * ; 

import com.mysql.jdbc.jdbc2.optional. * ; 

public  class ResourceManagerListener implements ServletContextListener { 

private DataSource ds = null ; 

public  void contextInitialized(ServletContextEvent sce) 

{ ServletContext application = sce.getServletContext(); 

String jdbcurl = application.getInitParameter("jdbcURL"); 

String user = application.getInitParameter("user"); 

String password = application.getInitParameter("password"); 

try { 

ds = new MysqlConnectionPoolDataSource(); 

ds.setUrl(jdbcurl); ds.setUser(user); 

ds.setPassword(password); 

} catch (Exception e) 

{ application.log( " 无法创建数据源: " + e.getMessage()); return ;  

}  

application.setAttribute( " dataSource " ,ds);//将数据源变量置于应用作用域中 } 

public  void contextDestroyed(ServletContextEvent sce) { 

ServletContext application = sce.getServletContext(); application.removeAttribute("dataSource"); ds = null ; }

 } 

2:配置web.xml相关代码,代码如下: 

servlets.ResourceManagerListenerjdbcURL 

 jdbc:mysql://localhost:3306/dbsuserrootpasswordroot

 3:建立测试页面,测试页面代码如下:

<sql:query var ="dbinfo" dataSource ="${dataSource}" sql ="SELECT * FROM userinfo"  />  

 <meta http-equiv ="Content-Type" content ="text/html; charset=gb2312"/>

 数据库测试 <c:forEach items ="${dbinfo.rows}" var ="row"> 

<c:forEach items ="${row}" var ="column"><td align ="right">

${ fn:escapeXml(column.key)} 

<td align ="left" >${ fn:escapeXml(column.value)}

4:重新启动Tomcat应用,用http://localhost:8080/test/test.jsp的链接来执行此页面

4:重新启动Tomcat应用,用http://localhost:8080/test/test.jsp的链接来执行此页面

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注

您可以使用这些 HTML 标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>