Sparta Yew

               簡約、職業、恒久
          隨筆 - 15, 文章 - 1, 評論 - 276, 引用 - 0
          數據加載中……

          Struts2中以非迭代方式提取Map中的值

            
              sparta-紫杉   2010-4-20 11:31


              開發環境:eclipse3.4.2 + weblogic10.3 + jdk1.6.0_13 + Struts2.1.8 + Spring3.0.1 + Hiberante3.3.2


              在Struts2的標簽開發Jsp頁面過程中,我們大多使用迭代方式使用Map,很少使用非迭代的方式使用Map,因此前種方式多見諸于網絡文章,
          后種方式則鮮見于網絡。本篇文章重點說明一下不使用迭代方式而提取Map中的值的應用。關于迭代方式使用Map的用法請參見網絡上“Struts2中iterator標簽遍歷Map總結”一文。

              我的應用需求如下:

              系統中需要實現安全控制方面的功能,實現該功能采用了RBAC的原理。分別使用用戶表、角色表、權限表和資源表;及各表之間的關聯關系表用戶角色表、角色權限表、權限資源表。

              它們之間的關系分別是:一個用戶可以有多個角色;一個角色擁有多個權限;一個權限擁有多種資源。

              為了維護一個角色和多個權限之間的關系,我使用一個jsp頁面來展示兩者的列表,并且通過點擊某個角色,提取與該角色相關的所有權限。

              具體實現如下:

              在一個Jsp頁面上,左邊顯示角色列表,右面以checkBox顯示權限列表。假設角色A對應著右邊所有10個權限中的3個,并且這個關聯關系已經存儲到數據庫中,那么當我點擊角色A時,響應Action,然后從數據庫中提取該角色A對應的所有權限,然后在右邊顯示所有的10個權限列表的同時,將對應的其中的3個進行選中。

              有必要說明一下,在權限的列表中,我是采用了一個封裝了所有權限實例的List(permissionList)在jsp頁面并通過struts2的<s:iterator/>標簽來顯示各權限的。
              在迭代該List時,采用了<s:checkbox/>這個標簽,目的是允許用戶選擇多個權限與某個角色的關系,然后進行保存。

              用過<s:checkbox/>這個標簽的盆友,一定會知道該標簽具有三個常用的屬性,name、value、fieldValue、label。 name當然就是該checkbox的名字,fieldValue是存儲用戶選中時提交給頁面的各個值。value呢? 不要誤會,它代表是否被選中,也就是value="true"時,那么對應到html代碼中就是checked="checked"。那么label當然是顯示的該checkbox的描述文字。

              正因為我使用了<s:checkbox/>這個標簽,因此我必須滿足該標簽的各個要素,尤其是value="true"這個條件,那么在當我點擊某個角色時,刷新后才能在權限列表里選中該角色對應的所有權限。

              我該如何實現呢? 我想到一個辦法,在jsp頁面上當點擊某個角色時,在后臺取得該角色id,然后根據該角色id從數據庫中提取與該角色id相對應的所有權限列表,然后我迭代該權限列表,將相應的權限id和"true"這個字符串組成一個Map,即permissionMap.put(permissionId1,"true"),permissionMap.put(permissionId2,"true")...; 然后將該map傳到前臺進行使用。

              還記得前面提到的封裝了所有權限實例的那個List(permissionList)嗎? 嗯,就是在迭代該List存儲的各個實例顯示權限id(permissionId1),權限名稱等時,通過那個權限permissionMap的permissionId這個key提取出"true"這個字符串,為<s:checkbox/>的value服務。

              最終的事實證明我的思路是正確的,但是在過程中我卻走了不少彎路。

              我的第一個版本如下所示(注意紅色粗體的部分):

                     <s:iterator value="permissionList" id="permission" status="s">

                      
          <tr>
                        
          <td class="<s:if test='#s.Odd'>huang</s:if><s:else>touming</s:else>" nowrap="nowrap" align="center"><s:property value="#s.index+1"/></td>
                        
          <td class="<s:if test='#s.Odd'>huang</s:if><s:else>touming</s:else>" nowrap="nowrap">
                          
          <s:checkbox name="permisskey" value="#permissionMap[%{authorityId}]" fieldValue="%{authorityId}"/>
                        
          </td>
                        
          <td class="<s:if test='#s.Odd'>huang</s:if><s:else>touming</s:else>" nowrap="nowrap"><s:property value="authorityDesc"/></td>
                      
          </tr>
                     
          </s:iterator>

              
              代碼看起來很象那么回事,但是很遺憾,頁面上權限列表始終是不能選中的(當然在數據庫確實存在已知的關聯關系,能證明不是數據庫沒有存儲該關聯關系的問題)。
              那么再試:

                     <s:iterator value="permissionList" id="permission" status="s">

                      
          <tr>
                        
          <td class="<s:if test='#s.Odd'>huang</s:if><s:else>touming</s:else>" nowrap="nowrap" align="center"><s:property value="#s.index+1"/></td>
                        
          <td class="<s:if test='#s.Odd'>huang</s:if><s:else>touming</s:else>" nowrap="nowrap">
                          
          <s:checkbox name="permisskey" value="permissionMap[%{authorityId}]" fieldValue="%{authorityId}"/>
                        
          </td>
                        
          <td class="<s:if test='#s.Odd'>huang</s:if><s:else>touming</s:else>" nowrap="nowrap"><s:property value="authorityDesc"/></td>
                      
          </tr>
                     
          </s:iterator>


              還是不行,我不禁問:有木有啊? 有木有啊! 有木有啊!

              于是再試:

                     <s:iterator value="permissionList" id="permission" status="s">

                      
          <tr>
                        
          <td class="<s:if test='#s.Odd'>huang</s:if><s:else>touming</s:else>" nowrap="nowrap" align="center"><s:property value="#s.index+1"/></td>
                        
          <td class="<s:if test='#s.Odd'>huang</s:if><s:else>touming</s:else>" nowrap="nowrap">
                          
          <s:checkbox name="permisskey" value="#permissionMap[authorityId]" fieldValue="%{authorityId}"/>
                        
          </td>
                        
          <td class="<s:if test='#s.Odd'>huang</s:if><s:else>touming</s:else>" nowrap="nowrap"><s:property value="authorityDesc"/></td>
                      
          </tr>
                     
          </s:iterator>


              仍然不行。……

              還是從網絡上再找找沒有相關的資料吧,遇見問題再去向縱深輻射相關的問題似乎是一個簡單的真理。當然在網絡上沒有找到明確的答案,但是找到了一些給人啟發性的基礎知識。

              問題終于被解決了,說來不復雜,參看如下代碼:

                     <s:iterator value="permissionList" id="permission" status="s">

                      
          <tr>
                        
          <td class="<s:if test='#s.Odd'>huang</s:if><s:else>touming</s:else>" nowrap="nowrap" align="center"><s:property value="#s.index+1"/></td>
                        
          <td class="<s:if test='#s.Odd'>huang</s:if><s:else>touming</s:else>" nowrap="nowrap">
                          
          <s:checkbox name="permisskey" value="permissionMap[authorityId]" fieldValue="%{authorityId}"/>
                        
          </td>
                        
          <td class="<s:if test='#s.Odd'>huang</s:if><s:else>touming</s:else>" nowrap="nowrap"><s:property value="authorityDesc"/></td>
                      
          </tr>
                     
          </s:iterator>

             
               記錄下來,以供參考,為自己走過的彎路喝彩。



                      -東營 sparta-紫杉 原創,轉載請注明出處 :)
                      http://www.aygfsteel.com/SpartaYew/
                      SpartaYew@163.com
           
                      
          QQ:22086526

          posted on 2011-05-19 14:23 sparta-紫杉 閱讀(4151) 評論(3)  編輯  收藏 所屬分類: SSH2

          評論

          # re: Struts2中以非迭代方式提取Map中的值  回復  更多評論   

          沒這么復雜吧,可以用s:checkboxlist來實現。

          # re: Struts2中以非迭代方式提取Map中的值  回復  更多評論   

          @車塵馬足顯者事,酒盞花枝隱士緣

          嗯嗯,這位盆友,您說的沒錯,采用checkboxlist那是非常簡單的,在Jsp頁面上一條語句就搞定了塞,您對struts2的標簽還是非常的了解呀,贊一個先。正式發布的程序那當然是采用checkboxlist了,本文主要是探討一下非迭代方式提取Map的值了。

          謝謝關注,歡迎回復。 :)
          2011-06-01 09:08 | sparta-紫杉

          # re: Struts2中以非迭代方式提取Map中的值  回復  更多評論   

          用checkboxlist我好想不能 對齊和控制每行顯示幾個選項??你能實現嗎?structs2.2.1的版本
          2013-11-27 14:37 | zh
          主站蜘蛛池模板: 颍上县| 龙川县| 会理县| 乌苏市| 丰原市| 靖安县| 大姚县| 永定县| 云龙县| 措美县| 盐池县| 阿鲁科尔沁旗| 安阳县| 富源县| 类乌齐县| 万年县| 彭州市| 吉木乃县| 泾阳县| 衡山县| 金乡县| 胶州市| 正镶白旗| 扎鲁特旗| 汉沽区| 晴隆县| 百色市| 周口市| 北辰区| 浏阳市| 和林格尔县| 桑日县| 青浦区| 类乌齐县| 黄浦区| 宣化县| 方正县| 阳山县| 和硕县| 和顺县| 安塞县|