📄 详细分析二.txt
字号:
}
按类型查找时,先从缓存中找,没有再从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;/隐身用户标志
<hibernate-mapping package="com.laoer.bbscs.bean">
<class name="UserOnline" table="bbscs_useronline">
<id name="id" column="ID" type="string" unsaved-value="null">
<generator class="uuid"/>
</id>
<property column="UserID" length="40" name="userID" not-null="true" type="string"/>
<property column="UserName" length="60" name="userName" not-null="true" type="string"/>
<property column="NickName" length="60" name="nickName" not-null="true" type="string"/>
<property column="OnlineTime" length="20" name="onlineTime" type="long"/>
<property column="BoardID" length="20" name="boardID" type="long"/>
<property column="AtPlace" length="255" name="atPlace" type="string"/>
<property column="UserGroupID" length="11" name="userGroupID" type="int"/>
<property column="ValidateCode" length="100" name="validateCode" type="string"/>
<property column="HiddenUser" length="1" name="hiddenUser" type="int"/>
</class>
</hibernate-mapping>
我们看看其服务接口层提供的方法:
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();
}
接下来,我们看个复杂的业务对象:UserService,它这里与三个BEAN有关,一个是UserInfo,一个是UserInfoSimple,还有一个来自web.servlet包的UserSession,下面从UserInfo(implements Serializable)开始分析:
private String id;
private String userName; //用户名
private String nickName;//昵称
private String passwd;//密码(没有MD5,失败)
private String rePasswd;
private String email;
private String question;
private String answer;
private Date regTime;//注册时间
private Date loginTime;//登录时间
private String loginIP;//登录IP
private int loginTimes;//登录次数
private Date lastLoginTime;//最后登录时间
private String lastLoginIP;//最后登录IP
private int articleNum;//发帖数
private long stayTime;//在线时间
private int articleEliteNum;//精华帖子数
private int lifeForce;//生命值
private int userTitle;//用户头衔
private int literary;//文采值
private int experience;//经验值
private int userKnow;//人缘值
private String signName0;//签名名称1
private String signDetail0;//签名内容1
private String signName1; //2
private String signDetail1;//2
private String signName2; //3
private String signDetail2;// 3
private int havePic;//有头像标志
private String picFileName;//头像文件名
private int forumPerNum;//每页主题数
private int postPerNum;//每页帖子数
private String userFrom;//来自
private String timeZone;//时区
private int birthYear;//出生年
private int birthMonth;//月
private int birthDay;//日
private int receiveNote;//是否接受留言
private int acceptFriend;//是否接受好友请求
private int forumViewMode;//论坛浏览模式
private UserDetail userDetail;
private int validated;//是否通过验证
private int groupID;//用户组ID
private int coin;//财富值
private int hiddenLogin;//隐身登录标志
private int editType;//编辑器类型
private String userLocale;//用户本地化信息
private String validateCode;//验证码
对于UserInfo.hbm.xml--->"bbscs_userinfo"我们这里省略之,而特殊之处在于:
<one-to-one name="userDetail" class="com.laoer.bbscs.bean.UserDetail" lazy="no-proxy" cascade="all"/>//lazy="no-proxy"当前对象的单值相关对象在它的实体变量被访问的时候就被加载。
而其中包含了个UserDetail的userDetail属性:
private String id;
private String height;
private String weight;
private String interest;
private String graduate;
private String favourPeople;
private String dreamJob;
private String favourArt;
private String favourMusic;
private String favourPlace;
private String favourMovie;
private String favourChat;
private String favourBook;
private String dreamLover;
private String favourTeam;
private String homePage;
private String oicqNo;
private String icqNo;
private int sex;
private String brief;
private String msn;
private String yahoo;
private UserInfo userInfo;
注意:UserDetail.hbm.xml--->bbscs_userdetail
<id name="id" column="ID">
<generator class="foreign">//ID生成方式foreign!
<param name="property">userInfo</param>
</generator>
</id>
而最后加入一句:
<one-to-one name="userInfo" class="com.laoer.bbscs.bean.UserInfo" constrained="true"/>
我们看下UserInfo的简化版:UserInfoSimple,还给了一些初始值呢..对了,它没有hbm.xml,可见它应该是一个传递数据的javabean.
private String id = "";
private long regTime = System.currentTimeMillis();
private long loginTime = System.currentTimeMillis();
private int articleNum = 0;
private int articleEliteNum = 0;
private int userTitle = 0;
private int lifeForce = 0;
private int coin = 0;
private int literary = 0;
private int userKnow = 0;
private int experience = 0;
private int havePic = 0;
private String picFileName = "-";
private String userFrom = "-";
我们回到方法中来:
public UserInfo saveUserInfo(UserInfo userInfo) throws BbscsException;
public UserInfo findUserInfoById(String id);
public UserInfo findUserInfoByUserName(String userName);
public UserInfo findUserInfoByEmail(String email);
public long getAllUserNum();//取得所有用户数量
public PageList findUserInfoList(String orderby, String ascordesc, Pages pages);//取得用户分页列表
public Map[] getUserPermission(UserInfo userInfo);
public Map[] getUserPermission(int groupID);//根据组ID取得权限
public UserInfo saveAtLogin(UserInfo userInfo) throws BbscsException;
public void writeUserFile(UserInfo userInfo);
public UserInfoSimple getUserInfoSimple(String userID);
public void createUserFacePic(UserInfo ui, String distFileName, InputStream stream) throws
BbscsException;//保存用户上传头像
public void removeUserFacePic(UserInfo ui) throws BbscsException;
public int getUserTitleValue(UserInfo ui);
public int getUserTitleValue(UserInfoSimple uis);
public String getUserTitle(UserInfo ui);
public String getUserTitle(UserInfoSimple uis);
public void createTopFile() throws BbscsException;
public long getUserNumByGroupID(int groupID);
public PageList findUserInfosByGroupID(int groupID, String orderby, int ascOrDesc, Pages pages);
public PageList findUserInfosByGroupID(int groupID, Pages pages);
public UserSession getUserSession(String userName);
public UserSession getUserSession(UserInfo ui);
好,我们看其实现,首先注入了userInfoDAO,userInfoFileIO,userGroupDAO,permissionDAO,userPermissionCache,userLevelService等对象.这些对象大多我们已经讲过,这里就不再重复了.
public void createUserFacePic(UserInfo ui, String distFileName, InputStream stream) throws BbscsException {
if (ui.getHavePic() == 1) { //有的话,先删除之
this.getUserInfoFileIO().delUserPicFile(ui);
}
try {
this.getUserInfoFileIO().saveUserUpFile(ui, distFileName, stream);//创建文件(两个)
ui.setHavePic(1);
ui.setPicFileName(distFileName);
ui = this.getUserInfoDAO().saveUserInfo(ui);//写入数据库
this.getUserInfoFileIO().writeUserFile(ui);//写入用户信息文件
} catch (Exception e) {
logger.error(e);
throw new BbscsException(e);
}
}
再看个分页列表显示的!
public PageList findUserInfosByGroupID(int groupID, String orderby, int ascOrDesc, Pages
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -