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

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

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

    WebWork2.2新特性(七):異常映射/全局異常映射

    在xwork中,package的定義中增加了global-exception-mappings,action的定義中增加了exception-mapping,要想使用這2個(gè)特性,必須使用xwork-1.1.dtd才行.

    DTD中,global-exception-mappings是這樣定義的,

    <ELEMENT global-exception-mappings (exception-mapping+)>

    也就是說如果要使用,至少包含一個(gè)異常映射.

    exception-mapping的定義如下:

    <!ELEMENT exception-mapping (#PCDATA|param)*>
    <!ATTLIST exception-mapping
        name CDATA #IMPLIED
        exception CDATA #REQUIRED
        result CDATA #REQUIRED
    >  


    可以看到有3個(gè)屬性:名稱,異常類型,和結(jié)果.


    經(jīng)過一番查看,發(fā)現(xiàn)xwork-default.xml中還沒有定義相關(guān)的攔截器,搜索了一下,發(fā)現(xiàn)了ExceptionMappingInterceptor,看來它是把異常翻譯為相應(yīng)的結(jié)果的.
    (在最后發(fā)行版本中,應(yīng)該會(huì)定義的.目前只好我們自己定義了.)

    首先我們虛擬一個(gè)程序,假設(shè)程序會(huì)拋出幾種程序

    Action定義如下:

    package com.jscud.ww2test.exceptionmap;
     
     import com.opensymphony.xwork.ActionSupport;
     
     /**
      * @author scud http://www.jscud.com
      *
      */
     public class ExpMappingAction extends ActionSupport
     {
         private int type;
     
         public String execute() throws NoRightException,NotFoundException
         {
             if(type==1)
             {
                 throw new NoRightException();
             }
             else if(type ==99)
             {
                 throw new NotFoundException();
             }
             else if(type==60) //其他異常
             {
                 throw new IllegalArgumentException();
             }
            
             return SUCCESS;
         }
        
         public int getType()
         {
             return type;
         }
        
         public void setType(int type)
         {
             this.type = type;
         }
     } 

     從Action可以看出,程序至少會(huì)拋出3種異常,我們?nèi)绻褂卯惓S成?就要考慮到拋出的所有異常.

    程序中用到的NoRightException,NotFoundException是為了演示而建立的2個(gè)簡(jiǎn)單異常,無任何特殊代碼,繼承自Exception.

    我們的Xwork.xml中的定義如下:

     <package name="exceptionmapping" extends="webwork-default" namespace="/exceptionmap">
     
      
    <interceptors>
       
    <interceptor name="exceptionmapping" class="com.opensymphony.xwork.interceptor.ExceptionMappingInterceptor"/>
       
       
    <interceptor-stack name="myDefaultStack">
           
    <interceptor-ref name="defaultStack"/>
           
    <interceptor-ref name="exceptionmapping"/>
       
    </interceptor-stack>
      
    </interceptors>

      
    <default-interceptor-ref name="myDefaultStack"/>


      
    <global-results>
       
    <result name="noright" type="dispatcher">
        
    <param name="location">/exceptionmap/noright.jsp</param>
       
    </result>
       
    <result name="exception" type="dispatcher">
        
    <param name="location">/exceptionmap/exception.jsp</param>
       
    </result>
      
    </global-results>
     
      
    <global-exception-mappings>
       
    <exception-mapping name="noright" exception="com.jscud.ww2test.exceptionmap.NoRightException" result="noright"/>
       
    <exception-mapping name="exception" exception="java.lang.Exception" result="exception"/>
      
    </global-exception-mappings>
     
      
    <action name="index" class="com.jscud.ww2test.exceptionmap.ExpMappingAction">
       
    <exception-mapping  name="notfound" exception="com.jscud.ww2test.exceptionmap.NotFoundException" result="notfound"/>
       
    <result name="success" type="dispatcher">
        
    <param name="location">/exceptionmap/index.jsp</param>
       
    </result>
       
    <result name="notfound" type="dispatcher">
        
    <param name="location">/exceptionmap/notfound.jsp</param>
       
    </result>
      
    </action>
      
     
    </package>
     



    首先定義了一個(gè)exceptionmapping攔截器,用來指向ExceptionMappingInterceptor.
    然后定義一個(gè)攔截器Stack,包含defaultStack和exceptionmapping,注意,exceptionmapping是在Stack的最后面,否則會(huì)發(fā)生不可預(yù)期的結(jié)果.

    可以看到global-exception-mappings段包含了2個(gè)異常映射,一個(gè)為NoRight的處理,另外一個(gè)為對(duì)應(yīng)java.lang.Exception的映射.

    在Action的定義中包含了一個(gè)exception-mapping,對(duì)應(yīng)NotFound異常.

    沒有看到IllegalArgumentException的對(duì)應(yīng)結(jié)果?? 攔截器對(duì)沒有定義的異常會(huì)依次找這個(gè)異常的父類,一級(jí)一級(jí)向上查找,例如IllegalArgumentException的最終父節(jié)點(diǎn)是Exception,就會(huì)轉(zhuǎn)向到Exception對(duì)應(yīng)的結(jié)果. 如果一個(gè)異常有多個(gè)層次關(guān)系上的父類,那個(gè)關(guān)系最近就找誰.

    演示頁面如下:

     <%@ page contentType="text/html; charset=GBK" %>
     
    <%@ taglib uri="webwork" prefix="ww" %>
     
    <html>
       
    <head>
         
    <title>exception mapping</title>
       
    </head>
     
    <body>
     
     
    <br>
     Exception 1:
     
    <href="index.jspa?type=1">Exception 1</a>
     
    <br><br>
     
     Exception 99:
     
    <href="index.jspa?type=99">Exception 99</a>
     
    <br><br>
     
     Other Exception:
     
     
    <href="index.jspa?type=60">Exception 60</a>
     
    <br><br>
     
     Normal:
     
    <href="index.jspa">No Exception</a>
     
    <br><br>
     
     
    </body>
     
    </html> 



     notfound.jsp,exception.jsp,noright.jsp是三個(gè)最簡(jiǎn)單的jsp頁面,自己編寫即可.

    運(yùn)行程序,發(fā)現(xiàn)根據(jù)異常類型會(huì)轉(zhuǎn)向相應(yīng)的異常頁面.

    如果你自己的程序中的異常沒有在異常映射中得到對(duì)應(yīng)的result,程序會(huì)拋出異常,所以應(yīng)該定義一個(gè)Exception的對(duì)應(yīng)result.

     

     

     

    除經(jīng)特別注明外,本文章版權(quán)歸JScud Develop團(tuán)隊(duì)或其原作者所有.
    轉(zhuǎn)載請(qǐng)注明作者和來源.  scud(飛云小俠)  歡迎訪問 JScud Develop


    posted on 2005-09-05 12:21 Scud(飛云小俠) 閱讀(2794) 評(píng)論(18)  編輯  收藏 所屬分類: WEB

    評(píng)論

    # re: WebWork2.2新特性(七):異常映射/全局異常映射 2005-09-05 12:36 scud

    編輯器好像有問題....  回復(fù)  更多評(píng)論   

    # re: WebWork2.2新特性(七):異常映射/全局異常映射 2005-09-06 08:53 冰云

    Cool! I love your blog. 你在北京嗎? 聯(lián)系一下,交個(gè)朋友? icecloud@sina.com  回復(fù)  更多評(píng)論   

    # re: WebWork2.2新特性(七):異常映射/全局異常映射 2005-09-06 08:53 冰云

    那是我MSN,嘿嘿  回復(fù)  更多評(píng)論   

    # re: WebWork2.2新特性(七):異常映射/全局異常映射 2005-09-06 10:52 scud

    哦,冰云啊,早知道你了

    我在北京,不過俺在公司就不能用msn...  回復(fù)  更多評(píng)論   

    # re: WebWork2.2新特性(七):異常映射/全局異常映射 2005-09-15 16:28 白衣

    這么說QQ也不能用啦,還想把你拉進(jìn)群里。  回復(fù)  更多評(píng)論   

    # re: WebWork2.2新特性(七):異常映射/全局異常映射 2005-09-15 16:31 scud

    目前還可以用google talk,呵呵,帳號(hào)就是我的gmail地址.

    太多人聊天,所以封了msn,qq.  回復(fù)  更多評(píng)論   

    # re: WebWork2.2新特性(七):異常映射/全局異常映射 2005-11-26 14:31 筆名

    飛云...你不要誤人子弟了.....你這些.自己過沒有...!!!!明顯的錯(cuò)誤在那里...我靠....沒有實(shí)踐..你就不要害人.....  回復(fù)  更多評(píng)論   

    # re: WebWork2.2新特性(七):異常映射/全局異常映射 2005-11-26 14:47 scud(飛云小俠)

    什么錯(cuò)誤?請(qǐng)指出

    這些代碼都是當(dāng)時(shí)我自己親自寫的,當(dāng)然可以運(yùn)行

    當(dāng)然,現(xiàn)在能不能運(yùn)行我不能保證.

    我想說的是:你運(yùn)行了嗎?



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

    # re: WebWork2.2新特性(七):異常映射/全局異常映射 2005-11-28 08:32 筆名

    我所說的錯(cuò)誤在是在這里.而是在你最的對(duì)spring的結(jié)合上..引用你原文"
    ****************************
    使用Spring初始化Action
    一般來說,你在xwork.xml里面為每個(gè)Action指定類. 這意味著WebWork首先會(huì)創(chuàng)建這個(gè)Action,然后按照指定的缺省的自動(dòng)裝配策略來設(shè)定依賴的屬性.


    一般來說,你在xwork.xml里面為每個(gè)Action指定類.當(dāng)使用SpringObjectFactory的時(shí)候(如果按照上面的方法配置了), 這意味著WebWork會(huì)首先請(qǐng)求Spring創(chuàng)建這個(gè)Action并按照缺省的自動(dòng)裝配策略設(shè)定依賴的屬性.SpringObjectFactory還會(huì)調(diào)用所有bean的處理器來處理事務(wù),安全等方面的代理機(jī)制.不需要特殊的設(shè)置Spring就可以自動(dòng)確定.對(duì)大多數(shù)的應(yīng)用,這會(huì)配置你的Action所需的服務(wù)和依賴,來達(dá)到你的所有要求.

    我們強(qiáng)烈推薦你找到一種聲明的方法來讓spring知道該為你的Action提供什么.這包括把你的Action里的屬性命名為在Spring配子文件里定義的Bean的名字一致,這樣可以實(shí)現(xiàn)基于名字的自動(dòng)裝配,還可以使用JDK5的標(biāo)注來聲明事務(wù)和安全層需要.如果你能找到方法讓Spring知道你的Action需要什么而且不需要在applicationContext.xml里面進(jìn)行外部配置的話,你就不需要在2個(gè)地方維護(hù)配置了.



    然而,有時(shí)你可能想要Spring來完全管理Bean.這是有實(shí)際意義的,例如,你如果想對(duì)你的Bean使用AOP或者Spring的相關(guān)技術(shù),例如Acegi.為了達(dá)到這個(gè)目的,你僅僅要做的就是在xwork.xml里移除你的WebWork Action的類的屬性,然后在applicationContext.xml里面增加一個(gè)Bean.

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans default-autowire="autodetect">
    <bean id="foo" class="com.acme.Foo"/>
    <bean id="bar" class="com.acme.Foo"/>
    </beans>


    你的xwork.xml文件里面的action應(yīng)該這樣定義:

    <!DOCTYPE xwork PUBLIC "-//OpenSymphony Group//XWork 1.0//EN" "http://www.opensymphony.com/xwork/xwork-1.1.dtd">
    <xwork>
    <include file="webwork-default.xml"/>
    <package name="default" extends="webwork-default">
    <action name="foo">
    <result>foo.ftl</result>
    </action>
    </package>
    <package name="secure" namespace="/secure" extends="default">
    <action name="bar">
    <result>bar.ftl</result>
    </action>
    </package>
    </xwork>

    記住:這個(gè)不是必須的.僅僅當(dāng)你需要使用Spring的攔截器或者IoC來修飾Action以便覆蓋Webwork的缺省行為時(shí),這才是必要的.要記住一點(diǎn),WebWork的Spring組合會(huì)執(zhí)行標(biāo)準(zhǔn)的IoC,使用你指定的自動(dòng)裝配策略,即使你沒有明確第在Spring中映射每個(gè)Action.所以通常你不需要做這個(gè),但是知道這個(gè)命名習(xí)慣對(duì)你是有好處的,如果你需要的話.

    "
    ***************************
    上文和原英文版有什么區(qū)別么....你在那里加了一段自己的
    ******************
    然后在applicationContext.xml里面增加一個(gè)Bean.

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
    <beans default-autowire="autodetect">
    <bean id="foo" class="com.acme.Foo"/>
    <bean id="bar" class="com.acme.Foo"/>
    </beans>
    ******************
    事實(shí)證明.這是錯(cuò)的...
    我重新配了一下.發(fā)現(xiàn)是你對(duì)這段英文的理解有誤!!
    但我很敬重你能給大家說這么多...
    我上篇文章.對(duì)你的誤會(huì)太深...請(qǐng)?jiān)?
    愿我們都能為開源發(fā)一份熱....
    哦,還有個(gè)問題.在對(duì)新引進(jìn)的ajax中...我在webwork1.17里的做法是...在action中實(shí)現(xiàn)ajax的result結(jié)后...然后在返回頁面指定(接受返回內(nèi)容的div的)ID.就是實(shí)現(xiàn)現(xiàn)在新的ajax功能...那樣做很煩!!!.
    但在你新的對(duì)ajax的說明中...你說在標(biāo)簽中可以得到action中的內(nèi)容.而action中內(nèi)容那么多..要怎么返回想要的呢....是在action中指明該標(biāo)簽要得到的返回內(nèi)容.還是..還有另的方法可以直接用呢?請(qǐng)指明!
    最后...我向前天我的行為深表欠意!!!
      回復(fù)  更多評(píng)論   

    # re: WebWork2.2新特性(七):異常映射/全局異常映射 2005-11-28 10:47 scud(飛云小俠)

    關(guān)于spring的結(jié)合 ,有可能現(xiàn)在是錯(cuò)誤的了,不過我沒有在試.

    因?yàn)槲覍懩莻€(gè)文章的時(shí)候,還是beta1 or beta2,而在后來spring的結(jié)合有了很大變化,那篇英文文檔也有多次修改,現(xiàn)在是什么樣子我都不知道了.

    有時(shí)間我在仔細(xì)看看.

    關(guān)于ajax,其中一個(gè)是可以通過表單提交,submit的resultDivid指明目標(biāo)div即可.  回復(fù)  更多評(píng)論   

    # re: WebWork2.2新特性(七):異常映射/全局異常映射 2005-11-28 12:11 筆名

    關(guān)于ajax里...通過表單提交的.我試過.
    但在另一種情況下.如你例子里頁面打開后五秒執(zhí)行ajaxTest.action然后將返回內(nèi)容填至此div.我想請(qǐng)教.
    此時(shí)aciton返回的是什么...因?yàn)槲易龅?就是返回一個(gè)success.然后在xwork中指定返回頁面...
    因?yàn)槲覀円郧白龅氖撬衋ction繼承com.opensymphony.xwork.ActionSupport;并實(shí)現(xiàn)com.opensymphony.xwork.Action接口.返回的就那幾種success;input.等;而從我們以前在webwork1.17版時(shí).我們實(shí)現(xiàn)了一個(gè)ajaxAction接口用來指定返回targetID及返回的內(nèi)容.
    還有.如果在頁面直接引用dojo.event.topic.publish( "scud1", "alert(’test’);" );會(huì)報(bào)錯(cuò)說.找不到dojo對(duì)像..我在該頁面里己加入了你的commonInclude.jsp..那還需要什么??  回復(fù)  更多評(píng)論   

    # re: WebWork2.2新特性(七):異常映射/全局異常映射 2005-11-28 12:21 scud(飛云小俠)

    1.action返回的內(nèi)容和普通action是一樣的,可以返回任何內(nèi)容

    a標(biāo)簽返回的一般都是javascript,不能是普通內(nèi)容,否則好像沒有什么效果
    div返回的內(nèi)容會(huì)更新自己本身

    目前只有表單方式可以把返回的內(nèi)容傳給另外一個(gè)div

    2.dojo是webwork2.2的fliter提供的一些靜態(tài)內(nèi)容服務(wù)中包含的
    和webwork 2.1.7的工作方式是不同的
    你可以考慮把那些static目錄下內(nèi)容復(fù)制一份放到你的程序的/webwork目錄下

    最好你用2.2試驗(yàn)一下,看看頁面生成中包含了那些文件...

    可能還有很多其他地方需要改吧

    看看webwork2.2的靜態(tài)文件服務(wù)方式把,在com\opensymphony\webwork\static包下面.
    我沒有具體研究過.
      回復(fù)  更多評(píng)論   

    # re: WebWork2.2新特性(七):異常映射/全局異常映射 2005-11-28 12:36 筆名

    謝謝小俠提供!
    我再去試試.  回復(fù)  更多評(píng)論   

    # re: WebWork2.2新特性(七):異常映射/全局異常映射 2005-11-28 15:31 筆名

    大部分.我都己試過.都通過.
    感謝飛云提供!...
    再次為我的魯莽而深表欠意....
      回復(fù)  更多評(píng)論   

    # re: WebWork2.2新特性(七):異常映射/全局異常映射 2006-01-25 11:58 差沙

    弱弱的說一句,現(xiàn)在最新的ww2.2好像不用自己配制了,defaultStack里面已經(jīng)有了,而且exception攔截器應(yīng)該放在最上面才對(duì),不應(yīng)該在最下面。  回復(fù)  更多評(píng)論   

    # re: WebWork2.2新特性(七):異常映射/全局異常映射 2006-03-06 00:09 憲哥

    我的問題是,這個(gè)異常信息有沒有存在什么stack上,
    比如我后來的轉(zhuǎn)向是一個(gè)action.那么他有無辦法獲知?jiǎng)偛虐l(fā)生的異常是什么?  回復(fù)  更多評(píng)論   

    # re: WebWork2.2新特性(七):異常映射/全局異常映射 2006-03-06 00:38 scud(飛云小俠)

    你可以看一下這個(gè)攔截器的源碼,它放到了stack里面一個(gè)exceptionHolder

    但是顯然,沒有太方便的方法來獲取它, 不過stack的第一個(gè)元素一般就是它。  回復(fù)  更多評(píng)論   

    # re: WebWork2.2新特性(七):異常映射/全局異常映射 2006-03-06 13:48 憲哥

    謝謝,異常可以如下方式獲取:
    OgnlValueStack s = ActionContext.getContext().getValueStack();
    Object obj = s.pop();
    System.out.println(obj.getClass().getName());
    obj = s.pop();
    System.out.println(obj.getClass().getName());

    BTW:如果是以chain的方式轉(zhuǎn)向于此action,則要注意第二個(gè)元素才是ExceptionHolder
      回復(fù)  更多評(píng)論   

    <2005年9月>
    28293031123
    45678910
    11121314151617
    18192021222324
    2526272829301
    2345678

    導(dǎo)航

    統(tǒng)計(jì)

    公告

    文章發(fā)布許可
    創(chuàng)造共用協(xié)議:署名,非商業(yè),保持一致

    我的郵件
    cnscud # gmail


    常用鏈接

    留言簿(15)

    隨筆分類(113)

    隨筆檔案(103)

    相冊(cè)

    友情鏈接

    技術(shù)網(wǎng)站

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 在线观看片免费人成视频播放| 亚洲国产午夜精品理论片| 亚洲av午夜精品一区二区三区| 最新猫咪www免费人成| 免费看污成人午夜网站| 免费在线观看h片| 久久WWW免费人成一看片| 在线日本高清免费不卡| 2021国内精品久久久久精免费| 久久精品一区二区免费看| 久久久久久AV无码免费网站下载| 久久久精品免费视频| 免费无码中文字幕A级毛片| 日韩在线不卡免费视频一区| 曰批全过程免费视频播放网站 | 综合自拍亚洲综合图不卡区| 亚洲人成网站影音先锋播放| 中文字幕亚洲色图| 亚洲狠狠狠一区二区三区| 亚洲喷奶水中文字幕电影| 亚洲日韩一区精品射精| 美女羞羞免费视频网站| 一级毛片一级毛片免费毛片| 三级黄色片免费看| 91成人在线免费视频| 国产精品视频永久免费播放| 小小影视日本动漫观看免费| 亚洲成a人片在线观看日本麻豆| 亚洲天堂免费在线视频| 无码专区—VA亚洲V天堂| 亚洲美女视频一区| 亚洲精品精华液一区二区| 一级成人生活片免费看| 在线看片免费人成视频久网下载| 国产高清不卡免费视频| 九九九精品成人免费视频| 国产在线观看免费完整版中文版| 久久久久亚洲爆乳少妇无| 中文字幕亚洲综合久久| 亚洲日韩av无码中文| a级毛片免费高清视频|