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在项目中的共存解决方案,通过此配置,可以解决struts2和DWR之间的冲突问题,很管用的!可以试试
1. **添加依赖**:首先,需要在项目中引入Struts2和DWR的JAR包。这些JAR包可能包含在你提供的压缩包中,如`dwr.jar`和其他相关的Struts2依赖。 2. **配置Struts2**:在`struts.xml`配置文件中,添加DWR相关的Action...
在本项目"Struts2_Dwr"中,我们将看到如何整合这两个工具来实现一个登录验证系统。 Struts2是一个基于MVC设计模式的Java Web应用框架,它提供了强大的控制层结构,用于处理用户请求、业务逻辑和视图展示。Struts2的...
1. 集成DWR2到Struts2项目中:首先需要在项目中引入DWR2的依赖库,然后在web.xml中配置DWR的servlet,设置允许访问的类等。 2. 创建Java类和Struts2 Action:在服务器端编写处理业务逻辑的Java类,这些类的方法可以...
### dwr与struts2 #### Struts2的Ajax支持介绍 **Struts2** 是一个流行的MVC(Model-View-Controller)架构框架,它主要用于构建Java Web应用程序。Struts2提供了强大的功能来帮助开发者简化开发流程并提高效率。...
1. **引入依赖**:在项目中添加Struts2和DWR的相关jar包,并配置web.xml以启用DWR。 2. **配置DWR**:创建dwr.xml配置文件,定义允许客户端访问的Java类和方法。 3. **创建Action**:在Struts2中编写Action,实现...
"struts2+dwr整合例子"是一个结合了这两种技术的示例项目,它展示了如何将Struts2的控制层与DWR的Ajax功能集成在一起。在这个例子中,可能包含了以下关键部分: 1. **Struts2配置**:在struts.xml或类似的配置文件...
struts2与dwr结合的工具之一,这个是新从官方网站下载的,与大家分享,希望对你们有效。
Struts2.0和DWR(Direct Web Remoting)是两个在Web开发中广泛使用的开源框架,它们分别在MVC(Model-View-Controller)架构和远程方法调用上发挥着重要作用。Struts2.0作为Java EE平台上的一个强大MVC框架,提供了...
- 添加Spring、Struts2、Hibernate和DWR的jar包到项目的类路径中。 2. **配置Spring** - 创建Spring配置文件,定义bean,包括数据源、SessionFactory、Service层和DAO层的bean。 - 配置AOP代理,用于事务管理。 ...
综上所述,"DWR与SPRING,DWR与STRUTS2的整合"主题涵盖了现代Java Web开发中重要的三个方面:DWR的实时通信能力、Spring的全面后端支持和Struts2的MVC架构。通过整合这三者,开发者可以构建出具有高效交互、灵活管理...
Struts2、DWR(Direct Web Remoting)和Ajax是Web开发中的关键技术,它们结合使用可以实现页面的...在实际项目中,确保正确配置所有组件,理解DWR的工作机制,以及熟练运用Struts2的Action和结果类型,是成功的关键。
在这个“dwr.rar”压缩包中,包含了一些关于DWR与Struts2框架整合使用的示例,对于学习和理解DWR在实际项目中的应用非常有帮助。 DWR的核心功能在于它提供了一种安全、高效的机制,使得前端JavaScript可以直接调用...
Struts2.0和DWR(Direct Web Remoting)是两个在Web开发中常见的开源框架。Struts2.0作为MVC(Model-View-Controller)框架,主要用于构建企业级的Java Web应用,而DWR则是一种使得JavaScript可以与服务器端Java对象...
下载放到Myeclips里就可以运行、里面包含struts2环境搭建(点击按钮)、struts2+dwr整合(在文本框中输入值后会访问后台,给select动态增加option赋值、点击按钮又会显示会select被选中的option的value和text值)、...
Struts1、Hibernate和DWR是Java Web开发中三个重要的技术框架,它们分别在MVC(Model-View-Controller)架构、对象关系映射(ORM)以及远程脚本(Remote Scripting)方面发挥着关键作用。这个“房屋信息发布”项目...
struts1+spring+hibernate+dwr 项目 满意度调查struts1+spring+hibernate+dwr 项目 满意度调查struts1+spring+hibernate+dwr 项目 满意度调查struts1+spring+hibernate+dwr 项目 满意度调查
Struts2和Direct Web Remoting (DWR) 是两种在Web开发中常见的技术。Struts2是一个基于MVC设计模式的Java EE框架,用于构建可维护性和可扩展性高的企业级应用,而DWR则是一种使得JavaScript可以调用服务器端Java方法...
Struts2、Spring、Hibernate和DWR是Java Web开发中常用的四大框架,它们各自负责不同的功能,协同工作能构建出高效、灵活的企业级应用。在这个小实例中,开发者结合这四个框架来展示了一个完整的后端架构。 Struts2...
Struts2和DWR是两种在Web开发中广泛使用的开源框架,它们分别处理不同的层面,但可以协同工作以实现高效的应用程序开发。Struts2是一个强大的MVC(Model-View-Controller)框架,用于构建Java Web应用程序,而Direct...