百度空间 | 百度首页 
               
 
查看文章
 
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即可。

类别:Plugin | 添加到搜藏 | 浏览() | 评论 (1)
 
最近读者:
 
网友评论:
1
2008-04-21 09:25 | 回复
呵呵,分析的很不错,受益了!谢谢
 
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu