您的位置:寻梦网首页编程乐园Java天地小龙亭之JSP实践之旅
   

frontjsp论坛程序共享篇




hi,这里提供了www.frontjsp.com.cn的论坛的全部程序,只是略做了一点修改。

其实早就想这么做了,不断推迟主要是惰性、没有整理以及缺少时间的缘故。现在让我稍作勤奋一下!!

概貌:
代码中的数据库连接的javabean由robot编写。其余由blueski完成。主要目的是提供参考。其实这些代码都很平常,所以可能没有太多可圈可点的地方,无非是把很多平凡的代码拼起来,组成一个平凡的论坛而已。:)
我猜想,你也许可以看一下的大概是数据库连接(我们的方法比较特别,并不推荐。
但我喜欢用这种静态函数的方法),另外可以看看我们对递归调用实现多级回复的处理。另外,后台程序有各种修改处理,包括把任意子树搬迁到任何地方。

欢迎您直接访问frontjsp看看代码的效果如何,目前人气很不足。:(

关于数据库连接


frontjsp论坛采用了Oracle8.16 for Linux。使用了JDBC和Connection pool。另外还使用了
Hashtable和游标技术。这些说明以后请robot详细介绍了。

关于多级回复的实现

有很多种方法来实现。在frontjsp的JSP论坛中有多次的讨论。例如,可以把序列放在一个实数字段中。父贴是一个整数,子贴是父贴整数加上一个小数;或者要两个表来操作;我的同事有一个很妙的方法,就是在每条记录的path字段记录它的路径。例如
"/1/4/20/"这样子,1是4的父结点,4是20的父结点,然后又有一种快速方法来取到记录,不必反复读数据库了。不过现在我无法复述出来。而且我还是偏爱递归的方法,据说反复读数据库效率不高,这个我没有测试过。关于递归取得数据,现在用得好象还是很多的,例如动态的TreeView控件就用得很多,做软件的大都很熟悉吧,这里不再详解了。可直接查看ForumAppBean.java。
这里我“发明”了一种办法,父帖及其子贴共用一个treeid,其值就是父贴的id。全部程序中有多处享受到了这个方法的便利。^O^
典型的使用方法是:
strTreeID=(String) fields.get("F_TREEID");
ForumAppBean.getMainRecord(request,out,strTreeID);
就可以根据某个ID好打印出一整棵树。

直接使用的问题

虽然几乎全部文件都已经提供。但要直接使用,还有些障碍。
1 如果你不使用Oracle数据库,则要将数据类型稍加处理。
2 为保密起见,我把数据库的口令清为"XXXXXX"。你肯定能够谅解的。我不知道oracle
是否直接带了JDBC驱动程序,要提供下载似乎太大了,你还可以直接改用jdbc-odbc方式。
3 在提交帖子的时候将通过session来判断是否已经登录,如果还没有登录则将转向
登录界面,当前的断点(页面名称被记录在session中),登录完成后自动转回来。
这些代码可以屏蔽掉,并可使用您自己的登录程序。
4 关于使用平台,这些代码可以直接在win9x/resin下使用,去掉第一行
<%@ page contentType="text/html;charset=gb2312" %>后可以直接在linux/tomcat下使用。
5 还有,我使用了在user数据库中的email字段。
你可以修改查询的sql语句使之在论坛页中不显示email,否则可能看不到记录或发生查询操作的异常。当然,还可以用Left Join方法来避免没有email数据的问题。
不知道为什么,我总预感这些代码很可能在你那里会运行不顺利。因为我仍然是在原来的计算机上检测,没有仔细地在别的地方测试过。万一有什么问题,可直接来信提出批评,或者只是扫描一下吧。
6 在回复处理的页面中有发邮件的处理,但这里没有提供邮件处理的javabean。所以最好把有关代码屏蔽起来。

更好的建议:

万一这些代码增加了你对制作论坛的兴趣,或者正想得到参考,我还想建议你去研究
jive,在www.coolservlets.com/jive下载。那里有最专业的免费源代码,而我们这里的是很业余的,而且没有很费心地整理完全。

数据库说明

可能不需要太多的说明,生成脚本如下:
-- ============================================================
-- Table6: forum
-- ============================================================
create table forum
(
F_ID number(10) not null,
F_TITLE varchar2(100) not null,
F_SPEAKER varchar(20) not null,
F_TIME date default sysdate not null,
F_REPLYNUM number(4) default 0 not null,
F_CLICKNUM number(4) default 0 not null,
F_BELONGID number(10) not null,
F_CONTENT varchar2(4000) null,
F_NEEDEMAIL number(1) default 1 not null,
F_LENGTH number(6) default 0 null,
F_BEST number(1) default 0 null,
F_TREEID number(10) null,
constraint pk_forum primary key (F_ID)
);

create trigger forum_auto_inc
before insert on forum
for each row
declare
f_no integer;
begin
select max(F_ID) into f_no from forum;
if f_no>=1 then
:new.F_ID:=f_no+1;
else
:new.F_ID:=1;
end if;
end;
/
其中自动增量这里用触发器来实现。PL SQL语言功能确实很强大。据说有很多种实现
自动增量的方法,包括使用触发器生成器等,我都没有试过。

文件列表及使用说明

<forum>目录下
forum.sql 数据库表及trigger,在SQL Plus中打开运行即可。如果是别的数据库,可以稍做修改。
forum.jsp 论坛主体文件
forumcontent.jsp 显示论坛记录内容
forumreply.jsp 论坛回复记录处理
forumaddtopic.jsp 增加主题
forumsearch.jsp 搜索引擎,显示搜索页面

forumshow.jsp 后台管理显示记录
forumedit.jsp 后台管理修改信息界面
forumedit_deal.jsp 后台管理修改信息的处理
<share>
<forumimage> 下面有表情图片以及各类论坛的duke像片。
title.js 页面头文件
bottom.js 页面尾文件
jsp.css CSS样式文件

以上文件可以放在发行目录中。

<bean>目录下有<com/frontjsp/db>目录,其中有:
cursor.java 数据库游标处理
ForumAppBean.java 包括递归等处理
connectionpool.java 调用Oracle的支持方法实现数据连接缓冲池,可加快访问速度
DataSetBean.java
TableBean.java 以经不用了,但其中的方法仍然可以参考
myora.java 改用jdbc-odbc的连接做法

这些文件可放在resin的WEB-INF/classes/com/frontjsp/db
如果一切顺利,那么forum.jsp是前台的主文件,而forumshow.jsp是后台的主文件。

未完成的工作

session有效时间是一个bug。目前好象没有能够加以控制。虽然tomcat提供了session时间
的设置,但实际上没有效果。
日期判断,如果是最近2天的,在标题后面用红色斜体字显示"New".
单引号用&apos;替换,但实际上不对。
最不好的事情:没有整理得很干净!
当前在线人数没有做出来。
搜索以后我只要一棵树上某条记录有此关键字我就把整棵树列出来,这可能很不负责。
本来应该是先列出整棵树,再让所有包含此关键字的帖子以红色显示。
我还发现后台管理程序和前台没有同步。实际上后台管理程序还是前一个版本的。不过没有大问题。前台程序使用了javabean,比较精练一些。后台程序把所有处理都放在jsp中,这可以看作是“虚拟小龙亭”代码的改进。

。。。


后记

一边看,一边写,一边回想起以前做这些程序时的心情与感想来。很多遗留问题现在才忽然想起,不觉有些惭愧。
最后我想到了一句成语可以掩饰我的惭愧,那就是“抛砖引玉”。希望多提宝贵意见。也希望国内网上的自由代码多起来。而这些论坛代码只算一个药引子吧,其实还是杜甫说的好:安得广厦千万间,大庇天下寒士俱欢颜,吾庐独破受冻死亦足。

:)

多谢阅读本文。


<编写>Blueski</编写>

<日期>2001/03/5</日期>