用户与角色之间的关系
我们在做用户模块的时候,漏掉了最后一个功能。在新增功能中是可以选择角色的。
用户与角色之间的关系也是多对多
- 一个用户对应多个角色
- 一个角色可以被多个用户使用。
现在呢,我们的用户表已经是写的了。我们最好就不要修改原有的用户表数据。那我们在不修改用户表代码的情况下,又怎么来实现多对多呢??
跟角色与权限是一样的。使用中间表来维护它们的关系就行了。
用户:user用户id,名称...1 用户12 用户2用户角色:user_role用户id,角色id1 11 22 2角色:role角色Id,名称1 管理员2 一般用户
设计中间表
public class UserRole implements Serializable {private UserRoleId userRoleId;public UserRoleId getUserRoleId() {return userRoleId;}public void setUserRoleId(UserRoleId userRoleId) {this.userRoleId = userRoleId;}
}
主键表
public class UserRoleId implements Serializable {private String user_id;//在使用的时候,Role相关的数据会用得特别多。为了方便使用了Role对象。而user就不需要使用User对象了。private Role role;@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;UserRoleId that = (UserRoleId) o;if (user_id != null ? !user_id.equals(that.user_id) : that.user_id != null) return false;return role != null ? role.equals(that.role) : that.role == null;}@Overridepublic int hashCode() {int result = user_id != null ? user_id.hashCode() : 0;result = 31 * result + (role != null ? role.hashCode() : 0);return result;}public String getUser_id() {return user_id;}public void setUser_id(String user_id) {this.user_id = user_id;}public Role getRole() {return role;}public void setRole(Role role) {this.role = role;}
}
映射文件
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="zhongfucheng.user.entity.UserRole" table="user_role"><composite-id name="userRoleId" class="zhongfucheng.user.entity.UserRoleId"><!--manytoone可以生成外键字段。--><key-many-to-one name="role" class="zhongfucheng.role.entity.Role" column="role_id" lazy="false"/><key-property name="user_id" column="user_id" type="java.lang.String"/></composite-id></class></hibernate-mapping>
增加模块
在跳转到JSP页面的前,把所有的角色找出来。放到request域对象中,让JSP页面显示出来。
public String addUI() {//把所有的角色查询出来,带过去给JSP页面显示ActionContext.getContext().getContextMap().put("roleList", roleServiceImpl.findObjects());return "addUI";}
<%--list是集合对象name是要带给服务器端的字符串数组。listkey 是集合元素对象的idlistValue 是集合元素对象的名字--%><s:checkboxlist list="#roleList" name="userRoleIds" listKey="roleId" listValue="name"/>
编辑模块
编辑回显数据
在编辑模块中,需要将该用户所拥有的角色查询出来。然后把查询出来的id值放到数组中。
public String editUI() {//把所有的角色查询出来,带过去给JSP页面显示ActionContext.getContext().getContextMap().put("roleList", roleServiceImpl.findObjects());//外边已经传了id过来了,我们要找到id对应的Userif (user != null &&user.getId() != null ) {//直接获取出来,后面JSP会根据User有getter就能读取对应的信息!user = userServiceImpl.findObjectById(user.getId());//通过用户的id得到所拥有UserRoleList<UserRole> roles = userServiceImpl.findRoleById(user.getId());//把用户拥有角色的id填充到数组中,数组最后回显到JSP页面int i=0;userRoleIds = new String[roles.size()];for (UserRole role : roles) {userRoleIds[i++] = role.getUserRoleId().getRole().getRoleId();}}return "editUI";}
JSP通过checkboxlist进行回显,指定了name值就能够自动判定我们的用户拥有的角色是什么了。
<s:checkboxlist list="#roleList" name="userRoleIds" listKey="roleId" listValue="name"></s:checkboxlist>
处理编辑操作
在更新之前,首先删除用户与角色之间的关系【历史遗留问题】,如果不删除,那么用户所拥有的角色就一直保留着。无论你在JSP页面有没有勾选。
public String edit() throws IOException {//Struts2会自动把JSP带过来的数据封装到User对象上if (user.getId() != null && user != null) {if (headImg != null) {//得到要把头像上传到服务器的路径javax.servlet.ServletContext servletContext = ServletActionContext.getServletContext();String realPath = servletContext.getRealPath("upload/user");//由于用户上传的名字可能会相同,如果相同就被覆盖掉,因此我们要修改上传文件的名字【独一无二】headImgFileName = UUID.randomUUID().toString() + headImgFileName.substring(headImgFileName.lastIndexOf("."));FileUtils.copyFile(headImg, new File(realPath, headImgFileName));//设置图片与用户的关系user.setHeadImg(headImgFileName);}if (userRoleIds != null) {//删除用户与角色之间的关系【历史遗留问题】userServiceImpl.deleteUserRoleById(userRoleIds);//保存用户与角色。userServiceImpl.saveUserAndRole(user,userRoleIds);}}return "list";}
调用保存用户与角色的关系。如果id不是为空的,那么就执行更新,如果id为空,就执行保存。
@Overridepublic void saveUserAndRole(User user, String... userRoleIds) {//保存或更新用户if (user.getId() != null) {userDaoImpl.update(user);} else {userDaoImpl.save(user);}//判断有没有把id带过来if (userRoleIds != null) {for (String userRoleId : userRoleIds) {System.out.println(userRoleId);userDaoImpl.saveUserRole(new UserRole(new UserRoleId(user.getId(), new Role(userRoleId))));}}}