相信大家在做项目的时候都遇到一个问题就是配置文件,模块越多配置的Action也会因此增加很多,所以有的开发人员采用了Struts提供的include标签在一个xml文件引入许多其他模块的配置文件,但是在用SVN的时候,团队中开发也不是很方便,有的人员采用配置config参数,但是哪么多配置文件也是个麻烦问题。要想Struts像Spring一样通过表达式来加载配置文件,是可以的,下面贴上源码:
package com.dt.his.webcnter.util;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import com.opensymphony.xwork2.config.ConfigurationException;
import com.opensymphony.xwork2.config.providers.XmlConfigurationProvider;
import com.opensymphony.xwork2.inject.ContainerBuilder;
import com.opensymphony.xwork2.util.location.LocatableProperties;
public class CutomConfigurationProvider extends XmlConfigurationProvider {
//需要解析加载的文件路径
private static final String FILE_PATTERN = "classpath*:config/**/struts_*.xml";
public CutomConfigurationProvider() {
Map<String, String> mappings = new HashMap<String, String>();
mappings.put("-//OpenSymphony Group//XWork 2.1.3//EN",
"xwork-2.1.3.dtd");
mappings.put("-//OpenSymphony Group//XWork 2.1//EN", "xwork-2.1.dtd");
mappings.put("-//OpenSymphony Group//XWork 2.0//EN", "xwork-2.0.dtd");
mappings.put("-//OpenSymphony Group//XWork 1.1.1//EN",
"xwork-1.1.1.dtd");
mappings.put("-//OpenSymphony Group//XWork 1.1//EN", "xwork-1.1.dtd");
mappings.put("-//OpenSymphony Group//XWork 1.0//EN", "xwork-1.0.dtd");
mappings
.put(
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN",
"struts-2.0.dtd");
mappings
.put(
"-//Apache Software Foundation//DTD Struts Configuration 2.1//EN",
"struts-2.1.dtd");
mappings
.put(
"-//Apache Software Foundation//DTD Struts Configuration 2.1.7//EN",
"struts-2.1.7.dtd");
setDtdMappings(mappings);
}
/**
* (non-Javadoc)
*
* @see com.opensymphony.xwork2.config.ContainerProvider#needsReload()
*/
@Override
public boolean needsReload() {
return true;
}
/*
* (non-Javadoc)
*
* @see com.opensymphony.xwork2.config.ContainerProvider#register(com.opensymphony.xwork2.inject.ContainerBuilder,
* com.opensymphony.xwork2.util.location.LocatableProperties)
*/
@Override
public void register(ContainerBuilder containerBuilder,
LocatableProperties props) throws ConfigurationException {
super.register(containerBuilder, props);
}
/*
* (non-Javadoc)
*
* @see com.opensymphony.xwork2.config.PackageProvider#loadPackages()
*/
@Override
public void loadPackages() throws ConfigurationException {
super.loadPackages();
}
@Override
protected Iterator<URL> getConfigurationUrls(String fileName)
throws IOException {
List<URL> urls = new ArrayList<URL>();
Resource[] resources = getAllResourcesUrl();
for (Resource resource : resources) {
urls.add(resource.getURL());
}
return urls.iterator();
}
/**
* 获取系统中需要搜寻的struts的配置
*
* @return
* @throws IOException
*/
private Resource[] getAllResourcesUrl() {
ResourcePatternResolver resoler = new PathMatchingResourcePatternResolver();
try {
return resoler.getResources(FILE_PATTERN);
} catch (IOException e) {
e.printStackTrace();
}
return new Resource[0];
}
}
在web.xml中配置如下:
<!-- 配置Struts过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
<init-param>
<param-name>configProviders</param-name>
<param-value>
com.dt.his.webcnter.util.CutomConfigurationProvider
</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>