1.struts2和dwr为什么会冲突?
最近很多同学都在问同样一个问题,struts2和dwr该如何共存?我们先分析一下为什么会出现冲突.
struts2通过StrutsPrepareAndExecuteFilter过滤器来处理请求,常见的配置如下:
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
问题就在这里,<url-pattern>/*</url-pattern>配置过滤了所有的请求,当用户提交的请求是/dwr/*时,也同样被StrutsPrepareAndExecuteFilter处理了,根本达不到DWR框架,这就是为什么二者不能共存的原因.
2.通过struts2源码发现问题
网上我没找到问题的解决方案,所以,只能通过阅读源代码来查找问题的根源了.在StrutsPrepareAndExecuteFilter类中,重写了doFilter方法:
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
try {
prepare.setEncodingAndLocale(request, response);
prepare.createActionContext(request, response);
prepare.assignDispatcherToThread();
if ( excludedPatterns != null && prepare.isUrlExcluded(request, excludedPatterns)) {
chain.doFilter(request, response);
} else {
request = prepare.wrapRequest(request);
ActionMapping mapping = prepare.findActionMapping(request, response, true);
if (mapping == null) {
boolean handled = execute.executeStaticResourceRequest(request, response);
if (!handled) {
chain.doFilter(request, response);
}
} else {
execute.executeAction(request, response, mapping);
}
}
} finally {
prepare.cleanupRequest(request);
}
}
注意看粗体部分,如果excludedPatterns不为null且prepare.isUrlExcluded方法的返回值为true,则该请求不交给struts框架处理,那么,sUrlExcluded是如何定义的呢?我们跟踪找到下面的代码:
public boolean isUrlExcluded( HttpServletRequest request, List<Pattern> excludedPatterns ) {
if (excludedPatterns != null) {
String uri = getUri(request);
for ( Pattern pattern : excludedPatterns ) {
if (pattern.matcher(uri).matches()) {
return true;
}
}
}
return false;
}
我们看到, isUrlExcluded 方法中 excludedPatterns参数是一个List集合, String uri = getUri(request);代码获取请求路径,然后通过一个for循环将请求路径与 excludedPatterns进行匹(,注意,这里是通过正则表达式进行匹配的),如果匹配成功,则返回true,否则返回false.
那么, excludedPatterns的值从哪里来呢?下面的代码是也:
public List<Pattern> buildExcludedPatternsList( Dispatcher dispatcher ) {
return buildExcludedPatternsList(dispatcher.getContainer().getInstance(String.class, StrutsConstants.STRUTS_ACTION_EXCLUDE_PATTERN));
}
private List<Pattern> buildExcludedPatternsList( String patterns ) {
if (null != patterns && patterns.trim().length() != 0) {
List<Pattern> list = new ArrayList<Pattern>();
String[] tokens = patterns.split(",");
for ( String token : tokens ) {
list.add(Pattern.compile(token.trim()));
}
return Collections.unmodifiableList(list);
} else {
return null;
}
}
看了上面的代码,是不是豁然开朗?原来, StrutsConstants.STRUTS_ACTION_EXCLUDE_PATTERN常量保存了不由struts2处理的路径,我们在struts2.properties中配置即可.
struts.action.excludePattern=/dwr/.*,/dwr/test/.*
相关推荐
struts2与dwr整合实例,里面已经包括需要的jar包
利用struts2 和 dwr 实现登陆验证
struts2与dwr结合的工具之一,这个是新从官方网站下载的,与大家分享,希望对你们有效。
struts2与dwr2完整实例,dwr2访问action
dwr与struts2简介,Struts2的Ajax支持介绍,基于Ajax的输入校验等
struts1+hibernate+dwr 项目 房屋信息发布struts1+hibernate+dwr 项目 房屋信息发布struts1+hibernate+dwr 项目 房屋信息发布
下载放到Myeclips里就可以运行、里面包含struts2环境搭建(点击按钮)、struts2+dwr整合(在文本框中输入值后会访问后台,给select动态增加option赋值、点击按钮又会显示会select被选中的option的value和text值)、...
struts1+spring+hibernate+dwr 项目 满意度调查struts1+spring+hibernate+dwr 项目 满意度调查struts1+spring+hibernate+dwr 项目 满意度调查struts1+spring+hibernate+dwr 项目 满意度调查
struts2+dwr整合例子,部署后可直接用,可供学习和参考,另外吐槽一句,struts对ajax的支持真的是弱爆了!!
自己从网上下了源码,然后整合成的struts2与dwr的jar包。不过不知道现在还在使用dwr的还有多少
Spring+struts+hibernate+dwr框架整合教程 本教程是专门介绍如何在ssh框架中搭建dwr框架。
精心整理的,dwr与目前流行框架spring和struts2的整合,值得一学
spring+ibatis+struts2+dwr反转 加上上面的 spring+ibatis+struts2+dwr反转部分架包 在按照说明执行上面的脚本运行项目就可以看到效果了
struts2+dwr上传带进度条监控 具体功能就实现在源码中都有注释 我就不在这里多介绍了 其实网上也有很多这类功能的源码 和介绍 不过我还是弄了N久才弄明白 然后经理解自己实现了一下 主要是做好页面的dwr方法调用的...
struts2+dwr整合实例,在文本框中输入值。会到后台查询,给select标签赋值,要是想实现级联下拉框,我想你看完应该能做出来。
struts2+hibernate+spring+dwr(用户注册)struts2+hibernate+spring+dwr(用户注册)
NULL 博文链接:https://firezhfox.iteye.com/blog/1735391
struts2 dwr ajax 配置 局部刷新
在Struts 2.0中使用DWR实现AJAX表单校验。提供完整的实例源码!