在大的项目的开发中,如果采用了struts2,就有可能有很多的struts2的配置文件,虽然struts2提供通配符和action的自动加载,但我们一般还是很难将所有的配置文件采用一个单一的action配置文件来解决,因此就产生了很多的action配置文件。如果我们将所有的配置文件存放在一个配置文件中,这样在项目间的协同开发和测试就会出现混乱,而最好的开发模式就是每个模块都有自己的action配置文件,而系统会自动搜索到所有的配置文件,采用自动加载的方式来完成struts2的初始化。
虽然在struts2中提供在web.xml文件中配置config参数,将说有需要加载的配置文件的路径写在其中,以逗号分隔,这样对于大的项目来说还是很难实施的,最好的办法还是采用自动扫描的方法,我们可以扩展struts2的ConfigurationProvider接口,在web.xml中配置自定义的加载类即可,这样就解决了struts2配置文件自动加载的问题,具体的实现代码如下:
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;
/**
* 解决struts2中自动加载模块的struts的配置文件
* <p>注意:模块的配置文件必须为*-struts.xml <p>
* @author Wall.Lee(xiaoshan2242@gmail.com)
*/
public class CutomConfigurationProvider extends XmlConfigurationProvider {
private static final String FILE_PATTERN = "classpath*:/**/*-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中添加如下的代码:
<!-- struts2的入口开始 -->
<filter>
<filter-name>struts-prepare</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter</filter-class>
<init-param>
<param-name>configProviders</param-name>
<param-value>com.jtv.walllee.utils.auto.CutomConfigurationProvider</param-value>
</init-param>
</filter>
虽然在struts2中提供在web.xml文件中配置config参数,将说有需要加载的配置文件的路径写在其中,以逗号分隔,这样对于大的项目来说还是很难实施的,最好的办法还是采用自动扫描的方法,我们可以扩展struts2的ConfigurationProvider接口,在web.xml中配置自定义的加载类即可,这样就解决了struts2配置文件自动加载的问题,具体的实现代码如下:
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;
/**
* 解决struts2中自动加载模块的struts的配置文件
* <p>注意:模块的配置文件必须为*-struts.xml <p>
* @author Wall.Lee(xiaoshan2242@gmail.com)
*/
public class CutomConfigurationProvider extends XmlConfigurationProvider {
private static final String FILE_PATTERN = "classpath*:/**/*-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中添加如下的代码:
<!-- struts2的入口开始 -->
<filter>
<filter-name>struts-prepare</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter</filter-class>
<init-param>
<param-name>configProviders</param-name>
<param-value>com.jtv.walllee.utils.auto.CutomConfigurationProvider</param-value>
</init-param>
</filter>