如图所示,OA系统的左侧是一个使用权限的菜单栏。根据权限来决定是否显示相应的权限功能。
在处理这类问题的时候,需要清楚左侧栏的数据是一进入系统内部后就一直要使用的、每个用户都要用到,而且也不需要对其进行增删改,并且也不准备修改左侧的权限菜单栏,所以,左侧栏的数据是固定不变的,不管谁进入系统内部都是一样的(这里的“一样的”不是说权限不同的人看到的内容是一样多的,指的是不管你权限多大多小,看到的内容肯定在这些内容以内,不会超出),所以,我们可以只对其查询一次,然后保存到application对象中,而不需要每次请求都查询一遍。最后在页面显示的时候,可以对用户的权限进行判断,如果有相应的权限,那么就显示相应的菜单项。
遇到的问题:1. 既然要把左侧菜单栏的数据保存到Application对象中,那么该在哪里对其进行保存?什么时候开始?
因为这个数据只需要查询一次,也只要保存一次,而且一进入OA系统内部就要用到,那么我们可以让项目已启动就对数据进行查询并保存到Application对象中。
这样的话,我们就可以配置 ServletContextListener 监听器,对Application对象进行操作,在Application初始化的时候,就进行查询数据,保存数据。
public class InitListener implements ServletContextListener {
//销毁application对象时调用
public void contextDestroyed(ServletContextEvent sce) {
// TODO Auto-generated method stub
}
//初始化application对象时调用
public void contextInitialized(ServletContextEvent sce) {
}
}
遇到的问题: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容器对象。
完整代码如下:
public void contextInitialized(ServletContextEvent sce) {
//获取当前的容器对象
ApplicationContext ac = WebApplicationContextUtils.getWebApplicationContext(sce.getServletContext());
//获取当前容器对象的privilegeService对象
PrivilegeService privilegeService = (PrivilegeService) ac.getBean("privilegeServiceImpl");
//准备数据
List<Privilege> topPrivilegeList = privilegeService.findTopList();
sce.getServletContext().setAttribute("topPrivilegeList", topPrivilegeList);
}
其中在对topPrivilegeList对象进行保存的时候,也需要注意!
在这里我们不能使用ActionContext.getContext().getApplication().put(k,v);因为,我们就在初始化application对象,哪来的Application对象来保存这个数据。所以,在使用ActionContext.getContext().getApplication().put(k,v);进行保存的时候会报空指针异常!!