测试RoleDao
RoleDaoroleDao=newRoleDao();
@Test
publicvoidadd(){
Rolerole=newRole();
role.setId("1");
role.setName("manager");
role.setDescription("this is a manager");
roleDao.add(role);
}
@Test
publicvoidfind(){
Stringid="1";
Rolerole=roleDao.find(id);
System.out.println(role.getName());
}
@Test
publicvoidgetAdd(){
List<Role>roleList=roleDao.getAll();
for(Rolerole:roleList){
System.out.println(role.getName());
}
}
补充
上面的仅仅是单表的Dao功能,User和Role表是多对多的关系,Role和Privilege表也是多对多的关系。
前面已经分析了
- 在User对象中,需要一个Set集合来记住Role的关系。【显示用户的时候,应该把所有角色显示出来】
- 在Role对象中,需要一个Set集合来记住Privilege的关系【显示角色的时候,应该把所有权限显示很出来】。
所以应该在UserDao有获取某用户所有的角色的方法:
/*得到用戶的所有角色*/
publicList<Role>getRoles(Stringuser_id){
try{
QueryRunnerqueryRunner=newQueryRunner(JdbcUtils.getDataSource());
//根據用戶id查詢所有角色,重點就在角色上,所以要有role表。然后查詢user_role表,就可以鎖定用戶id對應的角色了!
Stringsql="SELECT r.* FROM role r, user_role ur WHERE ur.user_id = ? AND r.id = ur.role_id ";
List<Role>roles=(List<Role>)queryRunner.query(sql,newBeanListHandler(Role.class),newObject[]{user_id});
returnroles;
}catch(Exceptione){
e.printStackTrace();
thrownewRuntimeException("得到用戶所有的角色失败了!");
}
}
在RoleDao有获取所有权限的方法:
//得到某角色的所有權限【權限表、權限和角色關系表】
publicList<Privilege>getPrivileges(Stringrole_id){
try{
QueryRunnerrunner=newQueryRunner(JdbcUtils.getDataSource());
Stringsql="SELECT p.* FROM privilege p, role_privilege rp WHERE rp.role_id = ? AND p.id = rp.role_id";
List<Privilege>privileges=(List<Privilege>)runner.query(sql,newBeanListHandler(Privilege.class),newObject[]{role_id});
returnprivileges;
}catch(Exceptione){
thrownewRuntimeException(e);
}
}
我们既然能获取得到用户所有的角色了,获取得到角色所有的权限了。那自然我们就应该有修改用户的角色功能,修改角色的权限的功能啦!
我们先来分析一下它怎么写:要修改用户所拥有的角色,应该知道修改用户是哪一个,所以需要用户的id或者User对象!修改的角色是什么,需要Role对象或者装载Role对象的集合!
在UserDao有修改某用户角色的方法,我们是想把所有的角色都删除了,再添加新的角色
//更新用戶的角色
publicvoidupdateRole(Useruser,List<Role>roles){
try{
QueryRunnerqueryRunner=newQueryRunner(JdbcUtils.getDataSource());
//先把用戶原來的所有角色刪掉了
Stringdelete="DELETE FROM user_role WHERE user_id = ?";
queryRunner.update(delete,user.getId());
Stringadd="INSERT INTO user_role (user_id,role_id) VALUES(?,?)";
for(Rolerole:roles){
queryRunner.update(add,newObject[]{user.getId(),role.getId()});
}
}catch(Exceptione){
e.printStackTrace();
thrownewRuntimeException("添加权限失败了!");
}
}
在RoleDao有修改角色权限的方法,和上面是类似的。
//为某个角色授权
publicvoidaddPrivilege2Role(Rolerole,List<Privilege>privileges){
try{
QueryRunnerrunner=newQueryRunner(JdbcUtils.getDataSource());
//先刪除該角色的所有權限
Stringdelete="DELETE FROM role_privilege WHERE role_id = ?";
runner.update(delete,newObject[]{role.getId()});
//賦予角色新的權限
Stringsql="INSERT INTO role_privilege (role_id, privilege_id) VALUES (?, ?)";
for(Privilegeprivilege:privileges){
runner.update(sql,newObject[]{role.getId(),privilege.getId()});
}
}catch(Exceptione){
thrownewRuntimeException(e);
}
}
更新
刚才又思考了一下:
- 其实我们并不需要在User类用使用集合来维护Role,在Role中使用集合来维护Privilege。在原本的做法我们已经看到了,我们完全是不需要这两个变量也能完成效果的。
- 那么,现在问题就来了。什么时候我们才需要在实体中使用变量来维护多的一方的关系呢???我觉得是这样的:当我们在查询一方数据的时候,另一方的数据也同时需要展示。那么此时我们就应该使用集合来维护多的一方数据了。
- 基于上面一个例子,就比如:订单与订单项。当我们查看订单的时候,同时一定会把所有的订单项都列举出来。
- 再比如:当我们查看购物车的时候,就需要把所有的购物项都列举出来。
- 而我们使用展示用户的时候,并不需要第一时间就把角色列举出来,而是通过超链接来查看用户下的角色,基于这种情况,我觉得我们是不用使用集合变量来维护多的一方的数据的。
这就跟Hibernate的懒加载差不多。用到关联关系的数据的时候才加载,没有用到的时候就先不查询数据库。
ps:我不知道在这我理解得对不对,如果有错的地方希望能指出!
开发BusinessService
UserService
publicclassUserService{
UserDaouserDao=newUserDao();
//添加用户
publicvoidaddUser(Useruser){
userDao.addUser(user);
}
//根据id查找用户
publicUserfindUser(Stringid){
returnuserDao.find(id);
}
//得到所有的用户
publicList<User>getAllUser(){
returnuserDao.getAll();
}
//获取用户所有的角色
publicList<Role>getUserRole(Stringuser_id){
returnuserDao.getRoles(user_id);
}
//修改用户的角色
publicvoidupdateUserRole(Useruser,List<Role>roles){
userDao.updateRole(user,roles);
}
}
RoleService
publicclassRoleService{
RoleDaoroleDao=newRoleDao();
//添加角色
publicvoidaddRole(Rolerole){
roleDao.add(role);
}
//根据id查找角色
publicRolefindRole(Stringid){
returnroleDao.find(id);
}
//获取所有的角色
publicList<Role>getAllRole(){
returnroleDao.getAll();
}
//获取角色所有的权限
publicList<Privilege>getRolePrivilege(Stringrole_id){
returnroleDao.getPrivileges(role_id);
}
//修改角色的权限
publicvoidupdateRolePrivilege(Rolerole,List<Privilege>privileges){
roleDao.addPrivilege2Role(role,privileges);
}
}
PrivilegeService
publicclassPrivilegeService{
PrivilegeDaoprivilegeDao=newPrivilegeDao();
//添加权限
publicvoidaddPrivilege(Privilegeprivilege){
privilegeDao.addPrivilege(privilege);
}
//根据id获得权限
publicPrivilegefindPrivilege(Stringid){
returnprivilegeDao.findPrivilege(id);
}
//获取所有的权限
publicList<Privilege>getAllPrivileges(){
returnprivilegeDao.getAllPrivileges();
}
}
开发Web
用户模块
添加用户
- 提供页面界面的Servlet
//直接跳转到显示添加用户的界面
request.getRequestDispatcher("/WEB-INF/jsp/addUser.jsp").forward(request,response);
- 显示页面的JSP
<formaction="AddUserController"method="post">
<table>
<tr>
<td>用户名:</td>
<td><inputtype="text"name="username"></td>
</tr>
<tr>
<td>密码:</td>
<td><inputtype="password"name="password"></td>
</tr>
<tr>
<td><inputtype="submit"value="添加用户"></td>
<td><inputtype="reset"value="重置"></td>
</tr>
</table>
</form>
- 处理表单数据的Servlet
//得到客户端传递进来的参数
Stringusername=request.getParameter("username");
Stringpassword=request.getParameter("password");
Useruser=newUser();
user.setId(WebUtils.makeId());
user.setUsername(username);
user.setPassword(password);
try{
UserServiceuserService=newUserService();
userService.addUser(user);
request.setAttribute("message","添加用户成功!");
}catch(Exceptione){
request.setAttribute("message","添加用户失败!");
thrownewRuntimeException("在Controller添加客户失败");
}
request.getRequestDispatcher("/message.jsp").forward(request,response);
}
显示用户
- 提供页面界面的Servlet
UserServiceuserService=newUserService();
List<User>list=userService.getAllUser();
request.setAttribute("list",list);
//跳转到显示页面
request.getRequestDispatcher("/WEB-INF/jsp/LookUser.jsp").forward(request,response);
- 显示页面JSP
<c:iftest="${empty(list)}">
对不起,暂时没有任何客户
</c:if>
<c:iftest="${!empty(list)}">
<tableborder="1px">
<tr>
<td>用户名</td>
<td>密码</td>
</tr>
<c:forEachitems="${list}"var="user">
<tr>
<td>${user.username}</td>
<td>${user.password}</td>
</tr>
</c:forEach>
</table>
</c:if>
- 效果: