纳税服务系统【角色与用户】
用戶與角色之間的關(guān)系
我們?cè)谧鲇脩裟K的時(shí)候,漏掉了最后一個(gè)功能。在新增功能中是可以選擇角色的。
用戶與角色之間的關(guān)系也是多對(duì)多
- 一個(gè)用戶對(duì)應(yīng)多個(gè)角色
- 一個(gè)角色可以被多個(gè)用戶使用。
現(xiàn)在呢,我們的用戶表已經(jīng)是寫(xiě)的了。我們最好就不要修改原有的用戶表數(shù)據(jù)。那我們?cè)?strong>不修改用戶表代碼的情況下,又怎么來(lái)實(shí)現(xiàn)多對(duì)多呢??
跟角色與權(quán)限是一樣的。使用中間表來(lái)維護(hù)它們的關(guān)系就行了。
用戶:user用戶id,名稱(chēng)...1 用戶12 用戶2用戶角色:user_role用戶id,角色id1 11 22 2角色:role角色I(xiàn)d,名稱(chēng)1 管理員2 一般用戶設(shè)計(jì)中間表
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;//在使用的時(shí)候,Role相關(guān)的數(shù)據(jù)會(huì)用得特別多。為了方便使用了Role對(duì)象。而user就不需要使用User對(duì)象了。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>增加模塊
在跳轉(zhuǎn)到JSP頁(yè)面的前,把所有的角色找出來(lái)。放到request域?qū)ο笾?#xff0c;讓JSP頁(yè)面顯示出來(lái)。
public String addUI() {//把所有的角色查詢出來(lái),帶過(guò)去給JSP頁(yè)面顯示ActionContext.getContext().getContextMap().put("roleList", roleServiceImpl.findObjects());return "addUI";} <%--list是集合對(duì)象name是要帶給服務(wù)器端的字符串?dāng)?shù)組。listkey 是集合元素對(duì)象的idlistValue 是集合元素對(duì)象的名字--%><s:checkboxlist list="#roleList" name="userRoleIds" listKey="roleId" listValue="name"/>編輯模塊
編輯回顯數(shù)據(jù)
在編輯模塊中,需要將該用戶所擁有的角色查詢出來(lái)。然后把查詢出來(lái)的id值放到數(shù)組中。
public String editUI() {//把所有的角色查詢出來(lái),帶過(guò)去給JSP頁(yè)面顯示ActionContext.getContext().getContextMap().put("roleList", roleServiceImpl.findObjects());//外邊已經(jīng)傳了id過(guò)來(lái)了,我們要找到id對(duì)應(yīng)的Userif (user != null &&user.getId() != null ) {//直接獲取出來(lái),后面JSP會(huì)根據(jù)User有g(shù)etter就能讀取對(duì)應(yīng)的信息!user = userServiceImpl.findObjectById(user.getId());//通過(guò)用戶的id得到所擁有UserRoleList<UserRole> roles = userServiceImpl.findRoleById(user.getId());//把用戶擁有角色的id填充到數(shù)組中,數(shù)組最后回顯到JSP頁(yè)面int i=0;userRoleIds = new String[roles.size()];for (UserRole role : roles) {userRoleIds[i++] = role.getUserRoleId().getRole().getRoleId();}}return "editUI";}JSP通過(guò)checkboxlist進(jìn)行回顯,指定了name值就能夠自動(dòng)判定我們的用戶擁有的角色是什么了。
<s:checkboxlist list="#roleList" name="userRoleIds" listKey="roleId" listValue="name"></s:checkboxlist>處理編輯操作
在更新之前,首先刪除用戶與角色之間的關(guān)系【歷史遺留問(wèn)題】,如果不刪除,那么用戶所擁有的角色就一直保留著。無(wú)論你在JSP頁(yè)面有沒(méi)有勾選。
public String edit() throws IOException {//Struts2會(huì)自動(dòng)把JSP帶過(guò)來(lái)的數(shù)據(jù)封裝到User對(duì)象上if (user.getId() != null && user != null) {if (headImg != null) {//得到要把頭像上傳到服務(wù)器的路徑javax.servlet.ServletContext servletContext = ServletActionContext.getServletContext();String realPath = servletContext.getRealPath("upload/user");//由于用戶上傳的名字可能會(huì)相同,如果相同就被覆蓋掉,因此我們要修改上傳文件的名字【獨(dú)一無(wú)二】headImgFileName = UUID.randomUUID().toString() + headImgFileName.substring(headImgFileName.lastIndexOf("."));FileUtils.copyFile(headImg, new File(realPath, headImgFileName));//設(shè)置圖片與用戶的關(guān)系user.setHeadImg(headImgFileName);}if (userRoleIds != null) {//刪除用戶與角色之間的關(guān)系【歷史遺留問(wèn)題】userServiceImpl.deleteUserRoleById(userRoleIds);//保存用戶與角色。userServiceImpl.saveUserAndRole(user,userRoleIds);}}return "list";}調(diào)用保存用戶與角色的關(guān)系。如果id不是為空的,那么就執(zhí)行更新,如果id為空,就執(zhí)行保存。
@Overridepublic void saveUserAndRole(User user, String... userRoleIds) {//保存或更新用戶if (user.getId() != null) {userDaoImpl.update(user);} else {userDaoImpl.save(user);}//判斷有沒(méi)有把id帶過(guò)來(lái)if (userRoleIds != null) {for (String userRoleId : userRoleIds) {System.out.println(userRoleId);userDaoImpl.saveUserRole(new UserRole(new UserRoleId(user.getId(), new Role(userRoleId))));}}}轉(zhuǎn)載于:https://www.cnblogs.com/zhong-fucheng/p/7202917.html
總結(jié)
以上是生活随笔為你收集整理的纳税服务系统【角色与用户】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: VBS 自动发送邮件
- 下一篇: 黑苹果驱动kext