Jive(J道)升级通知(又一数据库批量查询方法应用)
今天更新升级了jive(J道)1.1版:
1. 将global.jsp代码重构,每个用户采取session保存FourmFactory,原来是每次Jsp页面产生时才即时产生,我认为耗时浪费CPU,增加了com.jdon.web.UserEnvFront类,用来保存运行期间的一些重要数据。
使用com.jdon.web.DisplayUtil将原来global.jsp中讨厌的有关显示的方法全部包装进去,我真看不惯Jsp中写Java方法的,简直会误人子弟。
2.增加用户所有明细贴查询,只要点按用户名,就可以查询出他的所有发贴明细,我认为这个功能很重要,可以让后来者对其他参与者的发言情况有详细了解,并有助于搜索信息(只要大概记住是谁发表的就可以)。
由于Jive中的thread页面显示是采取filter的decorator模式,总体思路是这样:
//准备好结果ResultFilter ResultFilter filter = new ResultFilter(); filter.setStartIndex(start); filter.setNumResults(range);
。。。。。。 //得到某个页面的所有thread ForumThreadIterator threads = forum.threads(filter);
|
在forum.threads(filter)里的做法是,根据filter动态重组成SQL语句,查询得到页面的所有ID集合(不是所有记录),返回ForumMessageBlockIterator这是类似Pet Store中的Page类(Page by page iterator模式),注意ForumMessageBlockIterator与DatabaseObjectIterator是有区别的:
前者是一个页面中的iterator,并且加入用户权限验证Proxy,后者是通用的一般Iterator,主要是Jive的用户管理模块用的比较多。
增加用户所有明细贴查询这一功能,看似容易,实际有点小技巧,本来想使用Forum.jsp中显示thread那样的页面排序法,但是由于这种方法是使用filter确定出操作数据库的SQL语句,根据这个模式走下去,还要构造ForumMessagIteartor这样新类(可以参考ForumThreadIteartor),当时我觉得没有必要。
前面讨论过,数据库批量查询有两种方法,一种是Jive里上面的方法,一种是Pet Store中的方法,那么这里我就搬迁了Pet Store中的方法,改造后的DbUserManager的userMessages(User user)为下面:
public Iterator userMessages(User user,int start, int count) { LongList messages = new LongList(); Connection con = null; PreparedStatement pstmt = null; int total =userMessageCount(user) ; try { con = ConnectionManager.getConnection(); pstmt = con.prepareStatement(ALL_USER_MESSAGES); pstmt.setLong(1, user.getID()); ResultSet rs = pstmt.executeQuery(); if (start >= 0 && start < total) { //使用Pet Store的rs定位 rs.absolute(start+1); do { messages.add(rs.getLong(1)); } while (rs.next() && (--count > 0)); } } catch( SQLException sqle ) { sqle.printStackTrace(); } finally { try { pstmt.close(); } catch (Exception e) { e.printStackTrace(); } try { con.close(); } catch (Exception e) { e.printStackTrace(); } } return new DatabaseObjectIterator(JiveGlobals.MESSAGE, messages.toArray(), factory); }
|
目前上述更改已经上传CVS服务器。