zoukankan      html  css  js  c++  java
  • 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等),可能需要根据方法来调整相关实现类的细节处理等。

  • 相关阅读:
    c++编程和c在思想上最大的差别
    java反射field和method的顺序问题
    使用wireshark分析tcp/ip报文之报文头
    wireshark不支持抓localhost/127.0.0.1的包解决方法
    wireshark捕获表达式之Berkeley Packet Filter (BPF) syntax
    java replaceAll之$替换
    阿里云至今不支持组播,确实比较坑爹
    java安全体系之JCA、JCE、JAAS、JSSE及其关系
    一个风控计算负载过高到mysql主从拆分暴露的各种设计复杂性问题以及解决方法总结
    作为从业人员,如果一定要学一门新的编程语言,那么它一定是c++
  • 原文地址:https://www.cnblogs.com/applerosa/p/5946914.html
Copyright © 2011-2022 走看看