<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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)用戶提交的請(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 李贊紅 閱讀(5277) 評(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è)用戶登錄后才能發(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)論排行榜

    主站蜘蛛池模板: 亚洲国产精品免费视频| 黑人粗长大战亚洲女2021国产精品成人免费视频| 青娱乐免费视频在线观看| 亚洲精品乱码久久久久久| 国产精品成人免费福利| 国产亚洲精品精品精品| 亚洲精品天天影视综合网| 超pen个人视频国产免费观看| 亚洲精品视频免费 | 亚洲Av无码专区国产乱码DVD| 免费国产a理论片| 亚洲综合日韩中文字幕v在线| 日本不卡视频免费| 亚洲av无码专区在线电影| 亚洲开心婷婷中文字幕| 最新仑乱免费视频| 国产精品网站在线观看免费传媒| 亚洲熟女综合一区二区三区| 中文字幕av无码无卡免费| 亚洲第一成人在线| 国产美女被遭强高潮免费网站| 在线观看亚洲视频| 亚洲精品视频观看| 亚洲日韩欧洲乱码AV夜夜摸 | 亚洲国产精品久久久久网站| 国产精品无码素人福利免费| 无码精品一区二区三区免费视频| 美女被艹免费视频| 亚洲大香人伊一本线| 亚洲精品自产拍在线观看| 在线观看免费精品国产| 成人无码区免费A片视频WWW| APP在线免费观看视频| 一级女性全黄久久生活片免费 | 久久久久亚洲精品无码网址色欲| 亚洲图片中文字幕| 亚洲精品免费在线观看| 久久精品国产亚洲麻豆| 成人免费AA片在线观看| 无码国产精品一区二区免费16 | 中文字幕在线观看免费|