`
zyc1006
  • 浏览: 133831 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

又一篇讲Struts2和dwr共存的文章

 
阅读更多

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-core-2.1.8.1.jar, org.apache.struts2/default.properties中,也可以通过修改struts.xml,在struts标签中加入<constant name="struts.action.excludePattern" value="/dwr.*"></constant>来实现。

 

分享到:
评论

相关推荐

    struts2与dwr整合实例

    Struts2和DWR(Direct Web Remoting)的整合是Web开发中的一种常见技术组合,它们可以帮助开发者构建高效、交互性强的Web应用。Struts2作为MVC框架,提供了强大的控制层支持,而DWR则允许JavaScript在浏览器端直接...

    Struts2_Dwr.rar_Struts2_Dwr_dwr_struts2 dwr

    Struts2和Direct Web Remoting (DWR)是两种在Web开发中常用的技术,它们分别在MVC(Model-View-Controller)框架和Ajax交互方面发挥重要作用。在本项目"Struts2_Dwr"中,我们将看到如何整合这两个工具来实现一个登录...

    Struts2+DWR的简单实现

    Struts2是一个基于MVC设计模式的Java EE框架,用于构建可维护性和可扩展性高的企业级应用程序,而DWR则是一种使得JavaScript可以调用服务器端Java方法的库,实现了AJAX的异步通信。下面我们将深入探讨这两个技术以及...

    struts2+dwr整合例子,部署后可直接用

    总的来说,这个"struts2+dwr整合例子"是一个实用的学习资源,可以帮助开发者理解和掌握这两项技术的协同工作,从而在开发过程中提高效率和用户体验。通过实际操作和研究这个例子,开发者可以更好地理解Struts2的控制...

    struts2-dwr-plugin-2.2.3.jar

    struts2与dwr结合的工具之一,这个是新从官方网站下载的,与大家分享,希望对你们有效。

    struts2与dwr2结合

    Struts2和DWR2是两个在Web开发中常用的开源框架,它们分别处理不同的层面:Struts2专注于MVC(模型-视图-控制器)架构的实现,而DWR(Direct Web Remoting)则用于在浏览器和服务器之间实现异步的JavaScript到Java的...

    Struts2.0+dwr的分页

    Struts2.0和DWR(Direct Web Remoting)是两个在Web开发中广泛使用的开源框架,它们分别在MVC(Model-View-Controller)架构和远程方法调用上发挥着重要作用。Struts2.0作为Java EE平台上的一个强大MVC框架,提供了...

    dwr与struts2

    **DWR** 和 **Dojo** 的结合使得Struts2的Ajax功能更加完善。具体来说: 1. **DWR** 负责实现从JavaScript中调用远程Java方法的功能。 2. **Dojo** 负责实现页面效果的显示,如动态加载数据、页面元素的更新等。 #...

    Struts2与DWR在项目中的共存解决方案

    Struts2与DWR在项目中的共存解决方案,通过此配置,可以解决struts2和DWR之间的冲突问题,很管用的!可以试试

    spring struts2 hibernate dwr

    **Spring、Struts2、Hibernate和DWR框架整合详解** 在现代Web开发中,整合不同的框架可以提升应用程序的效率和可维护性。Spring、Struts2、Hibernate和Direct Web Remoting (DWR) 是四种非常流行的Java开源框架,...

    基于struts2和DWR的Ajax输入校验实例

    Struts2和DWR(Direct Web Remoting)的结合应用为Web开发提供了强大的Ajax功能,尤其是在数据验证方面。Ajax技术允许在不刷新整个页面的情况下与服务器进行交互,从而提升了用户体验。接下来,我们将深入探讨这两个...

    struts2+dwr 整合实例

    下载放到Myeclips里就可以运行、里面包含struts2环境搭建(点击按钮)、struts2+dwr整合(在文本框中输入值后会访问后台,给select动态增加option赋值、点击按钮又会显示会select被选中的option的value和text值)、...

    struts2 dwr ajax 配置 局部刷新

    Struts2、DWR(Direct Web Remoting)和Ajax是Web开发中的关键技术,它们结合使用可以实现页面的局部刷新,提高用户体验。Struts2是一个基于MVC设计模式的Java Web框架,DWR则是一个用于简化AJAX开发的库,允许前端...

    dwr.rar_ajax d_dwr_dwr ajax_dwr struts2 example_struts2 ajax dwr

    在这个“dwr.rar”压缩包中,包含了一些关于DWR与Struts2框架整合使用的示例,对于学习和理解DWR在实际项目中的应用非常有帮助。 DWR的核心功能在于它提供了一种安全、高效的机制,使得前端JavaScript可以直接调用...

    struts2+dwr整合实例

    Struts2是一个基于MVC设计模式的Java EE框架,用于构建可维护性和可扩展性高的企业级应用,而DWR则是一种使得JavaScript可以调用服务器端Java方法的库,实现了AJAX(异步JavaScript和XML)的功能,提供了更丰富的...

    dwr和spring和struts2整合

    在IT行业中,Web应用程序开发是核心领域之一,而Spring、Struts2和Direct Web Remoting (DWR) 是其中常见的三大框架。它们分别扮演着不同的角色,以提高开发效率和提供更好的用户体验。本文将深入探讨如何将这三者...

    struts2+dwr+自己实现的progresslistener监控上传进度

    Struts2是一个强大的MVC(Model-View-Controller)框架,用于构建Java Web应用程序,而Direct Web Remoting (DWR) 是一个JavaScript库,它使得在浏览器和服务器之间进行异步通信变得简单,类似于Ajax技术。...

    DWR与SPRING,DWR与STRUTS2的整合

    提供的文档“dwr与spring.doc”和“dwr与struts2.doc”可能详细阐述了整合过程和最佳实践,而“一个小例子.txt”可能包含了一个实际整合示例,帮助读者更好地理解整合步骤和实现方式。学习并掌握这些知识对于提升...

    struts2+spring+hibernate+dwr

    Struts2、Spring、Hibernate和DWR是Java Web开发中常用的四大框架,它们各自负责不同的功能,协同工作能构建出高效、灵活的企业级应用。在这个小实例中,开发者结合这四个框架来展示了一个完整的后端架构。 Struts2...

    struts增删改+dwr消息推送

    Struts2和DWR是两种在Java Web开发中常见的开源框架。Struts2是一个用于构建MVC(模型-视图-控制器)架构的框架,它提供了丰富的功能来处理用户请求,控制应用程序流程,并且能够方便地与各种视图技术集成。DWR...

Global site tag (gtag.js) - Google Analytics