OA系统的左侧菜单栏的菜单项的处理

来源:互联网 发布:网络拓扑图基本结构 编辑:程序博客网 时间:2024/06/05 19:25
 
 
 
==============================================================================
如图所示,OA系统的左侧是一个使用权限的菜单栏。根据权限来决定是否显示相应的权限功能。
在处理这类问题的时候,需要清楚左侧栏的数据是一进入系统内部后就一直要使用的、每个用户都要用到,而且也不需要对其进行增删改,并且也不准备修改左侧的权限菜单栏,所以,左侧栏的数据是固定不变的,不管谁进入系统内部都是一样的(这里的“一样的”不是说权限不同的人看到的内容是一样多的,指的是不管你权限多大多小,看到的内容肯定在这些内容以内,不会超出),所以,我们可以只对其查询一次,然后保存到application对象中,而不需要每次请求都查询一遍。最后在页面显示的时候,可以对用户的权限进行判断,如果有相应的权限,那么就显示相应的菜单项。
 
遇到的问题:1. 既然要把左侧菜单栏的数据保存到Application对象中,那么该在哪里对其进行保存?什么时候开始?
        因为这个数据只需要查询一次,也只要保存一次,而且一进入OA系统内部就要用到,那么我们可以让项目已启动就对数据进行查询并保存到Application对象中。
        这样的话,我们就可以配置  ServletContextListener   监听器,对Application对象进行操作,在Application初始化的时候,就进行查询数据,保存数据。
  1. publicclassInitListenerimplementsServletContextListener{
  2. //销毁application对象时调用
  3. publicvoid contextDestroyed(ServletContextEvent sce){
  4. // TODO Auto-generated method stub
  5. }
  6. //初始化application对象时调用
  7. publicvoid contextInitialized(ServletContextEvent sce){
  8. }
  9. }
遇到的问题:2. 如何获取菜单栏的数据?怎么保存?(在Spring容器中怎么获取)
 
        首先说明一下:
        Privilege --> 是菜单项对象(其实Privilege的意思是权限的意思,在这里因为它是作为菜单栏的子项,所以才叫做菜单项对象)
        PrivilegeService --> 是菜单项的Service接口,它有一个方法:findTopList() 获取顶级菜单项
        PrivilegeServiceImpl -->是菜单项的Service接口的实现类
        然后开始解决如何获取菜单栏的数据:
 
        大致思路如下:
            第一步:获取privilegeService对象;
            第二步:通过privilegeService对象调用findTopList()方法获取List<Privilege> topPrivilegeList集合;
            第三步:通过ServletContextEvent对象获取ServletContext对象(application),保存属性topPrivilegeList;
 
        开始写代码遇到的问题:如何获取PrivilegeService对象? 
        解决问题:
                误区:直接使用ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
                           来获取Spring容器对象,再通过Spring容器对象获取privilegeService对象。
                为什么说上面的思路是误区呢?因为如果是通过 new ClassPathXmlApplicationContext()来获取Spring对象的话,
                就相当于又创建了一个Spring容器对象,那么就有两个容器对象了。因为容器对象是非常耗性能的,一般一个项目只有一个。
                
                那么该如何正确的获取已经被创建的Spring容器对象呢?
        正确解法:Spring框架提供了一个工具类  WebApplicationContextUtils 可以获取到当前已经创建的Spring容器对象。
       完整代码如下:
  1. publicvoid contextInitialized(ServletContextEvent sce){
  2. //获取当前的容器对象
  3. ApplicationContext ac =WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext());
  4. //获取当前容器对象的privilegeService对象
  5. PrivilegeService privilegeService =(PrivilegeService) ac.getBean("privilegeServiceImpl");
  6. //准备数据
  7. List<Privilege> topPrivilegeList = privilegeService.findTopList();
  8. sce.getServletContext().setAttribute("topPrivilegeList", topPrivilegeList);
  9. }
其中在对topPrivilegeList对象进行保存的时候,也需要注意!
在这里我们不能使用ActionContext.getContext().getApplication().put(k,v);因为,我们就在初始化application对象,哪来的Application对象来保存这个数据。所以,在使用ActionContext.getContext().getApplication().put(k,v);进行保存的时候会报空指针异常!!
        
 

 

 
 
 
    



来自为知笔记(Wiz)



附件列表

  • 360反馈意见截图163706229713987.png

 

0 0
原创粉丝点击