问题描述
为了实现模块化开发,struts_config.xml想放在各个plugin代码之下,如何扩展ActionServlet来读入这些分散的配置文件?
解决方案
如果看过struts的源码,了解struts的初期加载过程的话,就该知道在struts中可以覆写ActionServlet的initModuleConfig方法来实现自己的加载封装。举例说一下:假如你的模块都放在WEB-INFplugin之下:WEB-INFplugincmsWEB-INFpluginblogWEB-INFpluginmemberWEB-INFpluginspace...而struts_config.xml文件就在每个plugin的根目录下:如:WEB-INFplugincmsstruts_config.xml那么就可以如下扩展ActionServlet来实现自定义加载:public class BaseServlet extends ActionServlet {protected ModuleConfig initModuleConfig(String prefix, String paths)throws ServletException {// Parse the configuration for this moduleModuleConfigFactory factoryObject = ModuleConfigFactory.createFactory();ModuleConfig config = factoryObject.createModuleConfig(prefix);// Configure the Digester instance we will useDigester digester = initConfigDigester();String path = getServletContext().getRealPath("/");String pluginPath = path + "WEB-INF" + File.separator + "plugin";try {File[] files = new File(pluginPath).listFiles();for (int intCnt = 0; intCnt < files.length; intCnt++) {if (files[intCnt].isDirectory()) {digester.push(config);String configPath = files[intCnt].getAbsolutePath()+ File.separator + "struts_config.xml";if(new File(configPath).exists()) {String pp = configPath.substring(getServletContext().getRealPath("/").length() - 1).replace('\', '/');;System.out.println(pp);parseModuleConfigFile(digester, getServletContext().getResource(pp));}}} } catch (MalformedURLException e) { throw new UnavailableException(e.getMessage());}getServletContext().setAttribute(Globals.MODULE_KEY + config.getPrefix(), config);return config;}}
解决方案二:
中间用,分隔<servlet-class>org.apache.struts.action.ActionServlet</servlet-class><init-param><param-name>config</param-name><param-value>/WEB-INF/struts-config.xml,/WEB-INF/struts-config-system.xml,。。。。。。。</param-value></init-param>
解决方案三:
或者在web.xml里config文件配置多个xml试试<init-param> <param-name>config</param-name> <!—config指明Struts应用程序的配置文件相对位置--> <param-value>/WEB-INF/struts-config.xml</param-value></init-param><init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config-registration.xml</param-value></init-param>
解决方案四:
其实只要在主struts_config.xml里把其他的struts的xml include进来就好了在struts_config.xml里加上<include file="XXX/xxx/struts-xxx.xml"></include>