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

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

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

    stone2083

    Struts2.1.6--想用通配符,不容易

    初次使用Struts2,老老實(shí)實(shí)為每個(gè)action method配置url mapping文件。
    時(shí)間長(zhǎng)了,難為覺(jué)得繁瑣,為何不使用COC的方式呢?終于,想到了使用通配符。
    查看Struts2 Docs,找到相關(guān)配置方法:

    <package name="alliance" namespace="/alliance" extends="struts-default">
            
    <action name="*/*" class="cn.zeroall.cow.web.alliance.action.{1}Action" method="{2}">
                
    <result name="target" type="velocity">/templates/alliance/{1}/${target}.vm</result>
                
    <result name="success" type="velocity">/templates/alliance/{1}/{2}.vm</result>
                
    <result name="input" type="velocity">/templates/alliance/{1}/{2}.vm</result>
                
    <result name="fail" type="velocity">/templates/common/error.vm</result>
            
    </action>
    </package>

    恩,非常方便,可是啟動(dòng)jetty,發(fā)現(xiàn)滿(mǎn)足正則的url,就是找不到Action。
    無(wú)奈,debug代碼,找到原因,需要在struts.properties中,配置:
    struts.enable.SlashesInActionNames = true
    見(jiàn)注釋?zhuān)?br />
    ### Set this to true if you wish to allow slashes in your action names.  If false,
    ### Actions names cannot have slashes, and will be accessible via any directory
    ### prefix.  This is the traditional behavior expected of WebWork applications.
    ### Setting to true is useful when you want to use wildcards and store values
    ### in the URL, to be extracted by wildcard patterns, such as 
    ### 
    <action name="*/*" method="{2}" class="actions.{1}"> to match "/foo/edit" or 
    ### "/foo/save".

    啟動(dòng),COC終于成功。

    但是(又冒出一個(gè)但是),針對(duì)*/*正則的url mapping,如何做validation呢?
    按照struts2的約定,是通過(guò):
    [package/]ActionName-${配置中的action name=""中的名字}-validation.xml

    如何把"/"這個(gè)符號(hào)放入到${配置中的action name=""中的名字}呢?
    "/"可不是一個(gè)合法的文件名。

    比如,我要為AlliedMemberAction/doRegister做validation,那么約定的校驗(yàn)文件名應(yīng)該是:
    cn/zeroall/cow/web/alliance/action/AlliedMemberAction-AlliedMember/doRegister-validation.xml
    這個(gè)特殊符號(hào),可難剎我也。

    無(wú)奈,繼續(xù)debug,發(fā)現(xiàn)在代碼:
    xwork框架中的,AnnotationActionValidatorManager:
    private  List<ValidatorConfig> buildAliasValidatorConfigs(Class aClass, String context, boolean checkFile) {
            String fileName = aClass.getName().replace('.', '/') + "-" + context + VALIDATION_CONFIG_SUFFIX;

            return loadFile(fileName, aClass, checkFile);
    }
    這個(gè)context就是action name=""中的url表達(dá)式。

    思想斗爭(zhēng)后,由于我不喜歡使用*-*的pattern,更喜歡使用*/*pattern,只好修改了源碼:
    private  List<ValidatorConfig> buildAliasValidatorConfigs(Class aClass, String context, boolean checkFile) {
            String fileName = aClass.getName().replace('.', '/') + "-" + context.replace("/", "-") + VALIDATION_CONFIG_SUFFIX;

            return loadFile(fileName, aClass, checkFile);
    }
    將context中的“/”變成"-"解決這個(gè)問(wèn)題。

    不清楚struts2官方怎么看待這個(gè)問(wèn)題。

    大家是否有更好的方案,請(qǐng)指教


    posted on 2009-09-26 14:06 stone2083 閱讀(3651) 評(píng)論(5)  編輯  收藏 所屬分類(lèi): java

    Feedback

    # re: Struts2.1.6--想用通配符,不容易 2009-09-27 10:16 梁章坪

    struts2的聲明式驗(yàn)證的格式不是ActionName--validation.xml嗎?
    為什么在中間要加-${配置中的action name=""中的名字}?
    小弟剛剛接觸struts2。  回復(fù)  更多評(píng)論   

    # re: Struts2.1.6--想用通配符,不容易 2009-09-27 12:39 stone2083

    @梁章坪
    沒(méi)錯(cuò),最正宗的格式是ActionName--validation.xml。
    請(qǐng)看,AnnotationActionValidatorManager中的buildValidatorConfigs方法片段:
    validatorConfigs.addAll(buildClassValidatorConfigs(clazz, checkFile));
    在buildClassValidatorConfigs方法中,
    String fileName = aClass.getName().replace('.', '/') + VALIDATION_CONFIG_SUFFIX;
    就是你說(shuō)的ActionName--validation.xml格式。
    在一個(gè)Action只有一個(gè)方法(execute)的時(shí)候,這樣是夠用的。

    但是Struts2為了支持一個(gè)Action有多個(gè)方法(CRUD)的時(shí)候,那么怎么為不同的方法尋找它需要的校驗(yàn)文件呢?
    于是乎,繼續(xù)看AnnotationActionValidatorManager中的buildValidatorConfigs方法片段:
    if (context != null) {
    validatorConfigs.addAll(buildAliasValidatorConfigs(clazz, context, checkFile));
    }
    將Action名和context做組合,作為校驗(yàn)文件的別名(alias)。

    至于context是什么?我一開(kāi)始以為是method名,結(jié)果看了代碼,發(fā)現(xiàn)不是。struts2是傳了${配置中的action name=""}中的名字
    看來(lái)它的本意是希望同一個(gè)action的方法,在不同使用場(chǎng)景下,也允許不同的校驗(yàn)規(guī)則。

    所以就有了這樣的格式定義。 :)




      回復(fù)  更多評(píng)論   

    # re: Struts2.1.6--想用通配符,不容易[未登錄](méi) 2009-09-27 17:52 Simon

    通配符的缺陷也擺在那里

    你怎么為action配置攔截器?


    用那個(gè)插件?annotation,你越往里鉆越會(huì)發(fā)現(xiàn)問(wèn)題多多。

    還是老老實(shí)實(shí)用XML一個(gè)個(gè)配吧。  回復(fù)  更多評(píng)論   

    # re: Struts2.1.6--想用通配符,不容易 2009-09-27 19:09 stone2083

    @Simon
    沒(méi)有放之四海而皆準(zhǔn)的技術(shù),任何技術(shù),總是有利弊的,關(guān)鍵是看怎么權(quán)衡了。
    用通配符也好,zero config plugin也好,都可以,我只有一個(gè)要求,就是COC。
    做為程序員,封裝變化,抽取共性,減少一切可以減少的重復(fù)勞動(dòng)力。

    在我看來(lái),一個(gè)一個(gè)配置action,就是重復(fù)勞動(dòng)力。至少在80%的場(chǎng)景下,配置都是差不多的。
    試想一下,當(dāng)一個(gè)應(yīng)用,有上千個(gè)action時(shí),光是action的配置文件,就是幾千甚至上萬(wàn)行。這個(gè)維護(hù)工作量,不敢想象。

    至于攔截器,同理,我以為,80%的情況下,action配置的攔截器都是同樣的。所以就算使用通配符,我可以用其他的方案解決特殊(20%)的需求。

    Annotation,額,這個(gè)玩意,我不敢濫用。只有20%的需求才有的特殊需求場(chǎng)景下,我還會(huì)考慮(僅僅是考慮)使用Annotation。
    Struts2中,Action上的annotation設(shè)計(jì),我一直不敢恭維。所以我絕對(duì)不會(huì)使用annotation的。
    其實(shí)從我原文中,一直在描述如何尋找Validatior文件的方法,沒(méi)有說(shuō)我用了annotaion。在很多場(chǎng)景下,我一直是xml的擁護(hù)者,當(dāng)然最擁護(hù)的,是Convertion。 :)  回復(fù)  更多評(píng)論   

    # re: Struts2.1.6--想用通配符,不容易 2009-09-27 19:44 stone2083

    剛?cè)truts官方網(wǎng)站溜達(dá)了下:
    http://issues.apache.org/struts/browse/WW-3024

    已經(jīng)有人提交了bug,在struts2.1.8中,修復(fù)。

    查看了xwork trunk的代碼,發(fā)現(xiàn)修復(fù)方式,跟我原文的一樣。先這么用一段時(shí)間吧。 :)

    trunk代碼:
    http://svn.opensymphony.com/svn/xwork/trunk/core/src/main/java/com/opensymphony/xwork2/validator/AnnotationActionValidatorManager.java  回復(fù)  更多評(píng)論   

    主站蜘蛛池模板: 国内精品久久久久影院亚洲 | 亚洲综合精品一二三区在线| 18禁男女爽爽爽午夜网站免费| 亚洲国产精品综合久久20| 免费jlzzjlzz在线播放视频| 久久九九全国免费| 亚洲乱码在线观看| 国产午夜亚洲精品午夜鲁丝片| 18禁止观看免费私人影院| 99亚洲乱人伦aⅴ精品| 亚洲AV区无码字幕中文色| 男女啪啪永久免费观看网站| 最近免费中文字幕MV在线视频3| 亚洲中文字幕日本无线码| 亚洲精品无码鲁网中文电影| 性色av无码免费一区二区三区| 国产精品美女久久久免费| 亚洲一卡2卡3卡4卡乱码 在线| 中文字幕在亚洲第一在线| 国产一卡2卡3卡4卡无卡免费视频| 免费高清A级毛片在线播放| 亚洲av永久无码精品天堂久久| 国产AV无码专区亚洲AWWW| 免费一本色道久久一区| 国产一区二区免费| 特级毛片全部免费播放| 亚洲综合国产成人丁香五月激情| 亚洲国产另类久久久精品黑人| 国产成人免费网站在线观看| 黄网站色在线视频免费观看| 你是我的城池营垒免费观看完整版| 亚洲国产区男人本色| 亚洲伊人久久大香线蕉在观| 亚洲狠狠婷婷综合久久久久| 亚洲色偷拍区另类无码专区| 日韩成人免费在线| 成人爽A毛片免费看| 可以免费看黄视频的网站| 中国人xxxxx69免费视频| 91精品全国免费观看青青| 日韩在线观看免费|