项目大了,会出现多个struts-config 配置文件,有时由于各自为营,会在每个struts-config里都配置一个自己用到的验证配置文件,之后往往会出现些“奇怪的问题”。
比较明显的一个问题就是,明明自己配置了验证plugin,也配置对了相应的validator文件,可验证就是不起作用,甚至导致action或相应的jsp 在被 访问的时间出现异常。
接下来先看下org.apache.struts.validator.ValidatorPlugIn 源码中一部分:
private String pathnames = null;
public String getPathnames() {
return pathnames;
}
上面就是获取你在struts-config中配置验证插件的的pathnames,在插件被初始化时,会执行
public void init(ActionServlet servlet, ModuleConfig config) throws ServletException
方法,它里面又先调用 this.initResources(); 在这个方法内容就是加载验证配置文件,并将加载结果保存到类变量resources,resources 的定义:
protected ValidatorResources resources = null;
在 initResources()最后有如下语句,将分析后的验证配置文件内容进行保存
this.resources = new ValidatorResources(urlArray);
回到init(ActionServlet servlet, ModuleConfig config)方法,在调用initResoures()后,将执行下面两行:
servlet.getServletContext().setAttribute(VALIDATOR_KEY + config.getPrefix(), resources);
servlet.getServletContext().setAttribute(STOP_ON_ERROR_KEY + '.' + config.getPrefix(), (this.stopOnFirstError ? Boolean.TRUE : Boolean.FALSE));
从第一句就能看到,它是将结果保存到ServletContext中,且Key是不变的,也就是说,当你加载多个相同的验证插件,将导致最开始加载的被后面的直接覆盖,就会出现明明加载了但并未起作用甚至导致页面显示不正常。
但如上面红色字体部分,我们是可以让多个验证插件同时存在的。当我们在web中进行配置时,可以加上模块名,如默认ActionServlet 有config 这个参数,我们可以添加配置config/moduleName 这个moduleName有点像struts2中package的namespace.这样在访问具体action时路径也就变为app/moduleName/action。具体config怎么来的建议查看相关struts 初始化的文章,API对ModuleConfig.getPrefix()的描述如下:
The prefix of the context-relative portion of the request URI, used to select this configuration versus others supported by the controller servlet. A configuration with a prefix of a zero-length String is the default configuration for this web module.
代码格式调了半天就是调不好,干脆不用代码标记了