背景
在给角色配置权限时候,会涉及到权限列表的移动.
注意点:
- 如何传递未有的权限到jsp
- 提交表单:如何将权限列表注入角色的属性.
- 提交表单:如何对拥有的权限select列表的全部选择后再提交
- 若使用paramsPrepareParamsStack拦截器,会注入两次权限列表,所以要在prepareSave方法中
role.getPermissions().clear();
传递未有的权限到jsp
- 需要传递该角色未拥有的权限,
- 若是新增角色,就传递数据库全部权限列表
- 若是修改角色,就传递 数据库-角色拥有之后的权限列表
private <T> List<T> getSubList(List<T> allList,List<T> partList){
//新增角色情况
if(partList==null) {return allList;}
//修改角色情况
ArrayList<T> subList = new ArrayList<>();
for (T t : allList) {
//对全部List遍历,若部分List中不好含该成员,就存入subList
if(!partList.contains(t)) {
subList.add(t);
}
}
return subList;
}
//在上面方法体中已经判断了两种情况,所以这儿直接放入context容器
@RequiredPermission("编辑角色")
public String input() throws Exception {
//修改角色,传递该角色
if(role.getId()!=null) {
role = roleService.get(role.getId());
}
super.putContext("role", role);
//传递未拥有的权限列表
List<Permission> noPermissions = getSubList(permissionService.list(), role.getPermissions());
super.putContext("noPermissions", noPermissions);
return INPUT;
}
//此处有个细节:不管新增或修改,都会传递一个role对象到jsp;
//原因,在拥有的权限列表中,可以用list="#role.permissions"
//若只有修改时候才传递role对象,则添加时候会因为list="#role.permissions"的role为空而报错
提交表单:注入权限List到角色对象
在struts中,通过标签的name
值,来自动注入属性.当属性为List时候,对应的标签名字应该为name="对象.属性.id"
,表示给权限List中的每个权限注入id值
<s:select id="myList" name="role.permissions.id" list="#role.permissions" multiple="true" listKey="id" listValue="name"/>
//action接收的role.permissions集合为
[
Permission [name=null, expression=null, getId()=1],
Permission [name=null, expression=null, getId()=2]
]
提交表单:将拥有权限的select,提交前全部选择
原因:提交select时候,只有被选择的option,才会传递给Action,
而拥有权限的select,是需要全部传递的.
解决方法:在<form>
标签,设置onclick="clickForm()"
属性,并添加js代码,实现提交前的全选.
//js代码
var clickForm=function(){
$("#myList option").prop("selected","selected");
}