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(飛云小俠) 閱讀(2796) 評論(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年1月>
          25262728293031
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          導航

          統計

          公告

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

          我的郵件
          cnscud # gmail


          常用鏈接

          留言簿(15)

          隨筆分類(113)

          隨筆檔案(103)

          相冊

          友情鏈接

          技術網站

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 资中县| 克东县| 高安市| 廊坊市| 韩城市| 罗田县| 昌吉市| 广平县| 长阳| 江津市| 府谷县| 新乡市| 临沂市| 包头市| 亚东县| 渝北区| 兴隆县| 永靖县| 青阳县| 广南县| 微山县| 城固县| 萝北县| 长岛县| 翁源县| 金秀| 怀宁县| 灌阳县| 田东县| 达日县| 吉木乃县| 五常市| 佳木斯市| 灵璧县| 文成县| 长兴县| 娄烦县| 平罗县| 枣强县| 温泉县| 隆安县|