查看文章 |
Struts2中Action使用多个Plugin的解决办法和源代码分析
2008-04-20 21:57
问题的提出: 在Struts2中的某些Plugin的使用是需要继承Plugin中的struts-plugin.xml中定义的package的,比如在JsonPlugin中,如果使 用就需要继承如下定义的package:json-default,如果使用AjaxFileUpload的plugin的话就需要继承如下的 package:ajaxfileupload-default。 具体问题在:http://www.javaeye.com/topic/183692 问题的解决办法和源代码分析: 1 寻找Struts2处理此处的源代码位置 众所周知Struts2为WebWork的衍生物,在tomcat启动后我们可以发现如下的log: com.opensymphony.xwork2.config.providers.XmlConfigrationProvider register 信息:Parsing configuration file [struts.xml] 因此可以基本判断XmlConfigrationProvider应该是处理package加载的处理类。 2 分析源代码 处理流程如下: (1)XmlConfigrationProvider的loadPackages方法 在此方法中,我们可以看到当Xml文件的Node的名字为"package"的时候就执行addPackage方法。 此处还留有一个问题,就是loadPackages方法是谁来调用的?我会研究后给出结果。 (2)XmlConfigrationProvider的addPackage方法 此方法第一句: PackageConfig newPackage = buildPackageContext(packageElement); (2)XmlConfigrationProvider的buildPackageContext方法 String parent = packageElement.getAttribute("extends");//获取extends的字符串 ... if(!TextUtil.stringSet(TextUtils.noNull(parent))){//no parents ... }else{//has parents,let's look it up 如果存在父package处理 List parents = ConfigurationUtil.buildParentsFromString(configuration,parent);//获取父package的数量,注意此处返回为List ... } (3)ConfigurationUtil的buildParentsFromString方法 此处就是Struts2处理父包(parent package)的核心判断方法 此处Struts2使用了StringTokenizer类 可以看到源代码: StringTokenizer tokenizer = new StringTokenizer(parent,",");//使用逗号为分隔符 就此源代码就分析完了,那么我们也就有了对于问题的解决办法,我们还可以看到buildParentsFromString在处理类中多次调用,说明还有一些其他其他处理情况,可以根据此深入分析。 3 解决办法 在package的extends用逗号分隔你想继承的parent package即可。 |
最近读者: