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的有效时间,注意是以分钟为单位的