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服务。
最终的事实证明我的思路是正确的,但是在过程中我却走了不少弯路。
我的第一个版本如下所示(注意红色粗体的部分):
代码看起来很象那么回事,但是很遗憾,页面上权限列表始终是不能选中的(当然在数据库确实存在已知的关联关系,能证明不是数据库没有存储该关联关系的问题)。 那么再试:
还是不行,我不禁问:有木有啊? 有木有啊! 有木有啊!
于是再试:
仍然不行。……
还是从网络上再找找没有相关的资料吧,遇见问题再去向纵深辐射相关的问题似乎是一个简单的真理。当然在网络上没有找到明确的答案,但是找到了一些给人启发性的基础知识。
问题终于被解决了,说来不复杂,参看如下代码:
记录下来,以供参考,为自己走过的弯路喝彩。
posted on 2011-05-19 14:23 sparta-紫杉 阅读(4121) 评论(3) 编辑 收藏 所属分类: SSH2
Powered by: BlogJava Copyright © sparta-紫杉