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(飞云小侠) 阅读(2576) 评论(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">">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">">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
  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
<2005年9月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

导航

统计

公告

文章发布许可
创造共用协议:署名,非商业,保持一致

我的邮件
cnscud # gmail


常用链接

留言簿(14)

随笔分类(110)

随笔档案(102)

相册

友情链接

技术网站

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜