软件艺术思考者  
混沌,彷徨,立志,蓄势...
公告
日历
<2024年5月>
2829301234
567891011
12131415161718
19202122232425
2627282930311
2345678

导航

随笔分类(86)

随笔档案(85)

搜索

  •  

最新评论

阅读排行榜

评论排行榜

 
javax.servlet.ServletContextListener 的应用
    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>

posted on 2006-12-11 14:13 智者无疆 阅读(1762) 评论(1)  编辑  收藏 所属分类: about java
评论:
  • # re: javax.servlet.ServletContextListener 的应用   self Posted @ 2006-12-12 10:16
    2.省时省力的 Map.Entry 类
    BUILDER.COM 翻译:Java研究组织
    13/2/2003
    URL: http://www.zdnet.com.cn/developer/code/story/0,3800066897,39107146,00.htm

    你是否已经对每次从Map中取得关键字然后再取得相应的值感觉厌倦?使用Map.Entry类,你可以得到在同一时间得到所有的信息。标准的Map访问方法如下:

    Setkeys = map.keySet( );
    if(keys != null) {
    Iterator iterator = keys.iterator( );
    while(iterator.hasNext( )) {
    Object key = iterator.next( );
    Object value = map.get(key);
    ;....
    ;}
    }

    然后,这个方法有一个问题。从Map中取得关键字之后,我们必须每次重复返回到Map中取得相对的值,这是很繁琐和费时的。

    幸运的是,这里有一个更加简单的途径。Map类提供了一个称为entrySet()的方法,这个方法返回一个Map.Entry实例化后的对象集。接着,Map.Entry类提供了一个getKey()方法和一个getValue()方法,因此,上面的代码可以被组织得更符合逻辑。举例如下:




    Setentries = map.entrySet( );
    if(entries != null) {
    Iterator iterator = entries.iterator( );
    while(iterator.hasNext( )) {
    Map.Entry entry =iterator.next( );
    Object key = entry.getKey( );
    Object value = entry.getValue(
    );
    ;....
    }
    }

    尽管增加了一行代码,我们却省略了许多对Map不必要的“get”调用。同时,提供给开发人员一个同时保持了关键字和其对应的值的类。Map.Entry同时也提供了一个setValue()方法,程序员可以使用它修改map里面的值。
      回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
 
Copyright © 智者无疆 Powered by: 博客园 模板提供:沪江博客


   观音菩萨赞