⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 详细分析二.txt

📁 开源论坛实现
💻 TXT
📖 第 1 页 / 共 5 页
字号:
	}
按类型查找时,先从缓存中找,没有再从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 + -