jsp中监听器的使用

本内容是
Servlet监听器是给Web应用增加事件处理机制,以便更好地监视和控制Web应用的状态变化,从而在后台调用相应处理程序。 

监听对象

监听接口

监听事件

ServletRequest

ServletRequestListener

ServletRequestEvent

ServletRequestAttributeListener

ServletRequestAttributeEvent

HttpSession

HttpSessionListener

HttpSessionEvent

HttpSessionActivationListener

HttpSessionAttributeListener

HttpSessionBindingEvent

HttpSessionBindingListener

ServletContext

ServletContextListener

ServletContextEvent

ServletContextAttributeListener

ServletContextAttributeEvent

l可以监听Http会话活动情况、Http会话中属性设置情况,也可以监听Http会话的active、passivate情况等。该监听器需要使用到如下多个接口类:
ØHttpSessionListener
Ø HttpSessionActivationListener
ØHttpSessionAttributeListener
ØHttpSessionBindingListener
lHttpSessionListener:监听HttpSession的操作。
lHttpSessionActivationListener:监听Http会话active、passivate的情况。使用这个接口可以在JVM之间长久保存没有进行序列化的数据,或者是在移动session前后对序列化的对象执行一些附加的操作。
lHttpSessionAttributeListener:监听HttpSession中属性的操作。
lHttpSessionBindingListener:这个接口用于监听Http会话中对象的绑定信息。

Listener接口

Event类

HttpSessionListener

HttpSessionEvent

HttpSessionActivationListener

HttpSessionAttributeListener

HttpSessionBindingEvent

HttpSessionBindingListener

lHttpSessionAttributeListener接口方法有:
ØattributeAdded(HttpSessionBindingEvent se):当在Session增加一个属性时,调用此方法;
ØattributeRemoved(HttpSessionBindingEvent se):当在Session删除一个属性时,调用此方法;
ØattributeReplaced(HttpSessionBindingEvent se):在Session属性被重新设置时,调用此方法。

lHttpSessionBindingEvent当中的方法:
ØHttpSession getSession():可以获取Session对象
Øjava.lang.String getName:返回Session增加、删除或者替换的属性名称
Øjava.lang.Object getValue():返回Session增加、删除或者替换的属性的值

lHttpSessionListener接口方法有:
ØsessionCreated(HttpSessionEvent e):当创建一个Session时,调用该方法
ØsessionDestroyed(HttpSessionEvent e):当销毁一个Session时,调用该方法

lapplication是ServletContext的实例。
lServlet中调用getServletContext()方法得到ServletContext的实例。
l当容器启动时,会建立一个Application范围的对象。
lApplication参数可由<context-param>元素设定变量。设定如下: 

<context-param>

<param-name>Name</param-name>

<param-value>Jack</param-value>

</context-param>

l当容器启动时,会建立一个Application范围的对象,可通过如下方式获取此变量。 

String name = (String)application.getInitParameter("Name");

${initPara.name}

String name = (String)ServletContext.getInitParameter("Name"); 


l用于监听WEB应用启动和销毁的事件,监听器类需要实现javax.servlet.ServletContextListener接口
lServletContextListener是ServletContext的监听者,当ServletContext发生变化时,都会触发该监听
lServletContextListener接口的主要方法:
Øvoid contextInitialized(ServletContextEvent sce):通知正在接受的对象,应用程序已经被加载及初始化
Øvoid contextDestroyed(ServletContextEvent sce):通知正在接受的对象,应用程序已经被销毁
lServletContextListener接口的一个Event类
lServletContextEvent中的主要方法:
ØServletContext getServletContext()用于取得当前的ServletContext对象
lServletContextAttributeListener:用于监听WEB应用属性改变的事件,包括:增加属性、删除属性、修改属性,监听器类需要实现javax.servlet.ServletContextAttributeListener接口 
lServletContextAttributeListener接口主要方法 :
ØvoidattributeAdded(ServletContextAttributeEvent scae):若有对象加入Application的范围,通知正在收听的对象。
ØvoidattributeRemoved(ServletContextAttributeEvent scae):若有对象从Application的范围移除,通知正在收听的对象。
ØvoidattributeReplaced(ServletContextAttributeEvent scae):若在Application的范围中,有对象取代另一个对象时,通知正在收听的对象 
lServletContextAttributeEvent类中的方法:
Øjava.lang.String getName():返回属性的名称
Øjava.lang.Object getValue():返回属性的值  

lServletRequest监听是Servlet2.4规范中加入的新技术。可以监听客户端的请求 。使用到如下两个接口类:
ØServletRequestListener接口:用于监听客户端的请求初始化和销毁的事件,需要实现javax.servlet.ServletRequestListener接口
ØServletRequestAttributeListener:用于监听WEB应用属性改变的事件,包括:增加属性、删除属性、修改属性,监听器类需要实现javax.servlet.ServletRequestAttributeListener接口 

lServletRequestListener接口有两个方法:
ØrequestInitialized (ServletRequestEvent):通知当前对象,请求已经被加载及初始化
ØrequestDestroyed (ServletRequestEvent):通知当前对象,请求已经被消除。
lServletRequestEvent类中的方法:
ØServletRequest getServletRequest():获取ServletRequest对象;
ØServletContext getServletContext():获取ServletContext对象。
lServletRequestAttributeListener接口方法:
Øvoid attributeAdded

  (ServletRequestAttributeEvent e):向Request对象添加新属性。

Øvoid attributeRemoved

  (ServletRequestAttributeEvent e):从Request对象中删除属性。

Øvoid attributeReplaced

  (ServletRequestAttributeEvent e):替换对象中现有属性值 

lServletRequestAttributeEvent中的方法有:
Øjava.lang.String getName():返回Request增加、删除或者替换的属性名称
Øjava.lang.Object getValue():返回Request增加、删除或者替换的属性的值
l在web模块中的web.xml文件中进行声明,代码如下:

<?xml version="1.0"encoding="UTF-8"?>

<web-app>

......

  <listener>

  <listener-class>pageage.listenerclass</listener-class>

  </listener>

......

</web-app>   


下面使用一实例来说明监听器的使用
l程序要求
Ø通过监听器实现一个在线用户的显示和个数统计。
Ø用户登录时将用户名添加为HttpSession会话属性。
Ø登录后跳转到在线首页面,显示当前登录的用户名称、所有在线人的名称和个数。
Ø监听器能够监听ServletContext对象的创建和销毁,监听HttpSession对象相关的操作,包括创建、销毁以及属性的增加、删除、修改。
Ø把所有监听的事件日志写入txt文件。
l实现流程
Ø1.OnlineListener.java
ü实现对Http会话中的属性和ServletContext对象的操作
Ø2.OnlineUserList.java
ü保存当前用户信息,提供对用户信息的相应操作
Ø3.LoginDo.java
ü用户登录Servlet类,获取输入的用户名并添加到Http会话属性中
Ø4. ExitDo.jsp
ü用户退出Servlet类,把Http会话中的用户名属性销毁
Ø5. login.jsp
ü用户登录页面。表单包括一个输入用户名的文本框和一个提交按钮,表单Form提交到LoginDo这个Servlet进行登录
Ø6. index.jsp
ü判断是否登录,未登录跳转到登录页面。输出会话变量userName(当前登录用户)。通过静态类UserList.java的getUserCount()方法获取当前在线人数,通过静态方法getVector()获取存储在线用户的Vector对象,然后遍历输出所有在线用户名称。
l新建“Listener”工程。
l新建“handson.register”包。
l在包下建立OnlineListener.java监听器类,并在编辑区输入以下代码:


package handson.register;
import javax.servlet.ServletContextEvent;
import javax.servlet.http.HttpSessionAttributeListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionEvent;
import java.io.FileOutputStream;
import java.io.PrintWriter;
import java.util.Date;
import java.text.SimpleDateFormat;

public class OnlineListener implements HttpSessionAttributeListener{
	//编写添加和删除属性方法
	public void attributeAdded(HttpSessionBindingEvent e) {	
		UserList.addUser(String.valueOf(e.getValue())); 
		System.out.println("session(" + e.getSession().getId() + ")增加属性"
			+ e.getName() + ",值为" + e.getValue());
	}
		
	public void attributeRemoved(HttpSessionBindingEvent e) {
		UserList.removeUser(String.valueOf(e.getValue()));	
		System.out.println("session(" + e.getSession().getId() + ")移除属性"
			+ e.getName() + ",值为" + e.getValue());
	}
	//编写更改属性方法
	public void attributeReplaced(HttpSessionBindingEvent e) {
		String oldValue=String.valueOf(e.getValue());
		String newValue=
			String.valueOf(e.getSession().
				getAttribute(e.getName()));
		UserList.removeUser(oldValue); 
		UserList.addUser(newValue);
		System.out.println("session(" + e.getSession().getId() + ")属性"
			+ e.getName() + "的值,由"+oldValue+"更改为" + newValue);
	}
	//编写操作监听方法,Http会话的创建监听 ,
	public void sessionCreated(HttpSessionEvent e) {
		System.out.println("创建新会话session("+e.getSession().getId()+")");
	}

	//Http会话的销毁监听 
	public void sessionDestroyed(HttpSessionEvent e) {
		System.out.println("销毁会话session("+e.getSession().getId()+")");
	}
	//编写操作上下文方法,监听ServletContext创建
	public void contextInitialized(ServletContextEvent e) {
		System.out.println("ServletContext初始化......");
	}
	//监听ServletContext销毁
	public void contextDestroyed(ServletContextEvent e) {
		System.out.println("ServletContext被销毁......"); 
	}
	//编写输出信息方法
	private void print(String message) {	
		PrintWriter out = null;
		try {
			out = new PrintWriter(new 
				FileOutputStream("d:\\log.txt", true)); 
			out.println(new 
				SimpleDateFormat("yyyy-MM-dd HH:mm:ss").
				format(new Date())
				+ " " + message);
				out.close();
		}catch (Exception e){
				e.printStackTrace();
		}
	}
}

编写UserList类主要代码如下
package handson.register;
import java.util.Vector;

public class UserList {
	private static Vector onlineUsers=new Vector();
	public static void addUser(String userName){
		onlineUsers.addElement(userName);
	}
	public static void removeUser(String userName){
		onlineUsers.removeElement(userName);
	}
	//获取在线用户数量
	public static int getUserCount(){
		return onlineUsers.size();
	}
	public static Vector getVector(){
		return onlineUsers;
	} 
}

LoginDo类中编写用户登录代码如下
package handson.register;

import java.io.IOException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class LoginDo extends HttpServlet {
	private static final long serialVersionUID = 1L;
	protected  void doPost(HttpServletRequest req, 
		HttpServletResponse resp)throws IOException{
		String userName=req.getParameter("userName"); 
		HttpSession session=req.getSession();
		session.setAttribute("userName", userName); 
		resp.sendRedirect("index.jsp");
	}
} 

ExitDo类编写退出登录主要代码如下
package handson.register;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class ExitDo extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {
	private static final long serialVersionUID = 1L;	
	protected void doGet(HttpServletRequest req, 
		HttpServletResponse resp) 		
		throws ServletException, IOException {
		req.getSession().removeAttribute("userName");	
		resp.sendRedirect("login.jsp");
	}
} 

配置登录和退出Servlet :
<listener>
		<listener-class>
			handson.register.OnlineListener
		</listener-class>
	</listener>
  
  <servlet>
		<servlet-name>loginDo</servlet-name>
		<servlet-class>handson.register.LoginDo</servlet-class>
	</servlet>
	<servlet>
		<servlet-name>exitDo</servlet-name>
		<servlet-class>handson.register.ExitDo</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>loginDo</servlet-name>
		<url-pattern>/loginDo</url-pattern>
	</servlet-mapping>
	<servlet-mapping>
		<servlet-name>exitDo</servlet-name>
		<url-pattern>/exitDo</url-pattern>
	</servlet-mapping>

创建login.jsp页面
<form method="post" action="loginDo">
		<center>
			<h2>用户登录</h2>
			<hr/>
			<br/>
			用户名:
			<input type="text" name="userName"/>
			<br/>
			<input type="submit" value="登录" />
		</center>
	</form>

编写index.jsp页面中获得登录信息代码
 
<body>
    <%
		//如果未登录,转向登录页面
		if(session.getAttribute("userName")==null){
			response.sendRedirect("login.jsp");
		}
		Vector onlineUsers=UserList.getVector(); 
	%>
	<h2>登录成功</h2>
	欢迎你 <span style="color:red;">
	<%=session.getAttribute("userName") %>
	</span>     
	<a href="exitDo">退出登录</a>

	当前在线人数:<span style="color:red;">
		<%=UserList.getUserCount() %>人</span>
	<br/><br>
	在线用户名单 :
	<br/>	
	<select multiple="multiple" name="list"
		style="width:200px;height:250px">
	<%	
		for(int i=0;i<onlineUsers.size();i++){
			out.write("<option>"+onlineUsers.get(i)+"</option>");
		}
	%>
	</select> 

  </body>

运行显示结果:






  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值