2010.12.9接上午。继续看net.jforum.view.forum/ForumAction.java中public void list() 中的
this.context.put("totalMessages", Integer.valueOf(ForumRepository.getTotalMessages ()));//页面显示的总文章数
this.context.put("totalRegisteredUsers", ForumRepository .totalUsers ()); //页面显示的总注册人数
his.context.put("lastUser", ForumRepository.lastRegisteredUser ()); //页面显示的最后注册用户
(完整内容在笔记六中)
net.jforum.repository/ForumRepository.java中
public static int getTotalMessages()
{
return getTotalMessages (false);
}
public static int getTotalMessages(boolean fromDb)
{
Integer i = (Integer)cache.get(FQN, TOTAL_MESSAGES); //取缓存中的内容
int total = i != null ? i.intValue() : 0; //初始值,缓存中的值或0
if (fromDb || total == 0) { //需要从数据表中取或缓存中无值
total = DataAccessDriver.getInstance().newForumDAO().getTotalMessages (); //从数据表中取
cache.add(FQN, TOTAL_MESSAGES, Integer.valueOf(total)); //写入缓存中
}
return total; //返回值
}
net.jforum.dao.generic/GenericForumDAO.java
public int getTotalMessages()
{
int totalMessages = 0;
PreparedStatement pstmt = null;
ResultSet resultSet = null;
try {
pstmt = JForumExecutionContext.getConnection().prepareStatement(
SystemGlobals.getSql("ForumModel.totalMessages"));
//SELECT COUNT(1) as total_messages FROM jforum_posts WHERE need_moderate = 0
//所有不需审查的帖子总数
resultSet = pstmt.executeQuery();
if (resultSet.next()) {
totalMessages = resultSet.getInt("total_messages");
}
return totalMessages;
}
catch (SQLException e) {
throw new DatabaseException(e);
}
finally {
DbUtils.close(resultSet, pstmt);
}
}
下面看总注册人数
net.jforum.repository/ForumRepository.java中
public static Integer totalUsers()
{
return (Integer)cache.get(FQN, TOTAL_USERS); //从缓存中取
}
那么哪里是写入缓存的呢?有以下两个地方:
public static void incrementTotalUsers() //增加注册人数
{
Integer i = (Integer)cache.get(FQN, TOTAL_USERS); //从缓存中取当前注册人数
if (i == null) {
i = Integer.valueOf(0);
}
cache.add(FQN, TOTAL_USERS, Integer.valueOf(i.intValue() + 1)); //总人数加一并写入缓存
}
private void loadUsersInfo() //取最后注册用户信息及注册用户总人数
{ //直接从数据表读取并写入缓存
UserDAO udao = DataAccessDriver.getInstance().newUserDAO();
cache.add(FQN, LAST_USER, udao.getLastUserInfo());
cache.add(FQN, TOTAL_USERS, Integer.valueOf(udao.getTotalUsers ())); //从数据表读出总注册人数并写入缓存
}
net.jforum.dao.generic/GenericUserDAO.java
public int getTotalUsers()
{ //从数据表读出总注册人数
PreparedStatement preparedStatement = null;
try {
preparedStatement = JForumExecutionContext.getConnection().prepareStatement(
SystemGlobals.getSql("UserModel.totalUsers")); //取SQL语句
//SELECT COUNT(1) as total_users FROM jforum_users
return this.getTotalUsersCommon(preparedStatement);
}
catch (SQLException e) {
throw new DatabaseException(e);
}
finally {
DbUtils.close(preparedStatement);
}
}
总注册人数至此结束。下面看最后注册用户。
跟总人数一样,在net.jforum.repository/ForumRepository.java中,也是从缓存中读取的。
public static User lastRegisteredUser()
{
return (User)cache.get(FQN, LAST_USER);
}
在哪里写入的呢?两处,一处是set,另一处是load。
public static void setLastRegisteredUser(User user)
{
cache.add(FQN, LAST_USER, user);
}
private void loadUsersInfo() //取最后注册用户信息及注册用户总人数
{ //直接从数据表读取并写入缓存
UserDAO udao = DataAccessDriver.getInstance().newUserDAO();
cache.add(FQN, LAST_USER, udao.getLastUserInfo ());
cache.add(FQN, TOTAL_USERS, Integer.valueOf(udao.getTotalUsers())); //从数据表读出总注册人数并写入缓存
}
先看LOAD
net.jforum.dao.generic/GenericUserDAO.java
public User getLastUserInfo()
{ //从数据表中取最后注册的用户姓名与ID
PreparedStatement p = null;
ResultSet rs = null;
try {
User user = new User();
p = JForumExecutionContext.getConnection().prepareStatement(
SystemGlobals.getSql("UserModel.lastUserRegistered")); //取SQL语句
//SELECT TOP 1 user_id, username FROM jforum_users ORDER BY user_regdate DESC
rs = p.executeQuery();
rs.next();
user.setUsername(rs.getString("username")); //用户名
user.setId(rs.getInt("user_id")); //用户ID
return user;
}
catch (SQLException e) {
throw new DatabaseException(e);
}
finally {
DbUtils.close(rs, p);
}
}
再看SET。
setLastRegisteredUser
有两处调用
net.jforum.sso/SSOUtils.java中的public void register(final String password, final String email)
及net.jforum.view.forum/UserAction.java中的registrationComplete()
看来这两处是用户注册模块。
小结:本段分析最终注册用户的信息与总注册人数的获取、修改。并发现两个用户注册模块,前一段发现的是认证模块。