本文共 3519 字,大约阅读时间需要 11 分钟。
observer模式的应用(2)
ActionListener的实现类LogonListener在用户登陆和退出的时候更新相关的业务表单:
package test.pattern;import org.apache.log4j.Logger;import java.sql.Connection;import java.sql.PreparedStatement;import java.util.Map;/**
* Description :* Author : husthxd* 来自* Date: 2005-6-3* Time: 12:18:53* Version 1.0*/public class LogonListener implements ActionListener { static Logger logger = Logger.getLogger(LogonListener.class);int id = 0;public LogonListener(int id) { this.id = id;}public LogonListener() { }//登陆
public void login(User user) throws GFPortalException { Connection conn = null;try { //数据库连接conn = ConnMgr.getConnection();conn.setAutoCommit(false);//sql语句StringBuffer sqlstmt = new StringBuffer();//判断用户是否已经在表中//构造sql语句sqlstmt.append("select count(*) v_count from BUG_TEAM where USERID =");sqlstmt.append(user.getUserId());sqlstmt.append(" and INSTANCEID = ");sqlstmt.append(id);logger.debug("sql语句:" + sqlstmt);//取得结果Map map = BusinessLogicQueryHelper.factory().getRecord(conn, sqlstmt.toString());int iCount = Integer.parseInt(map.get("v_count").toString());if (iCount > 0) { return;}//执行sql语句sqlstmt.append("insert into BUG_TEAM values (?,?,?,?)");PreparedStatement stmt = conn.prepareStatement(sqlstmt.toString());//设置参数stmt.setInt(1, id);stmt.setInt(2, user.getUserId());stmt.setString(3, user.getUserName());stmt.setString(4, "0");//执行stmt.execute();conn.commit();} catch (Exception e) { try { conn.rollback();} catch (Exception e2) { }throw new GFPortalException("出错!" + e);} finally { ConnMgr.closeConnection(conn);}}//退出
public void logout(User user) throws GFPortalException { Connection conn = null;try { //数据库连接conn = ConnMgr.getConnection();conn.setAutoCommit(false);StringBuffer sqlstmt = new StringBuffer();//执行sql语句sqlstmt.append("DELETE FROM BUG_TEAM WHERE USERID = ? AND INSTANCEID = ?");sqlstmt.append(" and isnull(FLAG,'0') = '0'");logger.debug("sql语句:" + sqlstmt);PreparedStatement stmt = conn.prepareStatement(sqlstmt.toString());stmt.setInt(1, user.getUserId());stmt.setInt(2, id);//执行stmt.execute();conn.commit();} catch (Exception e) { try { conn.rollback();} catch (Exception e2) { }throw new GFPortalException("出错!" + e);} finally { ConnMgr.closeConnection(conn);}}}Logon类扮演System角色,listener列表设为静态,全局共享:
package test.pattern;import java.util.Iterator;
/*** Description : 登陆/退出类* Author : husthxd* 来自* Date: 2005-6-3* Time: 12:10:31* Version 1.0*/public class Logon { //保存listener(各个正在进行审核小组讨论的流程)static private java.util.List listeners = new java.util.ArrayList();//注册public static void register(ActionListener al) { listeners.add(al);}//登陆通知public static void loginNotify(User user) throws GFPortalException { for (Iterator itor = listeners.iterator(); itor.hasNext();) { ActionListener al = (ActionListener) itor.next();al.login(user);}}//退出通知public static void logoutNotify(User user) throws GFPortalException { for (Iterator itor = listeners.iterator(); itor.hasNext();) { ActionListener al = (ActionListener) itor.next();al.logout(user);}}}客户端调用:在用户登陆的loginCheck.jsp页面中加入代码:Logon.loginNotify(user);在用户退出的logout.jsp页面中加入代码:Logon.logoutNotify(loginUser);在审核页面中加入代码(进入审核页面即视为进入审核状态)://把当前登陆的用户加入到审核小组中//doAddUser//下面设置监听ActionListener al = new LogonListener ();Logon.register(al);达到的效果是用户在登陆的时候自动在在审中的流程相关表中把登陆用户加入到审核小组中,在用户退出的时候如果用户还没有确认则把用户从审核小组中删除。来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/6906/viewspace-21824/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/6906/viewspace-21824/