<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

      Sparta Yew

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

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

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


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


        在Struts2的標(biāo)簽開發(fā)Jsp頁面過程中,我們大多使用迭代方式使用Map,很少使用非迭代的方式使用Map,因此前種方式多見諸于網(wǎng)絡(luò)文章,
    后種方式則鮮見于網(wǎng)絡(luò)。本篇文章重點(diǎn)說明一下不使用迭代方式而提取Map中的值的應(yīng)用。關(guān)于迭代方式使用Map的用法請參見網(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)系分別是:一個用戶可以有多個角色;一個角色擁有多個權(quán)限;一個權(quán)限擁有多種資源。

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

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

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

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

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

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

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

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

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

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

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

        
        代碼看起來很象那么回事,但是很遺憾,頁面上權(quán)限列表始終是不能選中的(當(dāng)然在數(shù)據(jù)庫確實(shí)存在已知的關(guān)聯(lián)關(guān)系,能證明不是數(shù)據(jù)庫沒有存儲該關(guān)聯(lián)關(guā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>


        還是不行,我不禁問:有木有??? 有木有?。?有木有?。?/p>

        于是再試:

               <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ò)上再找找沒有相關(guān)的資料吧,遇見問題再去向縱深輻射相關(guān)的問題似乎是一個簡單的真理。當(dāng)然在網(wǎng)絡(luò)上沒有找到明確的答案,但是找到了一些給人啟發(fā)性的基礎(chǔ)知識。

        問題終于被解決了,說來不復(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>

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



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

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

    評論

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

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

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

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

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

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

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

    用checkboxlist我好想不能 對齊和控制每行顯示幾個選項??你能實(shí)現(xiàn)嗎?structs2.2.1的版本
    2013-11-27 14:37 | zh
    主站蜘蛛池模板: 免费黄色小视频网站| 亚洲午夜成人精品电影在线观看| 亚洲大成色www永久网址| 免费在线观看毛片| 麻豆精品成人免费国产片| 亚洲 日韩 色 图网站| 亚洲综合色自拍一区| 黄在线观看www免费看| 午夜亚洲乱码伦小说区69堂| 永久亚洲成a人片777777| 西西大胆无码视频免费| 国产精品美女久久久免费 | 久久被窝电影亚洲爽爽爽| 久久午夜免费视频| 国产免费久久久久久无码| 麻豆狠色伊人亚洲综合网站 | 7777久久亚洲中文字幕| 国产亚洲情侣一区二区无码AV| av大片在线无码免费| 中文在线观看免费网站| 亚洲欧美成人av在线观看| 亚洲国产精品第一区二区| 亚洲JIZZJIZZ中国少妇中文| 67194熟妇在线永久免费观看| xxxxxx日本处大片免费看| 亚洲精品又粗又大又爽A片| 亚洲视屏在线观看| 国产精品亚洲视频| 四虎永久成人免费影院域名| 蜜桃AV无码免费看永久| 99久久国产精品免费一区二区 | 亚洲人成网77777亚洲色| 在线观看亚洲免费视频| 亚洲黄色免费网址| 黄页免费在线观看| 一区二区三区免费在线观看| 亚洲爆乳成av人在线视菜奈实| 亚洲精品国产情侣av在线| 亚洲AV综合色区无码另类小说 | 亚洲第一AV网站| 久久久久无码专区亚洲av|