背景
在給角色配置權限時候,會涉及到權限列表的移動.
注意點:
- 如何傳遞未有的權限到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");
}