1、使用Session
l 只要获得HttpSession对象,就可以对Session进行管理和使用
l 为了遵循MVC模式,对Session的使用应该放在Handler中实现
l 在Handler中,可以使用DispatchContext这个上下文环境来获得HttpSession对象
l 下面是一个封装了简单使用Session的工具类:
package com.fujitsu.eFrame.eftool; import javax.servlet.http.HttpSession; import com.fujitsu.uji.DispatchContext; import com.fujitsu.uji.http.HttpSessionProfile; public class SessionUtil { private static HttpSession session; private static HttpSession getSession(DispatchContext context) { if (session == null) { session = ((HttpSessionProfile)context.getSessionProfile()).getSession(); } return session; } public static Object getAttribute(DispatchContext context, String name) { return getSession(context).getAttribute(name); } public static void setAttribute(DispatchContext context, String name, Object value) { getSession(context).setAttribute(name, value); } public static void setTimeout(DispatchContext context, int seconds) { getSession(context).setMaxInactiveInterval(seconds); } }
l 这里最主要的是使用APC提供的API获得HttpSession对象
Ø 由DispatchContext的getSessionProfile方法获得HttpSessionProfile对象(要强制转换,因为SessionProfile是HttpSessionProfile的抽象父类)
Ø 然后由HttpSessionProfile的getSession()方法获得HttpSession对象
l 另外要注意是setTimeout()方法中指定的Session超时的时间以秒为单位
l 这样就可以在Handler中使用Session,例如:
SessionUtil.setAttribute(context, "workArea", name);
2、监听Session
l 可以实现HttpSessionListener接口来实现监听Session的创建和销毁,下面是一个简单的框架:
package com.fujitsu.eFrame.eftool; import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class SessionListener implements HttpSessionListener { public void sessionCreated(HttpSessionEvent se) { System.out.println("Session created!"); } public void sessionDestroyed(HttpSessionEvent se) { System.out.println("Session Destroyed!"); } }
l HttpSessionListener接口提供了sessionCreated()和sessionDestroyed()两个方法,分别在Session创建之后和Session销毁之前被调用
l 因此,可以在sessionCreated()方法中做一些Session创建后的初始化工作;而在sessionDestroyed()方法中做一些Session销毁前的清除工作
l 要注册监听器,可以在web.xml中配置:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <context-param> <param-name>uji.handleException.wrap</param-name> <param-value>true</param-value> </context-param> <listener> <listener-class> com.fujitsu.eFrame.eftool.SessionListener </listener-class> </listener> <session-config> <session-timeout>1</session-timeout> </session-config> <taglib> <taglib-uri>uji-taglib</taglib-uri> <taglib-location>/WEB-INF/ujiall.tld</taglib-location> </taglib> </web-app>
l APC缺省使用web-app_2_2.dtd,是不支持<listener>标记的,需要改为web-app_2_3.dtd
l 使用<listener>标记注册需要监听的监听器
l 上面的例子同时还使用<session-timeout>标记指定缺省的Session的有效时间,注意是以分钟为单位的 
|