張昊

          J-Hi(http://www.j-hi.net)

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            45 Posts :: 1 Stories :: 110 Comments :: 0 Trackbacks

          目的 通過配置文件himenu-config.xml動態裝配樹型結構,要求不對V端(JSPJavascript)不做任何修改,樹的深度深度包括兩層含義1組件與組件之間的關聯層次的深度2樹本身的層次的深層不做任何限制,動態動態也包括兩層含義1樹本身的數據是動態的均應從數據庫中調用2動態加載即只有點擊當前層的節點時才去加載當前層的下一層數據構建,多語言的支持要求可配置從數據庫取出的數據可以是直接顯示的也可是資源文件中的鍵值以支持多語言。最終的目的就是通過配置而不用寫任何代碼來實現樹型結構的自動渲染。

          資源 參考資源1.struts-menu 2.Xtree 3.XLoadTree 4.XMLDcoder

          規則 一個組件只能有0-1個父組件,一組件只能有0-2個子組,也可自描述即,一個組件可以是它自已的父組件

          原理 當調用action時要帶入至少一個參數如下面這樣的一個URL 有兩個參數menuName為配置文件中菜單的名稱type為重定向的位向返回的字符串,其中nenuName參數是必須填寫的,具體配置參見/WEB-INF/config/hi.xml配置文檔tree.action

          ?menuName=menuName(himenu-config.xml)&type=nextforwardName通過配置。           WebDynamicTreeManager treemgr=new WebDynamicTreeManager(); //創建動態樹管理器

          request.setAttribute("com.hi.tree.menu",treemgr.getMenu(request.getParameter("menuName"),parMap,contain)); //treemgr.getMenu()方法得到動態樹的HiMenuComponet對象 ; treemgr. getLoadMenu()方法為動態加載的HiMenuComponet對象注意該方法只構建一層HiMenuComponet對象,每次都是動態加載下一層數據。返回的JSP頁面主要的代碼為

          <menu:useMenuDisplayer name="Velocity" config="/templates/xtree.html"  //指定要處理當前模板的顯示類bundle="org.apache.struts.action.MESSAGE">

          if (document.getElementById) {

          <hi:displayMenu name="com.hi.tree.menu"/>   //HiMenuComponet對象按顯示類對象的約束畫出來

          內部運行機制參見API

          菜單配置

          keymap

          用于存儲父子關系的值(注:該屬性只對動態樹有效)

          parent

          當前菜單作為父菜單的POJO屬性名

          child

          當前菜單作為子菜單的POJO屬性名

          childValue

          查詢子菜單時初始缺省值

          menuName

          菜單名稱與key值應保持一致

          beanName

          對應數據庫對象的javaBean類的全限定名

          submenuName

          當前菜單所有的子菜單名稱,最多只能包含兩個子菜單,以逗號分隔

          title

          作為樹根顯示的文字

          titleField

          各節點顯示文字的字段名

          needShow

          是否顯示,可以作為激活條件

          sort

          當前層上所有節點的排列順序,對應數據庫對象中的字段名

          action

          當前節點的動作,分3種策略

          {js}

          標記執行javascript代碼

          {url}

          標記鏈接動作

          {property}

          .對存儲于數據庫中字段的值的讀取;數據庫中可以存儲鏈接{url}XXX{js}XXXX等,可以再次解析執行

          javascript

          定義通過{js}指定的要執行的js函數

          bundle

          如果標題顯示要支持多語言,要加上對應的資源文件的路徑與文件名

          target

          如果有多個frame可以指定action功能后的目標

          checkbox

          如果需要顯示復選框就為true

          iconmap

          如果節點右側還要求多加幾個圖標及與圖標對應的action

          leafMethod

          在使用延時加載樹時要配置,注意只有在動態樹中配置才有效,且該屬性的值應是對應POJO下的一個無參方法并且返回類型與boolean

          cache

          樹所描述的數據庫是否加入緩存,注意加入緩沖區的數據將不會因數據的更新而更新,注意只有在靜態樹中配置有效

          filter

          對菜單樹的數據進行過濾,提供兩種接口方式對數據進行過濾

          MenuFilterProcessor 在獲取數據之前填加過濾器

          MenuCollectionProcessor 在獲取數據之后再對數據做整理

          動態數據參數通過url傳遞:tree.action**&id=2

          動態樹訪問配置

          loadTree.action?menuName=agentTree

          靜態加載的url配置

          tree.action?menuName=agentTree

          提示:所有的配置信息必須寫在WEB-INF/config/himenu-config.xml文件中。該文件實際上是在描述一個HashMap,每個key對應的都是一個菜單名、value對應著 com.hi.tools.tree.WebDynamicMenuDefine類的實例,該類只是一個簡單的javaBean,裝載對菜單樹的配置信息

          注意其中agentTree是在/WEB-INF/config/himenu-config.xml 配置的樹配置

          [#id]

          其中的idbean的屬性名用“[# ]”封起來表示取其相應的值






          1.執行javascript:使用{js}來標記實例代碼:<void property="action">

               <string>{js}backAgent([#id],"'[#orgName]"');</string> //[#id]動態取出bean屬性為id的值,

          // backAgent是在點擊樹形鏈接要執行的js函數名

          </void>

          javascript定義通過{js}指定的要執行的js函數

              <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]&amp;name=[#name]</string>

          //在點擊樹形鏈接時會請求test.action并且動態帶回idname的值

          3.對存儲于數據庫中字段的值的讀取<void property="action"><string>{property}link

          </string> //link是數據庫字段名非bean屬性,即POJO的類名

          iconmap 如果節點右側還要求多加幾個圖標及與圖標對應的action

                               <string>images/openfoldericon.png</string>

                 <string>commonEditAction.hi?bo=HiUser&amp;recodeNum=[#himenuitemid]</string>

          <void property="leafMethod">

              <string>getLeaf</string>//getLeafpojo類中檢查但前節點是不是頁節點的方法名主要用于動態數

              </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 與配置文件中單個菜單對應的javaBean

          com.hi.tools.tree. HiMenuComponent.java   樹組件文件

                               com.hi.tools.tree. WebDynamicTreeManager.java 動態加載樹組件

          /common/commonTree.jsp 通用樹顯示頁面

          /common/commonLoadTree.jsp 通用動態加載樹顯示頁面

          /common/subMenu.jsp 當動態加載樹點擊某節點時調用的JSP文件,該文件最終組成一個XLoadTree支持的xml文件

          /templates/xtree.html 顯示樹的模板文件

          /templates/xloadtree.html 顯示動態加載樹的模板文件

          /templates/xloadsub.html 當動態加載樹點擊某節點時的模板文件  ;模板文件均由JSP文件中的標簽調用

          /scripts/xtree.js; /scripts/xloadtree.js; /scripts/xmextras.js 均為將數據轉換為html字符打印并顯示出來

          配置文檔詳解

          <void method="put">

             <string>agentTree</string>

             <object class="org.hi.base.menu.strutsmenu.WebDynamicMenuDefine"><!--配置樹對應的類實例 -->

              <void property="keymap"><!--配置父子關系-->

               <object class="java.util.HashMap"> s

                <void method="put">

                 <string>id</string>

                 <string>parentOrg</string>

                </void><!--idparentOrgbeanName對應的bean的屬性名-->

               </object>

              </void>

             <void property="parent">

               <string>id</string>

              </void>

              <void property="child">

               <string>parentOrg</string>

              </void><!--parentchild指定父子關系-->

              <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"><!--擴展節點的數名-->

               <string>agentTree</string>

              </void>

              <void property="title">

               <string>代理</string><!--跟節點的名稱-->

              </void>

              <void property="titleField">

               <string>orgName</string><!--顯示文字的字段名-->

              </void>

              <void property="needShow">

               <boolean>true</boolean><!--是否顯示-->

              </void>

              <void property="cache"><!--定義在靜態樹的中是否使用緩存-->

               <boolean>true</boolean>

              </void>

              <void property="javascript"><!--定義{js}標記的要執行的js函數-->

               <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"><!--樹的節點鏈接后面使用圖標-->

               <object class="java.util.HashMap">

                <void method="put">

                 <string>images/b2xwhite.gif</string>

                 <string>{js}backAgent([#id],"'[#orgName]"');</string>

                </void><!--如果函數中的參數是字符串必須寫成"'[#orgName]"'這樣的格式orgNamebean屬性名,注意在方法參數中如果是字符串則要通過"’做轉義,并且只能用單引號 -->

               </object>

              </void>

               <void property="action"><!--菜單節點上所要執行的動作可以是URL也可是js的方法-->

               <string>{url}agentEdit.action?id=[#id]</string>

              </void>   

           <void property="checkbox"><!--定義是否在樹中使用復選框,頁面配套調用函數selectedcb() -->

              <boolean>true</boolean>

              </void>

             <void property="leafMethod">

              <string>getLeaf</string>

              </void><!--配置動態樹中檢驗是不是頁節點的函數,此函數定義在beanName指定的bean中,目的是檢測該節點還有沒有子結點-->

             </object>

          </void>

          posted on 2011-03-29 00:00 張昊 閱讀(1846) 評論(1)  編輯  收藏

          Feedback

          # re: J-Hi無編碼(通過配置文件)菜單樹型結構的應用與實現 2011-06-17 11:19 龍歌
          我太笨了? 看不懂  回復  更多評論
            


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 屯留县| 攀枝花市| 宜丰县| 柳江县| 武定县| 寿光市| 绥滨县| 洞口县| 宽甸| 梁山县| 边坝县| 洱源县| 隆德县| 凤山市| 昌吉市| 苗栗县| 皮山县| 梓潼县| 长白| 屯昌县| 封开县| 阳谷县| 女性| 会理县| 宜兰市| 遂昌县| 新巴尔虎左旗| 长岭县| 仁化县| 边坝县| 枞阳县| 日喀则市| 龙江县| 渝中区| 永寿县| 时尚| 裕民县| 宝坻区| 巴彦淖尔市| 南阳市| 嘉善县|