2015年4月9日 天气冷
这里以“用户授权”为例说明
实现方法一(适合弹出modal的场景):
后台代码如下:
/**
* 用户授权
* */
public String authorization() throws Exception {
//action为0代表请求授权页面,action为1代表需要更新数据到数据库
if (getAction().equals("0")) {
user = userService.get(userId);
//获得用户所有权限
allRoleList = roleService.getAllRole();
//获得用户已有权限
Set<Role> userRoleList = user.getRoles();
//循环所有权限,如果用户已经选中,则标记,前台显示打钩
outer: for (Role userRole : userRoleList) {
inner: for (Role allRole : allRoleList) {
if (userRole.getRoleId().equals(allRole.getRoleId())) {
allRole.setIsCheck();
break inner;
}
}
}
return ROLE;
} else {
userService.authorization(userId, roles);
setPageData();
return SUCCESS;
}
}
这段代码的大体意思是:在用户所有权限中,通过用户已有的权限与用户所有权限比较,将已有的权限在用户所有权限中做了一个标记isCheck(1),所以在界面前端就可以通过如下的代码实现勾选的动作了
前端代码如下:
<!-- 如果用户已经赋予权限,进来的时候权限要勾上 -->
<c:forEach items="${requestScope.allRoleList}" var="role">
<c:choose>
<c:when test="${role.isCheck == 1}">
<input type="checkbox" name="roles" value="${role.roleId}" checked="checked">${role.roleName}
</c:when>
<c:otherwise>
<input type="checkbox" name="roles" value="${role.roleId}">${role.roleName}
</c:otherwise>
</c:choose>
</c:forEach>
需要注意的地方是遇到json中要放一个对象及ArrayList的时候,可以把该对象及ArrayList放到一个Map中,由Map同一输出
当然有的同学会说,我不在后台在标记,直接在前端做可以吗。那当然可以,于是就有了第二种做法
实现方法二(适合于从一个跳转到另一个界面的场景,包括dialog中页面的跳转):
<c:choose>
<c:when test="${not empty customerIdsMap}">
<input type="checkbox" name="ids" value="${proposer.id}"
<c:forEach items="${customerIdsMap}" var="cid">
<c:if test="${cid == proposer.id}">
checked="checked"
</c:if>
</c:forEach>
/>${proposer.trueName}
</c:when>
<c:otherwise>
<input type="checkbox" name="ids" value="${proposer.id}" />${proposer.trueName}
</c:otherwise>
</c:choose>
不过这个实现需要在后台分别返回customerIdsMap及proposer的对象,这两个对象一定要在同一域中,比如Json和request交叉混合就不行。因为request中的对象容易刷新丢失。