浏览 7555 次
锁定老帖子 主题:100%实现webwork配置模块化
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-11-21
但是,这种做法不太好。首先,他限制我们必须在classes根目录下放一个xwork.xml,然后,我们添加一个模块的时候,必须在添加相应xwork配置文件的同时,在xwork.xml里面需要添加include,这样,整体依赖于部分,最后,当我们去掉一个模块的时候,我们必须再次删除xwork配置文件,去掉xwork.xml里面的include,何况,我们一个模块,除了xwork,还有其他的配置文件,比如,wsh(webwork+spring+hibernate)的配置文件,除了xwork,还有spring的,hibernate的,如下: /swconf/spring.xml,xwork.xml /amod/spring/ xxx.xml…… /hbm/xxx.hbm.xml…… /xwork/xxx.xml…… /bmod/spring/ xxx.xml…… /hbm/xxx.hbm.xml…… /xwork/xxx.xml…… 我们希望,添加a模块时,只需要添加amod目录,去掉a模块时,只需要去掉amod目录。 这样实现按目录的autoaware的模块化编程。 spring的很简单,使用ClasspathXmlApplicationContext很容易实现。 hibernate的也能实现,改写LocalSeesionBeanFactory就可以了。 我们现在要讨论的是如何实现xwork的。 首先,实现自己的ConfigurationProvider: public class MoudleXmlConfigurationProvider implements ConfigurationProvider{ 。。。。。。 public MoudleXmlConfigurationProvider(List configFileNameList) { this.configFileNameList = configFileNameList; } public void init(Configuration configuration) { this.configuration = configuration; includedFileNames.clear(); try{ for(int i=0,len=configFileNameList.size();i<len;i++){ //includedFileNames.clear(); String configFileName=(String)configFileNameList.get(i); this.configFileName=configFileName; loadConfigurationFile(configFileName, null); //includedFileNames.add(configFileName); } } catch (Exception e) { LOG.fatal( "Could not load XWork configuration file, failing:" + e); throw new ConfigurationException( "Error loading configuration file " + configFileNameList, e); } } 。。。。。。 } 使用listener在web应用启动时,或者在testcase setup时调用: LOG.info("begin init xwork provider"); List xworkConfigFileList=new ArrayList(); String[] fileList= ResourceFinder.getXwork(); //ResourceFinder.getFile("classpath*:/swconf/**/*webwork.xml"); for(int i=0,len=fileList.length;i<len;i++){ //includedFileNames.clear(); xworkConfigFileList.add(fileList[i]); } ConfigurationProvider configurationProvider=new MoudleXmlConfigurationProvider(xworkConfigFileList); ConfigurationManager.addConfigurationProvider(configurationProvider); LOG.info("end init xwork provider"); 这里使用了ResourceFinder类,为了方便,使用spring实现的: public class ResourceFinder { 。。。。。。 public static String[] getXwork(){ String[] list=getFile("classpath*:/swconf/**/xwork/*.xml"); String[] allList = new String[list.length+1]; allList[0]= "swconf/xwork.xml"; for(int i=0;i<list.length;i++){ allList[i+1]=list[i]; } return allList; } private static String[] getFile(String regString){ String[] resouceArray=null; try { ResourcePatternResolver rpr=new PathMatchingResourcePatternResolver(); Resource[] rs=rpr.getResources(regString); if(rs==null){ return null; } resouceArray=new String[rs.length]; int i=0; for(Resource c:rs){ String realPath=c.getURL().getPath(); String xdpath=realPath.substring(realPath.indexOf("classes")+8); resouceArray[i]=xdpath; i++; LOG.info("-------------"+xdpath); } } catch (IOException e) { LOG.error("error in find resource",e); } return resouceArray; } } 这样,就可以了。 从实现上,可以看到,webwork底层的实现是比较槽糕的,如果想更改他的缺省实现,费老劲了。不如tapestry,使用hivemind,可插拔式的,对他的任何实现不满,改写一下,一个implemention配置就覆盖原来的实现,方便死了 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-11-21
太多的配置本来就是个错误,
分久必合,合久必分, 合并一统的年代即将到来 |
|
返回顶楼 | |
发表时间:2006-11-21
giscat 写道 太多的配置本来就是个错误,
分久必合,合久必分, 合并一统的年代即将到来 所以在我自己做的xyz框架中干脆不要配置文件,但是在实际开发中,已经使用了webwork,所以,也只有这样补漏了,换用某个用户在评论xyz的说法,叫做不是框架不提供某种功能,是你没有挖掘出他的功能,可是,我挖掘出xwork的模块配置实现,还是感觉不爽,不如tapestry |
|
返回顶楼 | |
发表时间:2007-07-05
能够在这个基础上实现一个模块的动态加载(就是说在运行期动态的添加或者移除一个模块)呢?
|
|
返回顶楼 | |
发表时间:2007-07-20
兄弟,没有你所说的那样复杂。
<include file="webwork-default.xml"/> 然后下面就是一堆action的配置就OK了,哪用得着什么包含之后又删除的? 事实上,没有一个框加是完善的,不必吹毛求疵。如果你觉得有些地方不合理的话,完全可以像你一样自己实现一个。。。 |
|
返回顶楼 | |