在上一篇文章中介紹JavaScript實(shí)現(xiàn)級(jí)聯(lián)下拉菜單的例子,本篇繼續(xù)介紹一個(gè)利用現(xiàn)存的JavaScript代碼配合struts構(gòu)成一個(gè)樹型菜單的例子。
大家知道,樹型菜單在應(yīng)用中有著十分廣泛的用途。實(shí)現(xiàn)樹型菜單的途徑較多,本文介紹的一種覺得理解起來比較直觀,與上篇文章的方法比較類似:就是將樹型菜單的節(jié)點(diǎn)保存在數(shù)據(jù)庫(kù)表中(當(dāng)然,在實(shí)際項(xiàng)目中,節(jié)點(diǎn)的信息往往并不是放在一個(gè)單一的表中的。比如:在一個(gè)權(quán)限管理系統(tǒng)中,這些信息可能分別放在用戶表、角色表、功能表等表中,只要設(shè)法讓查詢出來的結(jié)果與下面給出的表格的內(nèi)容相似就可以了。只要稍微有些數(shù)據(jù)庫(kù)方面的知識(shí)做到這點(diǎn)并不難,詳細(xì)的實(shí)現(xiàn)細(xì)節(jié)超出了本文的主題,不在此細(xì)說)。通過數(shù)據(jù)訪問對(duì)象將其從數(shù)據(jù)庫(kù)中查出后放在一個(gè)集合對(duì)象中,并將該集合對(duì)象傳遞給客戶端,再用一段現(xiàn)存的JavaScript代碼--dtree(一個(gè)免費(fèi)的JavaScript程序)來操作集合中的數(shù)據(jù)。大方向確定之后,我們就來具體著手來實(shí)現(xiàn)它。
根據(jù)dtree的要求,我們來建一個(gè)數(shù)據(jù)庫(kù)表來存儲(chǔ)樹的節(jié)點(diǎn)信息,表名為functions,其結(jié)構(gòu)如下:
在表中輸入如下一些記錄以供后面的實(shí)驗(yàn)用:
到此,數(shù)據(jù)庫(kù)方面的準(zhǔn)備工作就告一段落。
接下來的工作我們?nèi)匀辉谙惹敖榻B的mystruts項(xiàng)目中進(jìn)行。先編寫一個(gè)名為:FunctionsForm的ActionForm,其代碼如下:
因?yàn)槲覀兊臉湫凸?jié)點(diǎn)的數(shù)據(jù)都存儲(chǔ)在數(shù)據(jù)庫(kù)表中,接下來,要做一個(gè)數(shù)據(jù)訪問對(duì)象類,名稱為:FunctionsDao.java,其代碼如下:
這里值得注意的是:在以往我們見到的一些顯示樹型菜單的程序,如:一些asp程序中往往簡(jiǎn)單地采用遞歸調(diào)用的方法來查找到樹的各個(gè)節(jié)點(diǎn)。這對(duì)那些樹的深度不確定的場(chǎng)合還是有些用處,但這種處理方法也有一個(gè)致命的弱點(diǎn),那就是反復(fù)地進(jìn)行數(shù)據(jù)庫(kù)查詢,對(duì)一些節(jié)點(diǎn)較多的應(yīng)用,對(duì)應(yīng)用程序性能的影響是非常大的,有時(shí)會(huì)慢得讓人難以接受;而在實(shí)際的應(yīng)用中大多數(shù)情況下樹的深度往往是有限的,如:用于會(huì)計(jì)科目的樹一般最多也在六層以下。又如:用作網(wǎng)頁(yè)功能菜單的情況,網(wǎng)頁(yè)設(shè)計(jì)的原則就有一條是:達(dá)到最終目的地,鼠標(biāo)點(diǎn)擊次數(shù)最好不要多于三次。因此,在實(shí)際設(shè)計(jì)存儲(chǔ)樹型結(jié)構(gòu)的表時(shí)要考慮查詢的效率。對(duì)能確定樹的最大深度的情況下,要設(shè)法盡量?jī)?yōu)化查詢語(yǔ)句,減少查詢次數(shù),以提高應(yīng)用程序的性能同時(shí)減少數(shù)據(jù)庫(kù)的負(fù)荷。
本例對(duì)應(yīng)的Action的名稱為FunctionsAction,其代碼如下:
在struts-config.xml文件中加入如下內(nèi)容:
為了對(duì)應(yīng)配置中的 ,我們還要提供一個(gè)顯示錯(cuò)誤信息的jsp頁(yè)面,其代碼如下:
下面,我們來看一下我們顯示樹型菜單的頁(yè)面代碼,從配置中可以看出,頁(yè)面的名稱為testDTree.jsp,代碼如下:
從 可以看出,我們要在mystruts目錄下,建一個(gè)名為js的目錄,并將下載的dtree文件dtree.js放在該目錄中。
再在mystruts目錄下分別建一個(gè)名為img和名為css的目錄,將dtree中用到的圖標(biāo)和層疊樣式表單文件分別放在相應(yīng)的目錄中。
有關(guān)dtree的使用方法,詳見其說明文檔,如:api.html。筆者在此要感謝dtree的作者為我們提供了一個(gè)結(jié)構(gòu)如此清晰的javascript程序!
現(xiàn)在,可以編譯執(zhí)行這個(gè)例子程序了,編譯后在瀏覽器中輸入:http://127.0.0.1:8080/mystruts/functionsAction.do就可以看到運(yùn)行效果。效果圖為:

注:dtree的下載地址為: http://www.destroydrop.com/javascripts/tree/
大家知道,樹型菜單在應(yīng)用中有著十分廣泛的用途。實(shí)現(xiàn)樹型菜單的途徑較多,本文介紹的一種覺得理解起來比較直觀,與上篇文章的方法比較類似:就是將樹型菜單的節(jié)點(diǎn)保存在數(shù)據(jù)庫(kù)表中(當(dāng)然,在實(shí)際項(xiàng)目中,節(jié)點(diǎn)的信息往往并不是放在一個(gè)單一的表中的。比如:在一個(gè)權(quán)限管理系統(tǒng)中,這些信息可能分別放在用戶表、角色表、功能表等表中,只要設(shè)法讓查詢出來的結(jié)果與下面給出的表格的內(nèi)容相似就可以了。只要稍微有些數(shù)據(jù)庫(kù)方面的知識(shí)做到這點(diǎn)并不難,詳細(xì)的實(shí)現(xiàn)細(xì)節(jié)超出了本文的主題,不在此細(xì)說)。通過數(shù)據(jù)訪問對(duì)象將其從數(shù)據(jù)庫(kù)中查出后放在一個(gè)集合對(duì)象中,并將該集合對(duì)象傳遞給客戶端,再用一段現(xiàn)存的JavaScript代碼--dtree(一個(gè)免費(fèi)的JavaScript程序)來操作集合中的數(shù)據(jù)。大方向確定之后,我們就來具體著手來實(shí)現(xiàn)它。
根據(jù)dtree的要求,我們來建一個(gè)數(shù)據(jù)庫(kù)表來存儲(chǔ)樹的節(jié)點(diǎn)信息,表名為functions,其結(jié)構(gòu)如下:
|
在表中輸入如下一些記錄以供后面的實(shí)驗(yàn)用:
|
到此,數(shù)據(jù)庫(kù)方面的準(zhǔn)備工作就告一段落。
接下來的工作我們?nèi)匀辉谙惹敖榻B的mystruts項(xiàng)目中進(jìn)行。先編寫一個(gè)名為:FunctionsForm的ActionForm,其代碼如下:
|
因?yàn)槲覀兊臉湫凸?jié)點(diǎn)的數(shù)據(jù)都存儲(chǔ)在數(shù)據(jù)庫(kù)表中,接下來,要做一個(gè)數(shù)據(jù)訪問對(duì)象類,名稱為:FunctionsDao.java,其代碼如下:
|
這里值得注意的是:在以往我們見到的一些顯示樹型菜單的程序,如:一些asp程序中往往簡(jiǎn)單地采用遞歸調(diào)用的方法來查找到樹的各個(gè)節(jié)點(diǎn)。這對(duì)那些樹的深度不確定的場(chǎng)合還是有些用處,但這種處理方法也有一個(gè)致命的弱點(diǎn),那就是反復(fù)地進(jìn)行數(shù)據(jù)庫(kù)查詢,對(duì)一些節(jié)點(diǎn)較多的應(yīng)用,對(duì)應(yīng)用程序性能的影響是非常大的,有時(shí)會(huì)慢得讓人難以接受;而在實(shí)際的應(yīng)用中大多數(shù)情況下樹的深度往往是有限的,如:用于會(huì)計(jì)科目的樹一般最多也在六層以下。又如:用作網(wǎng)頁(yè)功能菜單的情況,網(wǎng)頁(yè)設(shè)計(jì)的原則就有一條是:達(dá)到最終目的地,鼠標(biāo)點(diǎn)擊次數(shù)最好不要多于三次。因此,在實(shí)際設(shè)計(jì)存儲(chǔ)樹型結(jié)構(gòu)的表時(shí)要考慮查詢的效率。對(duì)能確定樹的最大深度的情況下,要設(shè)法盡量?jī)?yōu)化查詢語(yǔ)句,減少查詢次數(shù),以提高應(yīng)用程序的性能同時(shí)減少數(shù)據(jù)庫(kù)的負(fù)荷。
本例對(duì)應(yīng)的Action的名稱為FunctionsAction,其代碼如下:
|
在struts-config.xml文件中加入如下內(nèi)容:
|
為了對(duì)應(yīng)配置中的
|
下面,我們來看一下我們顯示樹型菜單的頁(yè)面代碼,從配置中可以看出,頁(yè)面的名稱為testDTree.jsp,代碼如下:
|
從 可以看出,我們要在mystruts目錄下,建一個(gè)名為js的目錄,并將下載的dtree文件dtree.js放在該目錄中。
再在mystruts目錄下分別建一個(gè)名為img和名為css的目錄,將dtree中用到的圖標(biāo)和層疊樣式表單文件分別放在相應(yīng)的目錄中。
有關(guān)dtree的使用方法,詳見其說明文檔,如:api.html。筆者在此要感謝dtree的作者為我們提供了一個(gè)結(jié)構(gòu)如此清晰的javascript程序!
現(xiàn)在,可以編譯執(zhí)行這個(gè)例子程序了,編譯后在瀏覽器中輸入:http://127.0.0.1:8080/mystruts/functionsAction.do就可以看到運(yùn)行效果。效果圖為:

注:dtree的下載地址為: http://www.destroydrop.com/javascripts/tree/