SSH 结构中 不同角色登录,显示不同的菜单
Posted 世间草木
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSH 结构中 不同角色登录,显示不同的菜单相关的知识,希望对你有一定的参考价值。
关于这个功能,这里也就是提供一个思路,在做项目的时候因为要用到,肯定存在更好的方法,此思路仅供参考。
一、关于前台页面的接收方式
这里使用struts2的标签: <s:iterator value="值栈中的值"> 来从struts2的值栈中拿到需要的值。
1 <s:iterator value="#menusList"> 2 <li> 3 <a href="#" class="dropdown-toggle"> 4 <i class="${icon}"></i> 5 <span class="menu-text">${name}</span> 6 <b class="arrow icon-angle-down"></b> 7 </a> 8 <ul class="submenu"> 9 10 <s:iterator value="children"> 11 <li> 12 <a href="${url}" target="main"> 13 <i class="${icon}"></i>${name} 14 </a> 15 </li> 16 </s:iterator> 17 18 </ul> 19 </li> 20 </s:iterator>
二、在Action的默认方法中使用函数来查询当前用户所拥有的菜单列表.
1 @Override 2 public String execute() throws Exception { 3 Employee employee = (Employee) ActionContext.getContext().getSession().get(USER_IN_SESSION); 4 List<Menu> list = menuService.findByLoginUserId(employee.getId()); 5 // 这里通过putContext()放进去 6 // 前台取值时<s:标签内的value中取 7 putContext("menusList", list); 8 return SUCCESS; 9 }
三、在Service的借口中和实现类 ServiceImpl 中添加此查询方法:
1 public interface IMenuService extends IBaseService<Menu> { 2 3 List<Menu> findByLoginUserId(Long loginUserId); 4 5 }实现类 MenuServiceImpl.java
1 public class MenuServiceImpl extends BaseServiceImpl<Menu> implements IMenuService { 2 3 @Override 4 public List<Menu> findByLoginUserId(Long loginUserId) { 5 //String hql = "select distinct m from Employee e join e.roles r join r.menus m where e.id = ?"; 6 String hql = "select distinct m from Employee e join e.roles r join r.menus m where e.id=?"; 7 8 // 先拿该用户所有菜单:allList中有该用户所有菜单(包括一级菜单和二级菜单) 9 List<Menu> allList = baseDao.findByHql(hql, loginUserId); 10 11 // 定义一个列表来装一级菜单 12 List<Menu> parentList = new ArrayList<Menu>(); 13 // 筛选一级菜单 14 for (Menu pmenu : allList) { 15 // 筛选条件,此菜单没有父级菜单 16 if (pmenu.getParent() == null) { 17 parentList.add(pmenu); 18 } 19 } 20 21 //筛选二级菜单 22 for (Menu cmenu : allList) { 23 //判断条件:此菜单的父级菜单存在 24 if (cmenu.getParent()!=null) { 25 //迭代上面已经取出的父级菜单 26 for (Menu pmenu : parentList) { 27 //判断条件:pmenu父级菜单的id和cmenu子级菜单属性中parent的getid相等 28 if (pmenu.getId() == cmenu.getParent().getId()) { 29 //把子菜单放入相应的父级菜单下 30 pmenu.getChildren().add(cmenu); 31 } 32 } 33 } 34 } 35 36 return parentList; 37 } 38 }
至此,根据登录的用户,来获取相应所拥有的菜单列表的功能已经完成。
需要注意的是:
1. 在使用struts2的标签从值栈中取值的时候,需要注意后台存放的名字和前台struts标签中取值时候的名字,需要保持一致。
2. 关于不同用户显示不同权限菜单,原理很简单,从seesion中取当前登录的 id,根据 id 去数据库中查询该 id 所拥有的角色列表等。
(这里需要注意hibernate 多表联查 HQL 语句 的问题)
3. 在使用其他方法(如 JSON等),可能需要根据方法来调整相关实现类的细节处理等。
以上是关于SSH 结构中 不同角色登录,显示不同的菜单的主要内容,如果未能解决你的问题,请参考以下文章
一个简单的实现不同权限的用户登录后看到不同的菜单设计的数据库表清单
我应该如何应用 if-else 条件来向具有不同用户角色的人显示不同的菜单?
JavaWeb SSM 《精品毕设》个人博客系统 前台 + 后台(源码 + 论文)主要实现的登录注册主页博客随笔文章管理消息管理评论管理用户管理角色管理主题管理栏目管理等功能