设计模式应用之Observer模式
2. 实现代码
1) 定义监听接口ActionListener,作为用户登录和退出的监听接口,代码如下:
package test.pattern;
![]()
public interface ActionListener {
//登录
public void login(User user) throws CustomException;
//退出
public void logout(User user) throws CustomException;
}
ActionListener的实现类DefaultLogonListener。用户在登录和退出的时候在相应的记录表中登记:
package test.pattern;
![]()
import org.apache.log4j.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.Map;
![]()
public class DefaultLogonListener implements ActionListener {
static Logger logger = Logger.getLogger(DefaultLogonListener.class);
public DefaultLogonListener() {
}
//登录
public void login(User user) throws CustomException {
Connection conn = null;
try {
//获得数据库连接
conn = ConnMgr.getConnection();
conn.setAutoCommit(false);
//定义sql语句
StringBuffer sqlstmt = new StringBuffer();
//判断用户是否已经在表中
//构造sql语句
sqlstmt.append("select count(*) v_count from LOGIN_USER where USERID =");
sqlstmt.append(user.getUserId());
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 LOGIN_USER values (?,?)");
PreparedStatement stmt = conn.prepareStatement(sqlstmt.toString());
//设置参数
stmt.setInt(1, user.getUserId());//用户ID
stmt.setString(2, user.getUserName());//用户名称
//执行
stmt.execute();
conn.commit();//提交事务
} catch (Exception e) {
try {
conn.rollback();
} catch (Exception e2) {
}
throw new CustomException("login出错!" + e);
} finally {
ConnMgr.closeConnection(conn);//关闭数据库连接
}
}
//退出
public void logout(User user) throws CustomException {
Connection conn = null;
try {
//获取数据库连接
conn = ConnMgr.getConnection();
conn.setAutoCommit(false);
StringBuffer sqlstmt = new StringBuffer();
//用户退出的时候在用户登记表中删除该用户
//执行sql语句
sqlstmt.append("DELETE FROM LOGIN_USER WHERE USERID = ? ");
logger.debug("sql语句:" + sqlstmt);
PreparedStatement stmt = conn.prepareStatement(sqlstmt.toString());
stmt.setInt(1, user.getUserId());//用户ID
//执行
stmt.execute();
conn.commit();
} catch (Exception e) {
try {
conn.rollback();
} catch (Exception e2) {
}
throw new CustomException("logout出错!" + e);
} finally {
ConnMgr.closeConnection(conn);
}
}
}
2) ActionListener的实现类LogonListener在用户登录和退出的时候更新相关的业务表单:
package test.pattern;
import org.apache.log4j.Logger;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.util.Map;
![]()
public class LogonListener implements ActionListener {
static Logger logger = Logger.getLogger(LogonListener.class);
int id = 0;//流程实例ID
public LogonListener(int id) {
this.id = id;
}
public LogonListener() {
}
![]()
//登录
public void login(User user) throws CustomException {
Connection conn = null;
try {
//数据库连接
conn = ConnMgr.getConnection();
conn.setAutoCommit(false);
//sql语句
StringBuffer sqlstmt = new StringBuffer();
//判断用户是否已经在表中
//构造sql语句
sqlstmt.append("select count(*) v_count from AUDIT_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 AUDIT_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 CustomException ("出错!" + e);
} finally {
ConnMgr.closeConnection(conn);
}
}
//退出
public void logout(User user) throws CustomException {
Connection conn = null;
try {
//数据库连接
conn = ConnMgr.getConnection();
conn.setAutoCommit(false);
StringBuffer sqlstmt = new StringBuffer();
//执行sql语句
sqlstmt.append("DELETE FROM AUDIT_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 CustomException ("出错!" + e);
} finally {
ConnMgr.closeConnection(conn);
}
}
}
0
相关文章
