JSP/Servlet 中的事件处理写过AWT或Swing程序的人一定对桌面程序的事件处理机制印象深刻:通过实现Listener接口的类可以在特定事件(Event)发生时,呼叫特定的方法来对事件进行响应。
其实我们在编写JSP/Servle程序时,也有类似的事件处理机制,所不同的是在JSP/Servlet中是在web.xml中注册Listener,由Container在特定事件发生时呼叫特定的实现Listener的类。
ServletContextListener 一个典型的应用就是给web程序设置一些常用的常量(例如全局的path)或者是在程序启动的时候就去联系数据库。下面是一个在程序启动时连接数据库的例子。
1):web.xml里。<listener> <listener-class> com.abchina.hermes.util.StartupListener </listener-class> </listener>
2):
package com.abchina.hermes.util;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import org.apache.log4j.Logger;
import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
public class StartupListener implements ServletContextListener {
private static Logger log = Logger.getLogger(StartupListener.class);
public void contextDestroyed(ServletContextEvent arg0) {
}
public void contextInitialized(ServletContextEvent event) {
if(log.isInfoEnabled()){
log.info("Initialization Start..............");
}
ServletContext servletContext = event.getServletContext();
// 安装全局context和加载静态数据
setupContext(servletContext);
if (log.isInfoEnabled()) {
log.info("Initialization Complete ............. [OK]");
}
}
public static void setupContext(ServletContext context) {
ApplicationContext applicationContext = WebApplicationContextUtils
.getRequiredWebApplicationContext(context);
SpringUtil.setCtx(applicationContext);
// 加载静态数据
initData(applicationContext);
}
/**
* 加载静态数据和基础数据
*/
private static void initData(ApplicationContext applicationContext) {
// 通过统一的静态参数定义
try {
DataItemsFactory.getMapInstance();
} catch (Exception ex) {
if (log.isInfoEnabled()) {
log.info("加载静态数据和基础数据失败......................");
}
ex.printStackTrace();
}
}
}
3)spring的applicationContext设置
package com.abchina.hermes.util;
import org.springframework.context.ApplicationContext;
public class SpringUtil {
public static ApplicationContext ctx;
public static ApplicationContext getCtx() {
return ctx;
}
public static void setCtx(ApplicationContext ctx) {
SpringUtil.ctx = ctx;
}
}
4)应用applicationContext。用它可以得到注册的service或者dao类。以便访问数据库
package com.abchina.hermes.util;
import java.io.File;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
import org.springframework.context.ApplicationContext;
import com.abchina.hermes.platform.sysmgr.domain.CommParaClass;
import com.abchina.hermes.platform.sysmgr.domain.CommParaValu;
import com.abchina.hermes.platform.sysmgr.service.IDataFactoryService;
import com.abchina.hermes.platform.sysmgr.web.vo.CommParaValuVo;
import com.abchina.hermes.util.CommonTools;
import com.abchina.hermes.util.AjaxUtil;
public class DataItemsFactory {
// 初始化Spring 工具
private static ApplicationContext ctx;
static {
ctx = SpringUtil.getCtx();
}
private static IDataFactoryService getdataService(){
return (IDataFactoryService)ctx.getBean("dataService");
}
/**
* dataClassid-->jsonList
*/
private static HashMap<String, String> dataMap=null;
public static HashMap<String, String> getMapInstance() {
File dataConstantFile = new File("C:/DataConstant.java");
if(dataMap==null){
try {
dataMap = new HashMap<String, String>();
CommParaClass dataClass=new CommParaClass();
CommParaValu data = new CommParaValu();
List classli=getdataService().findAllClasses(dataClass);
//写文件头
String head =" package com.abchina.hermes.common; " +
" public class DataConstant { ";
FileUtil.coverToFileByFileWriter(dataConstantFile, head);
for(int i=0;classli!=null&&i<classli.size();i++){
dataClass=(CommParaClass)classli.get(i);
CommonTools.info("...............【"+dataClass.getCP_Name()+"】分类信息..................");
// 写常量文件
String comment ="/**"+dataClass.getCP_Name()+" **/";
String strContent = comment+" public static String "+dataClass.getCP_ClasId()+" = \""+dataClass.getCP_ClasId()+"\";";
FileUtil.appendToFileByFileWriter(dataConstantFile, strContent);
data.setCPV_ClasId(dataClass.getCP_ClasId());
List datali=getdataService().getAllDataItems(data);
List li2=new ArrayList();
String[] key_value=null;
for(int j=0;j<datali.size();j++){
CommParaValuVo dataVo = (CommParaValuVo)datali.get(j);
key_value= new String[]{dataVo.getCPV_Name(),dataVo.getST_Value()};
String subkey ="/**"+dataClass.getCP_Name()+"-->"+dataVo.getST_Value()+" **/";
String key = dataClass.getCP_ClasId()+"_"+dataVo.getCPV_Name();
subkey +="public static String "+key+" = \""+dataVo.getCPV_Name()+"\";";
FileUtil.appendToFileByFileWriter(dataConstantFile,subkey);
li2.add(key_value);
}
String jsonString=AjaxUtil.getJsonString(li2);
dataMap.put(dataClass.getCP_ClasId(), jsonString);
}
//写文件尾部
FileUtil.appendToFileByFileWriter(dataConstantFile, "}"+"//更新时间:"+new Date().toLocaleString());
} catch (RuntimeException e) {
dataMap=null;
e.printStackTrace();
}
}
//System.out.println(dataMap.size());
return dataMap;
}
/**
*
* 功能:刷新内存
* 作者:zlj
* 日期:2009-5-19
* 版本:0.1
*/
public static void flashCacheMap() {
dataMap.clear();
dataMap = null;
DataItemsFactory.getMapInstance();
}
/**
* 得到一个数据项String。每个元素是一个json格式的数据项
* @param classId
* @return list
*/
public static String getJsonListByClassId(String classId){
String json= getMapInstance().get(classId);
return json;
}
/**
* get a value by classid & key .||根据种类id和值 得到字符串<br/>
* a json item example:[{'key':'01','value':'系统管理岗'},{'key':'02','value':'产品管理岗'},{'key':'03','value':'产品分析岗'}]
*/
public static String getValueByClassIdKey(String classId,String Key){
String jsonStr = getMapInstance().get(classId);
String value="";
if(jsonStr==null||Key==null)return "";
int index =jsonStr.indexOf(Key);
if(index>0){
JSONArray jsons = JSONArray.fromString(jsonStr);
for(int i =0;i<jsons.length();i++){
JSONObject json = jsons.getJSONObject(i);
if(json.get("key").toString().equals(Key)){
value = json.getString("value");
}
}
}
return value;
}
/**
* get a key by classid & value .||根据种类id和字符串 得到数据值<br/>
* a json item example:[{'key':'01','value':'系统管理岗'},{'key':'02','value':'产品管理岗'},{'key':'03','value':'产品分析岗'}]
*/
public static String getKeyByClassidValue(String classId,String Value){
String jsonStr = getMapInstance().get(classId);
String key="";
int index =jsonStr.indexOf(Value);
if(index>0){
JSONArray jsons = JSONArray.fromString(jsonStr);
for(int i =0;i<jsons.length();i++){
JSONObject json = jsons.getJSONObject(i);
if(json.get("value").toString().equals(Value)){
key = json.getString("key");
}
}
}
return key;
}
/**
* 测试方法 test method. run it by self
* @param args
*/
public static void main(String[] args){
String jsonStr="[{'key':'01','value':'系统管理岗'},{'key':'02','value':'产品管理岗'},{'key':'03','value':'产品分析岗'}]";
String key="02";
int index =jsonStr.indexOf(key);
if(index>-1){
String value = "";
JSONArray jsons = JSONArray.fromString(jsonStr);
for(int i =0;i<jsons.length();i++){
JSONObject json = jsons.getJSONObject(i);
if(json.get("key").toString().equals(key)){
value = json.getString("value");
}
}
System.out.println("value:"+value);
}
key="";String value="产品管理岗";
int index1 =jsonStr.indexOf(value);
if(index>0){
JSONArray jsons = JSONArray.fromString(jsonStr);
for(int i =0;i<jsons.length();i++){
JSONObject json = jsons.getJSONObject(i);
if(json.get("value").toString().equals(value)){
key = json.getString("key");
}
}
System.out.print("key:"+key);
}
}
}
下面是接活的一段网文
------------------------------------------------------------------------------------------------------------------------------------------
JSP/Servlet 中的事件处理写过AWT或Swing程序的人一定对桌面程序的事件处理机制印象深刻:通过实现Listener接口的类可以在特定事件(Event)发生时,呼叫特定的方法来对事件进行响应。
其实我们在编写JSP/Servle程序时,也有类似的事件处理机制,所不同的是在JSP/Servlet中是在web.xml中注册Listener,由Container在特定事件发生时呼叫特定的实现Listener的类。
1. Servlet中的Listener和Event:
在JSP 2.0/Servlet 2.4中,共有八个Listener接口,六个Event类别。
ServletContextListener接口
[接口方法] contextInitialized()与 contextDestroyed()
[接收事件] ServletContextEvent
[触发场景] 在Container加载Web应用程序时(例如启动 Container之后),会呼叫contextInitialized(),而当容器移除Web应用程序时,会呼叫contextDestroyed ()方法。
ServletContextAttributeListener
[接口方法] attributeAdded()、 attributeReplaced()、attributeRemoved()
[接收事件] ServletContextAttributeEvent
[触发场景] 若有对象加入为application(ServletContext)对象的属性,则会呼叫attributeAdded(),同理在置换属性与移除属性时,会分别呼叫attributeReplaced()、attributeRemoved()。
HttpSessionListener
[接口方法] sessionCreated()与sessionDestroyed ()
[接收事件] HttpSessionEvent
[触发场景] 在session (HttpSession)对象建立或被消灭时,会分别呼叫这两个方法。
HttpSessionAttributeListener
[接口方法] attributeAdded()、 attributeReplaced()、attributeRemoved()
[接收事件] HttpSessionBindingEvent
[触发场景] 若有对象加入为session(HttpSession)对象的属性,则会呼叫attributeAdded(),同理在置换属性与移除属性时,会分别呼叫attributeReplaced()、 attributeRemoved()。
HttpSessionActivationListener
[接口方法] sessionDidActivate()与 sessionWillPassivate()
[接收事件] HttpSessionEvent
[触发场景] Activate与Passivate是用于置换对象的动作,当session对象为了资源利用或负载平衡等原因而必须暂时储存至硬盘或其它储存器时(透过对象序列化),所作的动作称之为Passivate,而硬盘或储存器上的session对象重新加载JVM时所采的动作称之为Activate,所以容易理解的,sessionDidActivate()与 sessionWillPassivate()分别于Activeate后与将Passivate前呼叫。
ServletRequestListener
[接口方法] requestInitialized()与 requestDestroyed()
[接收事件] RequestEvent
[触发场景] 在request(HttpServletRequest)对象建立或被消灭时,会分别呼叫这两个方法。
ServletRequestAttributeListener
[接口方法] attributeAdded()、 attributeReplaced()、attributeRemoved()
[接收事件] HttpSessionBindingEvent
[触发场景] 若有对象加入为request(HttpServletRequest)对象的属性,则会呼叫attributeAdded(),同理在置换属性与移除属性时,会分别呼叫attributeReplaced()、 attributeRemoved()。
HttpSessionBindingListener
[接口方法] valueBound()与valueUnbound()
[接收事件] HttpSessionBindingEvent
[触发场景] 实现HttpSessionBindingListener接口的类别,其实例如果被加入至session(HttpSession)对象的属性中,则会呼叫 valueBound(),如果被从session(HttpSession)对象的属性中移除,则会呼叫valueUnbound(),实现HttpSessionBindingListener接口的类别不需在web.xml中设定。
2. 如何注册Servlet中的事件
实现上面这几个接口的类别,除了HttpSessionBindingListener外,必须在web.xml中向容器注册,容器才会在对应的事件发生时呼叫对应的类别,如:
< listener >
< listener-class > demo.servlet.listener.CustomServletContextListener </ listener-class >
</ listener >
3. Servlet事件的应用实例
看到这里,你也许会有疑问: 了解这些 listener和event 有什么用呢?我平时开发没有用到这些,一样也能完成任务啊.
不错,在日常的开发中很少用到这些事件处理的方面,但是在某些情况下使用事件处理机制却可以达到事半功倍的效果,例如下面两个例子:
4.Java类实例
==========
//侦听启动和关闭
import javax.servlet.ServletContextListener;
import javax.servlet.*;
public class TigerListen implements ServletContextListener {
public void contextInitialized(ServletContextEvent sce)
{
System.out.print("Init") ;
}
public void contextDestroyed(ServletContextEvent sce)
{
System.out.print("Destroved") ;
}
}
对应的web.xml是
============
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<listener>
<listener-class>TigerListen</listener-class>
</listener>
</web-app>
本文转自
http://www.blogjava.net/zhanglijun33/archive/2006/12/11/servletListener.html