Java海闊天空

          編程是我的生活,但生活不僅僅是編程。

          Struts2與DWR在項(xiàng)目中的共存解決方案

          1.struts2和dwr為什么會(huì)沖突?

          最近很多同學(xué)都在問(wèn)同樣一個(gè)問(wèn)題,struts2和dwr該如何共存?我們先分析一下為什么會(huì)出現(xiàn)沖突.

          struts2通過(guò)StrutsPrepareAndExecuteFilter過(guò)濾器來(lái)處理請(qǐng)求,常見(jiàn)的配置如下:

           <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>

          問(wèn)題就在這里,<url-pattern>/*</url-pattern>配置過(guò)濾了所有的請(qǐng)求,當(dāng)用戶(hù)提交的請(qǐng)求是/dwr/*時(shí),也同樣被StrutsPrepareAndExecuteFilter處理了,根本達(dá)不到DWR框架,這就是為什么二者不能共存的原因.


          2.通過(guò)struts2源碼發(fā)現(xiàn)問(wèn)題

          網(wǎng)上我沒(méi)找到問(wèn)題的解決方案,所以,只能通過(guò)閱讀源代碼來(lái)查找問(wèn)題的根源了.在StrutsPrepareAndExecuteFilter類(lèi)中,重寫(xiě)了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,則該請(qǐng)求不交給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參數(shù)是一個(gè)List集合, String uri = getUri(request);代碼獲取請(qǐng)求路徑,然后通過(guò)一個(gè)for循環(huán)將請(qǐng)求路徑與 excludedPatterns進(jìn)行匹(,注意,這里是通過(guò)正則表達(dá)式進(jìn)行匹配的),如果匹配成功,則返回true,否則返回false.

          那么, excludedPatterns的值從哪里來(lái)呢?下面的代碼是也:

              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;
                  }
              }

          看了上面的代碼,是不是豁然開(kāi)朗?原來(lái), StrutsConstants.STRUTS_ACTION_EXCLUDE_PATTERN常量保存了不由struts2處理的路徑,我們?cè)趕truts2.properties中配置即可.

          struts.action.excludePattern=/dwr/.*,/dwr/test/.*

          posted on 2010-01-27 17:57 李贊紅 閱讀(5280) 評(píng)論(5)  編輯  收藏

          評(píng)論

          # re: Struts2與DWR在項(xiàng)目中的共存解決方案 2010-01-28 10:59 /admin

          分析的不錯(cuò)  回復(fù)  更多評(píng)論   

          # re: Struts2與DWR在項(xiàng)目中的共存解決方案 2010-01-30 20:47 天堂露珠

          不錯(cuò)。  回復(fù)  更多評(píng)論   

          # re: Struts2與DWR在項(xiàng)目中的共存解決方案 2010-02-09 15:09 Ge,Kunjin

          恩,我看struts2官方就有相關(guān)的介紹,具體內(nèi)容可以看web.xml.html  回復(fù)  更多評(píng)論   

          # re: Struts2與DWR在項(xiàng)目中的共存解決方案 2010-02-09 15:14 Ge,Kunjin

          我正好也遇見(jiàn)相同的問(wèn)題,呵呵,謝謝lz  回復(fù)  更多評(píng)論   

          # re: Struts2與DWR在項(xiàng)目中的共存解決方案 2010-09-19 13:25 jumkey

          struts.action.extension=action
          用URL擴(kuò)展名來(lái)確定  回復(fù)  更多評(píng)論   


          只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          <2010年1月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          統(tǒng)計(jì)

          常用鏈接

          留言簿(12)

          隨筆檔案(28)

          相冊(cè)

          技術(shù)友情博客

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 金华市| 彭阳县| 辉县市| 彭泽县| 临沂市| 赞皇县| 微山县| 库尔勒市| 绥宁县| 调兵山市| 东源县| 特克斯县| 衢州市| 渝北区| 仁怀市| 油尖旺区| 平定县| 闸北区| 微山县| 平潭县| 桐城市| 岱山县| 杨浦区| 神池县| 中卫市| 高陵县| 浠水县| 长岛县| 定陶县| 固安县| 罗平县| 监利县| 永年县| 绥江县| 缙云县| 桂平市| 城步| 武夷山市| 天水市| 罗田县| 长顺县|