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.blogjava.net/SpartaYew/
            SpartaYew@163.com
 
            
QQ:22086526

posted on 2011-05-19 14:23 sparta-紫杉 阅读(4121) 评论(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

只有注册用户登录后才能发表评论。


网站导航: