Sparta Yew

               簡(jiǎn)約、職業(yè)、恒久
          隨筆 - 15, 文章 - 1, 評(píng)論 - 276, 引用 - 0
          數(shù)據(jù)加載中……

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

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


              開(kāi)發(fā)環(huán)境:eclipse3.4.2 + weblogic10.3 + jdk1.6.0_13 + Struts2.1.8 + Spring3.0.1 + Hiberante3.3.2


              在Struts2的標(biāo)簽開(kāi)發(fā)Jsp頁(yè)面過(guò)程中,我們大多使用迭代方式使用Map,很少使用非迭代的方式使用Map,因此前種方式多見(jiàn)諸于網(wǎng)絡(luò)文章,
          后種方式則鮮見(jiàn)于網(wǎng)絡(luò)。本篇文章重點(diǎn)說(shuō)明一下不使用迭代方式而提取Map中的值的應(yīng)用。關(guān)于迭代方式使用Map的用法請(qǐng)參見(jiàn)網(wǎng)絡(luò)上“Struts2中iterator標(biāo)簽遍歷Map總結(jié)”一文。

              我的應(yīng)用需求如下:

              系統(tǒng)中需要實(shí)現(xiàn)安全控制方面的功能,實(shí)現(xiàn)該功能采用了RBAC的原理。分別使用用戶表、角色表、權(quán)限表和資源表;及各表之間的關(guān)聯(lián)關(guān)系表用戶角色表、角色權(quán)限表、權(quán)限資源表。

              它們之間的關(guān)系分別是:一個(gè)用戶可以有多個(gè)角色;一個(gè)角色擁有多個(gè)權(quán)限;一個(gè)權(quán)限擁有多種資源。

              為了維護(hù)一個(gè)角色和多個(gè)權(quán)限之間的關(guān)系,我使用一個(gè)jsp頁(yè)面來(lái)展示兩者的列表,并且通過(guò)點(diǎn)擊某個(gè)角色,提取與該角色相關(guān)的所有權(quán)限。

              具體實(shí)現(xiàn)如下:

              在一個(gè)Jsp頁(yè)面上,左邊顯示角色列表,右面以checkBox顯示權(quán)限列表。假設(shè)角色A對(duì)應(yīng)著右邊所有10個(gè)權(quán)限中的3個(gè),并且這個(gè)關(guān)聯(lián)關(guān)系已經(jīng)存儲(chǔ)到數(shù)據(jù)庫(kù)中,那么當(dāng)我點(diǎn)擊角色A時(shí),響應(yīng)Action,然后從數(shù)據(jù)庫(kù)中提取該角色A對(duì)應(yīng)的所有權(quán)限,然后在右邊顯示所有的10個(gè)權(quán)限列表的同時(shí),將對(duì)應(yīng)的其中的3個(gè)進(jìn)行選中。

              有必要說(shuō)明一下,在權(quán)限的列表中,我是采用了一個(gè)封裝了所有權(quán)限實(shí)例的List(permissionList)在jsp頁(yè)面并通過(guò)struts2的<s:iterator/>標(biāo)簽來(lái)顯示各權(quán)限的。
              在迭代該List時(shí),采用了<s:checkbox/>這個(gè)標(biāo)簽,目的是允許用戶選擇多個(gè)權(quán)限與某個(gè)角色的關(guān)系,然后進(jìn)行保存。

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

              正因?yàn)槲沂褂昧?lt;s:checkbox/>這個(gè)標(biāo)簽,因此我必須滿足該標(biāo)簽的各個(gè)要素,尤其是value="true"這個(gè)條件,那么在當(dāng)我點(diǎn)擊某個(gè)角色時(shí),刷新后才能在權(quán)限列表里選中該角色對(duì)應(yīng)的所有權(quán)限。

              我該如何實(shí)現(xiàn)呢? 我想到一個(gè)辦法,在jsp頁(yè)面上當(dāng)點(diǎn)擊某個(gè)角色時(shí),在后臺(tái)取得該角色id,然后根據(jù)該角色id從數(shù)據(jù)庫(kù)中提取與該角色id相對(duì)應(yīng)的所有權(quán)限列表,然后我迭代該權(quán)限列表,將相應(yīng)的權(quán)限id和"true"這個(gè)字符串組成一個(gè)Map,即permissionMap.put(permissionId1,"true"),permissionMap.put(permissionId2,"true")...; 然后將該map傳到前臺(tái)進(jìn)行使用。

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

              最終的事實(shí)證明我的思路是正確的,但是在過(guò)程中我卻走了不少?gòu)澛贰?/p>

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

                     <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>

              
              代碼看起來(lái)很象那么回事,但是很遺憾,頁(yè)面上權(quán)限列表始終是不能選中的(當(dāng)然在數(shù)據(jù)庫(kù)確實(shí)存在已知的關(guān)聯(lián)關(guān)系,能證明不是數(shù)據(jù)庫(kù)沒(méi)有存儲(chǔ)該關(guān)聯(lián)關(guān)系的問(wèn)題)。
              那么再試:

                     <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>


              還是不行,我不禁問(wèn):有木有啊? 有木有啊! 有木有啊!

              于是再試:

                     <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>


              仍然不行。……

              還是從網(wǎng)絡(luò)上再找找沒(méi)有相關(guān)的資料吧,遇見(jiàn)問(wèn)題再去向縱深輻射相關(guān)的問(wèn)題似乎是一個(gè)簡(jiǎn)單的真理。當(dāng)然在網(wǎng)絡(luò)上沒(méi)有找到明確的答案,但是找到了一些給人啟發(fā)性的基礎(chǔ)知識(shí)。

              問(wèn)題終于被解決了,說(shuō)來(lái)不復(fù)雜,參看如下代碼:

                     <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>

             
               記錄下來(lái),以供參考,為自己走過(guò)的彎路喝彩。



                      -東營(yíng) sparta-紫杉 原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處 :)
                      http://www.aygfsteel.com/SpartaYew/
                      SpartaYew@163.com
           
                      
          QQ:22086526

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

          評(píng)論

          # re: Struts2中以非迭代方式提取Map中的值  回復(fù)  更多評(píng)論   

          沒(méi)這么復(fù)雜吧,可以用s:checkboxlist來(lái)實(shí)現(xiàn)。

          # re: Struts2中以非迭代方式提取Map中的值  回復(fù)  更多評(píng)論   

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

          嗯嗯,這位盆友,您說(shuō)的沒(méi)錯(cuò),采用checkboxlist那是非常簡(jiǎn)單的,在Jsp頁(yè)面上一條語(yǔ)句就搞定了塞,您對(duì)struts2的標(biāo)簽還是非常的了解呀,贊一個(gè)先。正式發(fā)布的程序那當(dāng)然是采用checkboxlist了,本文主要是探討一下非迭代方式提取Map的值了。

          謝謝關(guān)注,歡迎回復(fù)。 :)
          2011-06-01 09:08 | sparta-紫杉

          # re: Struts2中以非迭代方式提取Map中的值  回復(fù)  更多評(píng)論   

          用checkboxlist我好想不能 對(duì)齊和控制每行顯示幾個(gè)選項(xiàng)??你能實(shí)現(xiàn)嗎?structs2.2.1的版本
          2013-11-27 14:37 | zh
          主站蜘蛛池模板: 台山市| 嘉鱼县| 谢通门县| 吉安市| 衡阳县| 鄢陵县| 海阳市| 科技| 九江市| 道孚县| 加查县| 绥德县| 镶黄旗| 阳曲县| 原平市| 科尔| 南投县| 六盘水市| 夏河县| 广州市| 瑞昌市| 牡丹江市| 和顺县| 博客| 会同县| 阳谷县| 东丰县| 克拉玛依市| 集贤县| 三台县| 大同市| 枣庄市| 清原| 鄂托克前旗| 城固县| 南投县| 长泰县| 郸城县| 马关县| 洛隆县| 甘谷县|