100%实现webwork配置模块化

webwork宣称是支持模块化编程的,诚然,由于webwork支持多个配置文件,我们在开发不同模块的时候,可以使用不同的配置文件,然后,在整合的时候通过include把不同的模块包含在class根目录下的xwork.xml里面。
但是,这种做法不太好。首先,他限制我们必须在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配置就覆盖原来的实现,方便死了

你可能感兴趣的:(spring,编程,Hibernate,xml,Webwork)