<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個特性,必須使用xwork-1.1.dtd才行.

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

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

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

    exception-mapping的定義如下:

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


    可以看到有3個屬性:名稱,異常類型,和結果.


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

    首先我們虛擬一個程序,假設程序會拋出幾種程序

    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可以看出,程序至少會拋出3種異常,我們如果使用異常映射,就要考慮到拋出的所有異常.

    程序中用到的NoRightException,NotFoundException是為了演示而建立的2個簡單異常,無任何特殊代碼,繼承自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>
     



    首先定義了一個exceptionmapping攔截器,用來指向ExceptionMappingInterceptor.
    然后定義一個攔截器Stack,包含defaultStack和exceptionmapping,注意,exceptionmapping是在Stack的最后面,否則會發生不可預期的結果.

    可以看到global-exception-mappings段包含了2個異常映射,一個為NoRight的處理,另外一個為對應java.lang.Exception的映射.

    在Action的定義中包含了一個exception-mapping,對應NotFound異常.

    沒有看到IllegalArgumentException的對應結果?? 攔截器對沒有定義的異常會依次找這個異常的父類,一級一級向上查找,例如IllegalArgumentException的最終父節點是Exception,就會轉向到Exception對應的結果. 如果一個異常有多個層次關系上的父類,那個關系最近就找誰.

    演示頁面如下:

     <%@ 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是三個最簡單的jsp頁面,自己編寫即可.

    運行程序,發現根據異常類型會轉向相應的異常頁面.

    如果你自己的程序中的異常沒有在異常映射中得到對應的result,程序會拋出異常,所以應該定義一個Exception的對應result.

     

     

     

    除經特別注明外,本文章版權歸JScud Develop團隊或其原作者所有.
    轉載請注明作者和來源.  scud(飛云小俠)  歡迎訪問 JScud Develop


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

    評論

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

    編輯器好像有問題....  回復  更多評論   

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

    Cool! I love your blog. 你在北京嗎? 聯系一下,交個朋友? icecloud@sina.com  回復  更多評論   

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

    那是我MSN,嘿嘿  回復  更多評論   

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

    哦,冰云啊,早知道你了

    我在北京,不過俺在公司就不能用msn...  回復  更多評論   

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

    這么說QQ也不能用啦,還想把你拉進群里。  回復  更多評論   

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

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

    太多人聊天,所以封了msn,qq.  回復  更多評論   

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

    飛云...你不要誤人子弟了.....你這些.自己過沒有...!!!!明顯的錯誤在那里...我靠....沒有實踐..你就不要害人.....  回復  更多評論   

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

    什么錯誤?請指出

    這些代碼都是當時我自己親自寫的,當然可以運行

    當然,現在能不能運行我不能保證.

    我想說的是:你運行了嗎?



      回復  更多評論   

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

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


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

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



    然而,有時你可能想要Spring來完全管理Bean.這是有實際意義的,例如,你如果想對你的Bean使用AOP或者Spring的相關技術,例如Acegi.為了達到這個目的,你僅僅要做的就是在xwork.xml里移除你的WebWork Action的類的屬性,然后在applicationContext.xml里面增加一個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應該這樣定義:

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

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

    "
    ***************************
    上文和原英文版有什么區別么....你在那里加了一段自己的
    ******************
    然后在applicationContext.xml里面增加一個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>
    ******************
    事實證明.這是錯的...
    我重新配了一下.發現是你對這段英文的理解有誤!!
    但我很敬重你能給大家說這么多...
    我上篇文章.對你的誤會太深...請原諒!
    愿我們都能為開源發一份熱....
    哦,還有個問題.在對新引進的ajax中...我在webwork1.17里的做法是...在action中實現ajax的result結后...然后在返回頁面指定(接受返回內容的div的)ID.就是實現現在新的ajax功能...那樣做很煩!!!.
    但在你新的對ajax的說明中...你說在標簽中可以得到action中的內容.而action中內容那么多..要怎么返回想要的呢....是在action中指明該標簽要得到的返回內容.還是..還有另的方法可以直接用呢?請指明!
    最后...我向前天我的行為深表欠意!!!
      回復  更多評論   

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

    關于spring的結合 ,有可能現在是錯誤的了,不過我沒有在試.

    因為我寫那個文章的時候,還是beta1 or beta2,而在后來spring的結合有了很大變化,那篇英文文檔也有多次修改,現在是什么樣子我都不知道了.

    有時間我在仔細看看.

    關于ajax,其中一個是可以通過表單提交,submit的resultDivid指明目標div即可.  回復  更多評論   

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

    關于ajax里...通過表單提交的.我試過.
    但在另一種情況下.如你例子里頁面打開后五秒執行ajaxTest.action然后將返回內容填至此div.我想請教.
    此時aciton返回的是什么...因為我做的.就是返回一個success.然后在xwork中指定返回頁面...
    因為我們以前做的是所有action繼承com.opensymphony.xwork.ActionSupport;并實現com.opensymphony.xwork.Action接口.返回的就那幾種success;input.等;而從我們以前在webwork1.17版時.我們實現了一個ajaxAction接口用來指定返回targetID及返回的內容.
    還有.如果在頁面直接引用dojo.event.topic.publish( "scud1", "alert(’test’);" );會報錯說.找不到dojo對像..我在該頁面里己加入了你的commonInclude.jsp..那還需要什么??  回復  更多評論   

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

    1.action返回的內容和普通action是一樣的,可以返回任何內容

    a標簽返回的一般都是javascript,不能是普通內容,否則好像沒有什么效果
    div返回的內容會更新自己本身

    目前只有表單方式可以把返回的內容傳給另外一個div

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

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

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

    看看webwork2.2的靜態文件服務方式把,在com\opensymphony\webwork\static包下面.
    我沒有具體研究過.
      回復  更多評論   

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

    謝謝小俠提供!
    我再去試試.  回復  更多評論   

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

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

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

    弱弱的說一句,現在最新的ww2.2好像不用自己配制了,defaultStack里面已經有了,而且exception攔截器應該放在最上面才對,不應該在最下面。  回復  更多評論   

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

    我的問題是,這個異常信息有沒有存在什么stack上,
    比如我后來的轉向是一個action.那么他有無辦法獲知剛才發生的異常是什么?  回復  更多評論   

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

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

    但是顯然,沒有太方便的方法來獲取它, 不過stack的第一個元素一般就是它。  回復  更多評論   

    # 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的方式轉向于此action,則要注意第二個元素才是ExceptionHolder
      回復  更多評論   

    <2006年3月>
    2627281234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

    導航

    統計

    公告

    文章發布許可
    創造共用協議:署名,非商業,保持一致

    我的郵件
    cnscud # gmail


    常用鏈接

    留言簿(15)

    隨筆分類(113)

    隨筆檔案(103)

    相冊

    友情鏈接

    技術網站

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲视频在线观看地址| 亚洲福利视频导航| 春暖花开亚洲性无区一区二区| 日韩中文字幕精品免费一区| 91天堂素人精品系列全集亚洲| 1000部免费啪啪十八未年禁止观看 | 国产高清视频在线免费观看| 亚洲色偷偷综合亚洲AV伊人蜜桃| 猫咪社区免费资源在线观看| 理论亚洲区美一区二区三区 | www亚洲精品久久久乳| 精品剧情v国产在免费线观看| 亚洲国产精品日韩av不卡在线| 免费国产a国产片高清| www永久免费视频| 久久亚洲一区二区| 国产成人精品免费午夜app| 亚洲精品一二三区| 免费看小12萝裸体视频国产| 国产精品成人啪精品视频免费| 亚洲国产成人一区二区三区| xx视频在线永久免费观看| 亚洲国产精品无码久久98| 亚洲国产精品无码久久久久久曰| 国产精品区免费视频| 亚洲va成无码人在线观看| 免费人成网站在线播放| 久久精品乱子伦免费| 亚洲午夜无码毛片av久久京东热| 亚洲国产精品国产自在在线| 99热这里只有精品免费播放| 亚洲av无码一区二区三区人妖| 亚洲欧洲精品成人久久奇米网| 99爱在线观看免费完整版 | 免费的黄色网页在线免费观看| 亚洲av最新在线网址| 亚洲人成网站免费播放| a一级毛片免费高清在线| 亚洲国产精品一区二区久| 亚洲AV伊人久久青青草原| 四虎最新永久免费视频|