因为项目需要一些动态的权限验证.需要根据命名空间找到类,然后反射出所有的方法做权限的验证.还希望能够动态的配置页面显示的模块.
实现的过程中遇到一个问题,如果根据namespace获得对应的action.java呢??
找了些资料,并没有发现直接回答这个问题的.只要自己来找吧.
打开FilterDispatcher.java来看看doFilter都组了什么.
//根据URI地址获得当前mapping mapping = actionMapper.getMapping(request, dispatcher.getConfigurationManager());
//利用mapping执行action dispatcher.serviceAction(request, response, servletContext, mapping);
以上两个是关键点..首先struts2会根据当前的uri获得mapping..实现的原理和我处理页面URL的差不多.有时间我贴出来给大家看..然后又通过mapping和必要的参数开始执行action的方法..那我需要的一个字第二部里了.点击Ctrl进入看看吧.
这个时候打开了Dispatcher.java
Configuration config = configurationManager.getConfiguration(); //通过namespace+name+method+extracontext执行action ActionProxy proxy = config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy( namespace, name, method, extraContext, true, false);
嘿嘿找到了.原来是在ActionProxy上啊.这就简单了.打开我的Action开始测试一下.
Dispatcher dispatcher = Dispatcher.getInstance(); ConfigurationManager configurationManager = dispatcher.getConfigurationManager(); Configuration config = configurationManager.getConfiguration(); Container container = config.getContainer(); ActionProxyFactory actionProxyFactory = container.getInstance(ActionProxyFactory.class); //针对当前需求,这里用到的只有"/system/module"和第二个"module"有用.,其他参数没有实际用途. ActionProxy proxy = actionProxyFactory.createActionProxy("/system/module", "module", "module", null, true, false); Object obj = proxy.getAction(); System.out.println(obj.getClass().getName());
页面输出
com.wisdom.pmall.web.system.module.ModuleAction
可以根据命名空间和名称来获得类了...已经达到最开始预想的要求了..现在我能不能遍历所有的命名空间和名字呢?
这些东西应该是在config里的吧.
config.getPackageConfigs()
可以返回所有的配置信息.包括了命名空间.但是没有name...看来还需要近一步跟踪...马上下班了.明天再弄吧!