前言:discuz是一个很流行的 php论坛,一时好奇,打算学习并将其功能用java实现。
但是个人精力有限,只试着做了很小的一点功能。
但是在此过程中总结了一些经验:
需要转换实现机制的模块
1.计划任务
由于php受语言限制,必须靠外界的访问去触发计划任务,而java则可以通过qutarz来做定时任务.
因此可以采取spring配置 qutarz的方式去设置定时任务.
2.风格机制
使用.jsp,使用jstl语法,允许用户写jstl
依然按目录存放到templates目录下,每个风格为一个文件夹.
3.缓存机制
使用oscache 标签 来缓存页面的方式.
4.特殊标签的解析 hidden标签,reply标签
采取在显示的时候,进行 jsp:include page="/tag/hidden.jsp" 这样的方式来实现.
5.日历选择框: 使用jscalendar
6.页面gzip压缩,使用专门的gzip过滤器.
7.全文检索,使用compass.
8.视图层的模板.
discuz 已经使用了 mvc的模式,只是使用自己开发的模板技术,
D:\xampp\htdocs\bbs\templates每个文件夹为一个主题,每个主题内对应的是各种视图的htm.
因此在用java实现的时候,使用spring mvc ,
视图层使用jsp来展示.
其中页面的布局分为三段
{template header} 是最上面的导航部分
{template footer} 是最下方的版权申明等部分.
中间部分为各具体模块的视图.
后台则是使用的固定框架,然后来合成内容的.
9.国际化支持
discuz使用的是 .lang.php定义数组的方式实现的,而且一次只支持一种语言
而java开发则使用I18N方式.多种语言均使用同一个系统.
1.php的array功能非常强大,而java中只能用map和list结合起来处理.
2.在一个http请求中php的变量几乎都是全局生效,而jstl中,则可以放到requestScope中.
1.discuz的有些表的主键不是自动增长的,因此不能够生成@GeneratedValue(strategy = GenerationType.AUTO)的注释.
这些表有: new String[] {
"validating", "trades", "relatedthreads", "pushedthreads", "polls",
"onlinetime", "memberspaces", "memberfields", "forumfields",
"admingroups", "adminactions", "activities"}
2.mysql的hibernate dao单元测试中,insert是无法回滚的,而delete却可以不操作数据库,
因此crud单元测试的时候,导致不停的插入数据却没有删除数据.
解决办法,在 crud 测试方法的最后加上一行代码: this.setComplete();
3.mysql的jdbc需要几个特殊设置
a.字符编码集必须指定.
b.对于"0000-00-00" 这样的默认日期,在转化成java.sql.Date的时候会出错,因此需要加上个zeroDateTimeBehavior属性.
datasource.url=jdbc:mysql://localhost:3306/discuz?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
4.mysql的jdbc驱动存在bug : http://bugs.mysql.com/bug.php?id=22215
在usergroups 表中, readaccess字段是 tinyint(3)类型,而有值为200的,mysql的jdbc就会报错,说数字越界了.
java.sql.SQLException: '200' in column '1' is outside valid range for the
datatype TINYINT.
暂时无解决办法,采取修改200为20回避之.
(update:后来使用Short代替byte类型)
discuz 已经使用了 mvc的模式,只是使用自己开发的模板技术,
D:\xampp\htdocs\bbs\templates每个文件夹为一个主题,每个主题内对应的是各种视图的htm.
因此在用java实现的时候,使用spring mvc ,
视图层使用jspx来展示.
其中页面的布局分为三段
{template header} 是最上面的导航部分
{template footer} 是最下方的版权申明等部分.
中间部分为各具体模块的视图.
后台则是使用的固定框架,然后来合成内容的.