前言:discuz是一個(gè)很流行的 php論壇,一時(shí)好奇,打算學(xué)習(xí)并將其功能用java實(shí)現(xiàn)。
但是個(gè)人精力有限,只試著做了很小的一點(diǎn)功能。
但是在此過程中總結(jié)了一些經(jīng)驗(yàn):
需要轉(zhuǎn)換實(shí)現(xiàn)機(jī)制的模塊
1.計(jì)劃任務(wù)
由于php受語(yǔ)言限制,必須靠外界的訪問去觸發(fā)計(jì)劃任務(wù),而java則可以通過qutarz來做定時(shí)任務(wù).
因此可以采取spring配置 qutarz的方式去設(shè)置定時(shí)任務(wù).
2.風(fēng)格機(jī)制
使用.jsp,使用jstl語(yǔ)法,允許用戶寫jstl
依然按目錄存放到templates目錄下,每個(gè)風(fēng)格為一個(gè)文件夾.
3.緩存機(jī)制
使用oscache 標(biāo)簽 來緩存頁(yè)面的方式.
4.特殊標(biāo)簽的解析 hidden標(biāo)簽,reply標(biāo)簽
采取在顯示的時(shí)候,進(jìn)行 jsp:include page="/tag/hidden.jsp" 這樣的方式來實(shí)現(xiàn).
5.日歷選擇框: 使用jscalendar
6.頁(yè)面gzip壓縮,使用專門的gzip過濾器.
7.全文檢索,使用compass.
8.視圖層的模板.
discuz 已經(jīng)使用了 mvc的模式,只是使用自己開發(fā)的模板技術(shù),
D:\xampp\htdocs\bbs\templates每個(gè)文件夾為一個(gè)主題,每個(gè)主題內(nèi)對(duì)應(yīng)的是各種視圖的htm.
因此在用java實(shí)現(xiàn)的時(shí)候,使用spring mvc ,
視圖層使用jsp來展示.
其中頁(yè)面的布局分為三段
{template header} 是最上面的導(dǎo)航部分
{template footer} 是最下方的版權(quán)申明等部分.
中間部分為各具體模塊的視圖.
后臺(tái)則是使用的固定框架,然后來合成內(nèi)容的.
9.國(guó)際化支持
discuz使用的是 .lang.php定義數(shù)組的方式實(shí)現(xiàn)的,而且一次只支持一種語(yǔ)言
而java開發(fā)則使用I18N方式.多種語(yǔ)言均使用同一個(gè)系統(tǒng).
1.php的array功能非常強(qiáng)大,而java中只能用map和list結(jié)合起來處理.
2.在一個(gè)http請(qǐng)求中php的變量幾乎都是全局生效,而jstl中,則可以放到requestScope中.
1.discuz的有些表的主鍵不是自動(dòng)增長(zhǎng)的,因此不能夠生成@GeneratedValue(strategy = GenerationType.AUTO)的注釋.
這些表有: new String[] {
"validating", "trades", "relatedthreads", "pushedthreads", "polls",
"onlinetime", "memberspaces", "memberfields", "forumfields",
"admingroups", "adminactions", "activities"}
2.mysql的hibernate dao單元測(cè)試中,insert是無法回滾的,而delete卻可以不操作數(shù)據(jù)庫(kù),
因此crud單元測(cè)試的時(shí)候,導(dǎo)致不停的插入數(shù)據(jù)卻沒有刪除數(shù)據(jù).
解決辦法,在 crud 測(cè)試方法的最后加上一行代碼: this.setComplete();
3.mysql的jdbc需要幾個(gè)特殊設(shè)置
a.字符編碼集必須指定.
b.對(duì)于"0000-00-00" 這樣的默認(rèn)日期,在轉(zhuǎn)化成java.sql.Date的時(shí)候會(huì)出錯(cuò),因此需要加上個(gè)zeroDateTimeBehavior屬性.
datasource.url=jdbc:mysql://localhost:3306/discuz?useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull
4.mysql的jdbc驅(qū)動(dòng)存在bug : http://bugs.mysql.com/bug.php?id=22215
在usergroups 表中, readaccess字段是 tinyint(3)類型,而有值為200的,mysql的jdbc就會(huì)報(bào)錯(cuò),說數(shù)字越界了.
java.sql.SQLException: '200' in column '1' is outside valid range for the
datatype TINYINT.
暫時(shí)無解決辦法,采取修改200為20回避之.
(update:后來使用Short代替byte類型)
discuz 已經(jīng)使用了 mvc的模式,只是使用自己開發(fā)的模板技術(shù),
D:\xampp\htdocs\bbs\templates每個(gè)文件夾為一個(gè)主題,每個(gè)主題內(nèi)對(duì)應(yīng)的是各種視圖的htm.
因此在用java實(shí)現(xiàn)的時(shí)候,使用spring mvc ,
視圖層使用jspx來展示.
其中頁(yè)面的布局分為三段
{template header} 是最上面的導(dǎo)航部分
{template footer} 是最下方的版權(quán)申明等部分.
中間部分為各具體模塊的視圖.
后臺(tái)則是使用的固定框架,然后來合成內(nèi)容的.