目的 通過配置文件himenu-config.xml動態(tài)裝配樹型結(jié)構(gòu),要求不對V端(JSP或Javascript)不做任何修改,樹的深度—深度包括兩層含義1組件與組件之間的關(guān)聯(lián)層次的深度2樹本身的層次的深層—不做任何限制,動態(tài)—動態(tài)也包括兩層含義1樹本身的數(shù)據(jù)是動態(tài)的均應(yīng)從數(shù)據(jù)庫中調(diào)用2動態(tài)加載即只有點(diǎn)擊當(dāng)前層的節(jié)點(diǎn)時才去加載當(dāng)前層的下一層數(shù)據(jù)—構(gòu)建,多語言的支持要求可配置—從數(shù)據(jù)庫取出的數(shù)據(jù)可以是直接顯示的也可是資源文件中的鍵值以支持多語言。最終的目的就是通過配置而不用寫任何代碼來實(shí)現(xiàn)樹型結(jié)構(gòu)的自動渲染。
資源 參考資源1.struts-menu 2.Xtree 3.XLoadTree 4.XMLDcoder
規(guī)則 一個組件只能有0-1個父組件,一組件只能有0-2個子組,也可自描述即,一個組件可以是它自已的父組件
原理 當(dāng)調(diào)用action時要帶入至少一個參數(shù)如下面這樣的一個URL 有兩個參數(shù)menuName為配置文件中菜單的名稱type為重定向的位向返回的字符串,其中nenuName參數(shù)是必須填寫的,具體配置參見/WEB-INF/config/hi.xml配置文檔tree.action
?menuName=menuName(himenu-config.xml)&type=nextforwardName通過配置。 WebDynamicTreeManager treemgr=new WebDynamicTreeManager(); //創(chuàng)建動態(tài)樹管理器
request.setAttribute("com.hi.tree.menu",treemgr.getMenu(request.getParameter("menuName"),parMap,contain)); //treemgr.getMenu()方法得到動態(tài)樹的HiMenuComponet對象 ; treemgr. getLoadMenu()方法為動態(tài)加載的HiMenuComponet對象注意該方法只構(gòu)建一層HiMenuComponet對象,每次都是動態(tài)加載下一層數(shù)據(jù)。返回的JSP頁面主要的代碼為
<menu:useMenuDisplayer name="Velocity" config="/templates/xtree.html" //指定要處理當(dāng)前模板的顯示類bundle="org.apache.struts.action.MESSAGE">
if (document.getElementById) {
<hi:displayMenu name="com.hi.tree.menu"/> //將HiMenuComponet對象按顯示類對象的約束畫出來
內(nèi)部運(yùn)行機(jī)制參見API。
菜單配置:
keymap |
用于存儲父子關(guān)系的值(注:該屬性只對動態(tài)樹有效) |
|||
parent |
當(dāng)前菜單作為父菜單的POJO屬性名 |
|||
child |
當(dāng)前菜單作為子菜單的POJO屬性名 |
|||
childValue |
查詢子菜單時初始缺省值 |
|||
menuName |
菜單名稱與key值應(yīng)保持一致 |
|||
beanName |
對應(yīng)數(shù)據(jù)庫對象的javaBean類的全限定名 |
|||
submenuName |
當(dāng)前菜單所有的子菜單名稱,最多只能包含兩個子菜單,以逗號分隔 |
|||
title |
作為樹根顯示的文字 |
|||
titleField |
各節(jié)點(diǎn)顯示文字的字段名 |
|||
needShow |
是否顯示,可以作為激活條件 |
|||
sort |
當(dāng)前層上所有節(jié)點(diǎn)的排列順序,對應(yīng)數(shù)據(jù)庫對象中的字段名 |
|||
action |
當(dāng)前節(jié)點(diǎn)的動作,分3種策略 |
{js} |
標(biāo)記執(zhí)行javascript代碼 |
|
{url} |
標(biāo)記鏈接動作 |
|||
{property} |
.對存儲于數(shù)據(jù)庫中字段的值的讀??;數(shù)據(jù)庫中可以存儲鏈接{url}XXX,{js}XXXX等,可以再次解析執(zhí)行 |
|||
javascript |
定義通過{js}指定的要執(zhí)行的js函數(shù) |
|||
bundle |
如果標(biāo)題顯示要支持多語言,要加上對應(yīng)的資源文件的路徑與文件名 |
|||
target |
如果有多個frame可以指定action功能后的目標(biāo) |
|||
checkbox |
如果需要顯示復(fù)選框就為true |
|||
iconmap |
如果節(jié)點(diǎn)右側(cè)還要求多加幾個圖標(biāo)及與圖標(biāo)對應(yīng)的action |
|||
leafMethod |
在使用延時加載樹時要配置,注意只有在動態(tài)樹中配置才有效,且該屬性的值應(yīng)是對應(yīng)POJO下的一個無參方法并且返回類型與boolean |
|||
cache |
樹所描述的數(shù)據(jù)庫是否加入緩存,注意加入緩沖區(qū)的數(shù)據(jù)將不會因數(shù)據(jù)的更新而更新,注意只有在靜態(tài)樹中配置有效 |
|||
filter |
對菜單樹的數(shù)據(jù)進(jìn)行過濾,提供兩種接口方式對數(shù)據(jù)進(jìn)行過濾 MenuFilterProcessor 在獲取數(shù)據(jù)之前填加過濾器 MenuCollectionProcessor 在獲取數(shù)據(jù)之后再對數(shù)據(jù)做整理 動態(tài)數(shù)據(jù)參數(shù)通過url傳遞:tree.action**&id=2 |
|||
動態(tài)樹訪問配置 |
loadTree.action?menuName=agentTree |
|||
靜態(tài)加載的url配置 |
tree.action?menuName=agentTree |
|||
提示:所有的配置信息必須寫在WEB-INF/config/himenu-config.xml文件中。該文件實(shí)際上是在描述一個HashMap,每個key對應(yīng)的都是一個菜單名、value對應(yīng)著 com.hi.tools.tree.WebDynamicMenuDefine類的實(shí)例,該類只是一個簡單的javaBean,裝載對菜單樹的配置信息 注意其中agentTree是在/WEB-INF/config/himenu-config.xml 配置的樹配置 |
||||
[#id] |
其中的id是bean的屬性名用“[# ]”封起來表示取其相應(yīng)的值 |
|||
1.執(zhí)行javascript:使用{js}來標(biāo)記實(shí)例代碼:<void property="action">
<string>{js}backAgent([#id],"'[#orgName]"');</string> //[#id]動態(tài)取出bean屬性為id的值,
// backAgent是在點(diǎn)擊樹形鏈接要執(zhí)行的js函數(shù)名
</void>
javascript定義通過{js}指定的要執(zhí)行的js函數(shù)
<void property="javascript">
<string>
function backAgent (id,orgName){
opener.document.getElementById('agent.parentOrgName').value=orgName;
opener.document.getElementById('agent.id').value=id;
window.close();
}
</string>
</void>
2.鏈接:<void property="action">
<string>{url}test.action?id=[#id]&name=[#name]</string>
//在點(diǎn)擊樹形鏈接時會請求test.action并且動態(tài)帶回id和name的值
3.對存儲于數(shù)據(jù)庫中字段的值的讀取:<void property="action"><string>{property}link
</string> //link是數(shù)據(jù)庫字段名非bean屬性,即POJO的類名
iconmap 如果節(jié)點(diǎn)右側(cè)還要求多加幾個圖標(biāo)及與圖標(biāo)對應(yīng)的action
<string>images/openfoldericon.png</string>
<string>commonEditAction.hi?bo=HiUser&recodeNum=[#himenuitemid]</string>
<void property="leafMethod">
<string>getLeaf</string>//getLeaf是pojo類中檢查但前節(jié)點(diǎn)是不是頁節(jié)點(diǎn)的方法名主要用于動態(tài)數(shù)
</void>
<void property="cache">
<boolean>true</boolean>
</void>
<void property="filter">
<string>demo.tree.AuthUserGroupCollProcessor</string>
</void>
代碼文件 /WEB-INF/menu-config.xml struts-menu本身的配置文件
/WEB-INF/config/himenu-config.xml 所有樹的配置文件
com.hi.tools.tree.WebDynamicMenuDefine.java 與配置文件中單個菜單對應(yīng)的javaBean
com.hi.tools.tree. HiMenuComponent.java 樹組件文件
com.hi.tools.tree. WebDynamicTreeManager.java 動態(tài)加載樹組件
/common/commonTree.jsp 通用樹顯示頁面
/common/commonLoadTree.jsp 通用動態(tài)加載樹顯示頁面
/common/subMenu.jsp 當(dāng)動態(tài)加載樹點(diǎn)擊某節(jié)點(diǎn)時調(diào)用的JSP文件,該文件最終組成一個XLoadTree支持的xml文件
/templates/xtree.html 顯示樹的模板文件
/templates/xloadtree.html 顯示動態(tài)加載樹的模板文件
/templates/xloadsub.html 當(dāng)動態(tài)加載樹點(diǎn)擊某節(jié)點(diǎn)時的模板文件 ;模板文件均由JSP文件中的標(biāo)簽調(diào)用
/scripts/xtree.js; /scripts/xloadtree.js; /scripts/xmextras.js 均為將數(shù)據(jù)轉(zhuǎn)換為html字符打印并顯示出來
配置文檔詳解
<void method="put">
<string>agentTree</string>
<object class="org.hi.base.menu.strutsmenu.WebDynamicMenuDefine"><!--配置樹對應(yīng)的類實(shí)例 -->
<void property="keymap"><!--配置父子關(guān)系-->
<object class="java.util.HashMap"> s
<void method="put">
<string>id</string>
<string>parentOrg</string>
</void><!--id和parentOrg都beanName對應(yīng)的bean的屬性名-->
</object>
</void>
<void property="parent">
<string>id</string>
</void>
<void property="child">
<string>parentOrg</string>
</void><!--parent和child指定父子關(guān)系-->
<void property="childValue">
<string>0</string>
</void>
<void property="menuName"><!--配置樹名-->
<string>agentTree</string>
</void>
<void property="beanName"><!--配置要形成樹的bean -->
<string>com.cltc.maotai.agent.model.Agent</string>
</void>
<void property="submenuName"><!--擴(kuò)展節(jié)點(diǎn)的數(shù)名-->
<string>agentTree</string>
</void>
<void property="title">
<string>代理</string><!--跟節(jié)點(diǎn)的名稱-->
</void>
<void property="titleField">
<string>orgName</string><!--顯示文字的字段名-->
</void>
<void property="needShow">
<boolean>true</boolean><!--是否顯示-->
</void>
<void property="cache"><!--定義在靜態(tài)樹的中是否使用緩存-->
<boolean>true</boolean>
</void>
<void property="javascript"><!--定義{js}標(biāo)記的要執(zhí)行的js函數(shù)-->
<string>
function backAgent(id,orgName){
opener.document.getElementById('agent.parentOrgName').value=orgName;
opener.document.getElementById('agent.parentOrg.id').value=id;
window.close();
}
</string>
</void>
<void property="iconmap"><!--樹的節(jié)點(diǎn)鏈接后面使用圖標(biāo)-->
<object class="java.util.HashMap">
<void method="put">
<string>images/b2xwhite.gif</string>
<string>{js}backAgent([#id],"'[#orgName]"');</string>
</void><!--如果函數(shù)中的參數(shù)是字符串必須寫成"'[#orgName]"'這樣的格式orgName是bean屬性名,注意在方法參數(shù)中如果是字符串則要通過"’做轉(zhuǎn)義,并且只能用單引號 -->
</object>
</void>
<void property="action"><!--菜單節(jié)點(diǎn)上所要執(zhí)行的動作可以是URL也可是js的方法-->
<string>{url}agentEdit.action?id=[#id]</string>
</void>
<void property="checkbox"><!--定義是否在樹中使用復(fù)選框,頁面配套調(diào)用函數(shù)selectedcb() -->
<boolean>true</boolean>
</void>
<void property="leafMethod">
<string>getLeaf</string>
</void><!--配置動態(tài)樹中檢驗(yàn)是不是頁節(jié)點(diǎn)的函數(shù),此函數(shù)定義在beanName指定的bean中,目的是檢測該節(jié)點(diǎn)還有沒有子結(jié)點(diǎn)-->
</object>
</void>