此文爲轉載:http://www.diybl.com/course/1_web/webjs/2007113/82989.html OK,Next RoleService,先看其BEAN先,它有四個屬性: private Integer id; private String roleName; private int typeID; private List permissions = new ArrayList(); 其Role-mysql.hbm.xml: //自動增長! //用了自定義類型! 我們看下數據庫bbscs_role中的記錄,可見它也基本上是一本固定的配置表而已: 1 ???(亂碼) 1 MEMO(401,402,403,404,405,406,407,408,409,410,411,412,413,.....) 4 ???(亂碼) 0 MEMO(126,127,128,129,130) 我們看方法: public Role saveRole(Role role) throws BbscsException; public Role findRoleByID(int id); public List findRolesAll(); public List findRolesByTypeID(int typeID);//根據tpyeID取得Role列表 public List findRolesInIDs(List ids);//根據指定IDs取得Role對象列表 public void removeRole(Role role) throws BbscsException; 進入其實現層,首先也用了userPermissionCache,大部分方法仍有DAO處理: public Role saveRole(Role role) throws BbscsException { try { role = this.getRoleDAO().saveRole(role); this.clearPermissionCache(); return role; } catch (Exception ex) { logger.error(ex); throw new BbscsException(ex); } } private void clearPermissionCache() { //私有方法 if (Constant.USE_PERMISSION_CACHE) {//public static final boolean USE_PERMISSION_CACHE = true; this.getUserPermissionCache().removeAll(); } } 對於DAO及其實現層我們不分析下去. 好,我們到了SessionService,這個接口中並沒有import任何service,bean(當然也沒有.hbm.xml),應該是完全用於session的操作的吧.我們直接看方法: public void saveSession(String id, String key, Object value); public void saveSession(String id, Map session); public Map getSession(String id); public Object getSession(String id, String key); public void removeSession(String id); 我們在com.laoer.bbscs.serivce.config包中也發現了還有SessionConfig沒有介紹之,其實它也是個用於得到目錄的配置服務類,先注入safePath後: public String getSessionPath(String id) { StringBuffer sb = new StringBuffer(); sb.append(this.getSafePath()); if (!this.getSafePath().endsWith("/")) { sb.append("/"); } sb.append("session/"); sb.append(BBSCSUtil.getStringHashCode(id) % 100); sb.append("/"); String tmp = ""; if (id.length() > 5) { tmp = id.substring(0, 5); } else { tmp = id; } sb.append(BBSCSUtil.getStringHashCode(tmp) % 100); sb.append("/"); sb.append(id); sb.append("/"); File ft = new File(sb.toString()); if (!ft.exists()) { ft.mkdirs(); } return sb.toString(); //safe/session/34/23/2342342/ } 其中用到了com.laoer.bbscs.comm.*: public static int getStringHashCode(String txt) { int t = 0; if (txt != null) { char[] chars = txt.toCharArray(); for (int i = 0; i < chars.length; i++) { t = t + (int) chars[i]; } } return t; } 至於SessionService和SessionConfig的具體用處可能是在web層使用吧!有待考慮之. 我們來到SubscibeService(帖子訂閱服務):(我們不分析關於拆表的任何代碼,有關請看Friend相關類) private String id; private String userID; //用戶ID private String userName; private String nickName; private String postID;//帽子ID private String postTitle; private long boardID;//版區ID private int emailinform;//Email發送標誌 private int msginform;//留言發送標誌 private String userEmail; private Date createTime; private String userLocale;//用戶Locale信息 //UUID類型!! //時間截 好了,我們看SubscibeService中的服務公開方法: public Subscibe saveSubscibe(Subscibe subscibe) throws BbscsException; public Subscibe findSubscibeByID(String id, String userID, long bid); public Subscibe findSubscibeByPostID(String postID, String userID, long bid); public List findSubscibesSend(String postID, long bid); public long getSubscibeNumByUserID(String userID, long bid); public PageList findSubscibesByUserID(String userID, long bid, Pages pages); public void removeSubscibe(String id, String userID, long bid) throws BbscsException; public void removeSubscibe(Subscibe subscibe) throws BbscsException; 而其實現基本由DAO完成! private static final String LOAD_BY_ID = "from Subscibe where id = ? and userID = ?"; private static final String LOAD_BY_POSTID = "from Subscibe where postID = ? and userID = ?"; private static final String LOADS_SEND = "from Subscibe where postID = ?"; private static final String GET_NUM_BY_USER = "select count(*) from Subscibe where userID = ? and boardID = ?"; private static final String LOADS_BY_USER = "from Subscibe where userID = ? and boardID = ? order by createTime desc"; private static final String REMOVE_BY_ID = "delete from Subscibe where id = ? and userID = ?"; 如下爲根據ID查找訂閱信息的,其中bid沒有用上! public Subscibe findSubscibeByID(String id, String userID, long bid) { Object[] o = {id, userID}; List l = this.getHibernateTemplate().find(LOAD_BY_ID, o); if (l == null || l.isEmpty()) { return null; } else { return (Subscibe) l.get(0); } } 下面我們繼續分析SysNumStatService,先看其Bean:(系統統計) private String id; private String recDate; //統計時間 private long num0;//註冊人數 private long numInc0;//註冊人數增加數 private long num1;//主題數 private long numInc1;//主題增加數 private long num2;//帖子總數 private long numInc2;//帖子總數增加數 private long num3; private long numInc3; private long num4; private long numInc4; private long num5; private long numInc5; private long createTime; 我們看其方法: public SysNumStat saveSysNumStat(SysNumStat sns) throws BbscsException; public SysNumStat saveSysNumStat(String recDate, SysNumStat sns) throws BbscsException; public SysNumStat findSysNumStatByRecDate(String recDate); public long getSysNumStatNum(); public PageList findSysNumStats(Pages pages);//pages由web層的action填充! 它由DAO代理完成,對於DAO自行分析... 接下來是SysStatService,以前講過,這裏在複習一次吧.它是個抽象類,並沒有什麼bean支撐(不需要與數據庫打交道),直接寫在自己的私有成員,還有公開的setter/getter方法中! private long onlineNum = 0; private long appearTime = 0; private String appearTimeStr = ""; private long allUserNum = 0; private String lastRegUser = ""; private long postMainNum = 0; private long postNum = 0; 子類需實現的方法有: public abstract void load(); public abstract void saveOnline(long nowonlinenum); public abstract void saveAllUserNum(long allusernum, String lastreguser); public abstract void savePostNum(long main, long all); 對於具體的實現請看前面的分析! 我們看UserGroupService.其bean(用戶組)如下: private Integer id; private String groupName;//用戶組名稱 private String groupDesc; private int typeID;//類型 private Set roles = new HashSet(); 其UserGroup-mysql.hbm.xml: //set 多對多關係 讓我們看看起初加入數據庫的數據(注意到沒有roles字段): (1,'遊客/未註冊用戶','',0), (2,'註冊用戶','',0), (3,'待驗證用戶','',0), (4,'超級版主','',0), (5,'系統管理員','',0), (6,'封禁用戶','',0) 我們接下來看服務類的提供的對外方法: public UserGroup saveUserGroup(UserGroup ug) throws BbscsException; public UserGroup updateUserGroup(UserGroup ug) throws BbscsException; public UserGroup findUserGroupByID(int id); public List findUserGroupsAll(); public List findUserGroupInIDs(List ids); public void removeUserGroup(UserGroup ug) throws BbscsException; 在其實現中,首先注入了userGroupDAO,boardDAO,boardPermissionDAO,userPermissionCache,這四個方法我們都用過: public UserGroup saveUserGroup(UserGroup ug) throws BbscsException { try { ug = this.getUserGroupDAO().saveUserGroup(ug); 下面是對版區權限的附加操作(若沒有這個用戶組的話) List bplist = this.getBoardPermissionDAO().findBoardPermissionsByGid(ug.getId().intValue()); //取得版區權限列表 if (bplist.size() == 0) { //沒有版區權限列表,說明是新的用戶組,增加版區權限記錄 List blist = this.getBoardDAO().findBoardsAll(); //獲得所有的版區 Board b; for (int i = 0; i < blist.size(); i++) { b = (Board) blist.get(i); BoardPermission bp = new BoardPermission(); bp.setBoardID(b.getId().longValue()); bp.setGroupID(ug.getId().intValue()); bp.setPermissions(Constant.BOARD_PERMISSION_GROUP_LIST_1);//自定義權限列表! this.getBoardPermissionDAO().saveBoardPermission(bp); } } this.clearPermissionCache(); return ug; } catch (Exception ex) { logger.error(ex); throw new BbscsException(ex); } private void clearPermissionCache() { if (Constant.USE_PERMISSION_CACHE) { this.getUserPermissionCache().removeAll(); } } } 我們看下DAO: public UserGroup saveUserGroup(UserGroup ug); public UserGroup updateUserGroup(UserGroup ug); public UserGroup findUserGroupByID(int id); public List findUserGroupsAll(); public List findUserGroupInIDs(List ids); public void removeUserGroup(UserGroup ug); 看其中的一個實現: private static final String LOADS_IN_IDS = "from UserGroup where id in (:ids)"; public List findUserGroupInIDs(final List ids) { return getHibernateTemplate().executeFind(new HibernateCallback() { public Object doInHibernate(Session s) throws HibernateException, SQLException { Query query = s.createQuery(LOADS_IN_IDS); query.setParameterList("ids", ids); List list = query.list(); return list; } }); } 下面是UserLevelService: private String levelName; //級別名稱 private String id;//ID private int levelValue;//該級別所需相應值 private int levelType;//級別類型 其初始數據請看數據庫設計表!其下有以下方法: public UserLevel saveUserLevel(UserLevel ul) throws BbscsException; public UserLevel findUserLevelById(String id); public List findUserLevelsByType(int type); public UserLevel getUserLevelByUserValue(int type, int value); public void removeUserLevel(UserLevel ul) throws BbscsException; 其實現注入了sysListObjCache: public UserLevel saveUserLevel(UserLevel ul) throws BbscsException { try { ul = this.getUserLevelDAO().saveUserLevel(ul); this.getSysListObjCache().remove("UserLevel-" + ul.getLevelType()); return ul; } catch (Exception ex) { logger.error(ex); throw new BbscsException(ex); } } 按類型查找時,先從緩存中找,沒有再從DAO中找出後放入緩存中! public List findUserLevelsByType(int type) { List l = (List) this.getSysListObjCache().get("UserLevel-" + type); if (l == null) { l = this.getUserLevelDAO().findUserLevelsByType(type); this.getSysListObjCache().add("UserLevel-" + type, l); } return l; } public UserLevel getUserLevelByUserValue(int type, int value) { List l = this.getUserLevelDAO().findUserLevelsByType(type); for (int i = 0; i < l.size(); i++) { UserLevel ul = (UserLevel) l.get(i); if (value < ul.getLevelValue()) { return ul;//有比type中小的話返回一個ul! } } UserLevel ul = new UserLevel(); //沒有的話! ul.setLevelName("-"); ul.setLevelValue(0); return ul; } public void removeUserLevel(UserLevel ul) throws BbscsException { try { this.getSysListObjCache().remove("UserLevel-" + ul.getLevelType());//注意緩存的清理工作! this.getUserLevelDAO().removeUserLevel(ul); } catch (Exception ex) { logger.error(ex); throw new BbscsException(ex); } } 我們看DAO實現: private static final String LOADS_BY_TYPE = "from UserLevel where levelType = ? order by levelValue";//可見上面的this.getUserLevelDAO().findUserLevelsByType(type);是按levelValue排序的,因而得到的type最小的一個大於value的! OK,UserOnlineService:其bean如下 private String id; private String userID;//用戶ID private String userName;//用戶名 private String nickName;//用戶暱稱 private long onlineTime;//在線時間 private String atPlace;//所在位置 private int userGroupID;//用戶所在組 private String validateCode;//校驗碼,用於防止重複登錄 private long boardID;//所在版區ID private int hiddenUser;/隱身用戶標誌 我們看看其服務接口層提供的方法: public UserOnline saveUserOnline(UserOnline userOnline) throws BbscsException; public UserOnline createUserOnline(UserOnline userOnline) throws BbscsException; public UserOnline findUserOnlineByID(String id); public UserOnline findUserOnlineByUserName(String userName); public List findUserOnlinesAllInTime(long atime); public List findUserOnlinesByBoardIDInTime(long boradID, long atime); public List findUserOnlineByGroupIDInTime(int groupID, long atime); public long getUserOnlineNum(long atime); public List findUserOnlines(long atime, long boradID, int hiddenUser, List groups); public long getUserOnlineNum(long atime, long boradID, int hiddenUser, List groups); public long getUserOnlineNumInIds(long atime, List ids); public List findUserOnlinesInIds(long atime, List ids); public long getUserOnlineNumInIds(long atime, List ids, long boradID, int hiddenUser, List groups); public List findUserOnlinesInIds(long atime, List ids, long boradID, int hiddenUser, List groups); public void removeUserOnline(UserOnline userOnline) throws BbscsException; public void removeUserOnlineOutTime(long atime) throws BbscsException; 它其實現層: public UserOnline createUserOnline(UserOnline userOnline) throws BbscsException { try { UserOnline uo = this.getUserOnlineDAO().findUserOnlineByUserID(userOnline.getUserID());//先看看有沒有,是否存在先. if (uo == null) { return this.getUserOnlineDAO().saveUserOnline(userOnline);//沒有的話 } else { uo.setAtPlace(userOnline.getAtPlace()); uo.setBoardID(userOnline.getBoardID()); uo.setNickName(userOnline.getNickName()); uo.setOnlineTime(userOnline.getOnlineTime()); uo.setUserGroupID(userOnline.getUserGroupID()); uo.setValidateCode(userOnline.getValidateCode()); uo.setHiddenUser(userOnline.getHiddenUser());//有的話,userOnline--->uo return this.getUserOnlineDAO().saveUserOnline(uo);//更新之 } } catch (Exception ex) { logger.error(ex); throw new BbscsException(ex); } } 對於其它實現方法,大多由DAO去完成.我們看其DAO實現,首先是HQL語句: private static final String LOAD_BY_USERID = "from UserOnline where userID = ?"; private static final String LOAD_BY_USERNAME = "from UserOnline where userName = ?"; private static final String LOADS_ALL_INTIME = "from UserOnline where onlineTime >= ?";//在線時間大於多少的就是在線的用戶! private static final String LOADS_BY_BOARDID_INTIME = "from UserOnline where boardID = ? and onlineTime >= ?"; private static final String LOADS_BY_GROUPID_INTIME = "from UserOnline where userGroupID = ? and onlineTime >= ?"; private static final String REMOVE_ALL_OUTTIME = "delete from UserOnline where onlineTime < ?"; private static final String GET_NUM_INTIME = "select count(*) from UserOnline where onlineTime >= ?"; private static final String LOADS_IN_IDS = "from UserOnline where userID in (:ids) and onlineTime >= :atime"; private static final String GET_NUM_IN_IDS = "select count(*) from UserOnline where userID in (:ids) and onlineTime >= :atime"; 保存或更新UserOnline對象: public UserOnline saveUserOnline(UserOnline userOnline) { this.getHibernateTemplate().saveOrUpdate(userOnline); return userOnline; } public List findUserOnlines(final long atime, final long boardID, final int hiddenUser, final List groups) { return getHibernateTemplate().executeFind(new HibernateCallback() { public Object doInHibernate(Session s) throws HibernateException { Criteria c = s.createCriteria(UserOnline.class); c.add(Restrictions.ge("onlineTime", new Long(atime))); if (boardID != 0) { c.add(Restrictions.eq("boardID", new Long(boardID))); } if (hiddenUser != -1) { c.add(Restrictions.eq("hiddenUser", new Integer(hiddenUser))); } if (groups != null && !groups.isEmpty()) { c.add(Restrictions.in("userGroupID", groups)); } return c.list(); } }); } 而getUserOnlineNum卻增加了一句: c.setProjection(Projections.count("id")); 並且在返回結果後進行判斷: List l = getHibernateTemplate().executeFind(new HibernateCallback() {...} if (l == null || l.isEmpty()) { return 0; } else { return ( (Integer) l.get(0)).longValue(); }
對天乙社區bbscs8實現的詳細分析九
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.