|
公告
日历
统计
- 随笔 - 81
- 文章 - 1
- 评论 - 137
- 引用 - 0
导航
常用链接
留言簿(8)
随笔分类(81)
随笔档案(80)
相册
友情链接
技术网站
搜索
积分与排名
最新评论

阅读排行榜
评论排行榜
|
在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:
<a href="index.jspa?type=1">Exception 1</a>
<br><br>
Exception 99:
<a href="index.jspa?type=99">Exception 99</a>
<br><br>
Other Exception:
<a href="index.jspa?type=60">Exception 60</a>
<br><br>
Normal:
<a 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
评论:
-
# re: WebWork2.2新特性(七):异常映射/全局异常映射
Posted @ 2005-09-05 12:36
编辑器好像有问题.... 回复 更多评论
-
# re: WebWork2.2新特性(七):异常映射/全局异常映射
Posted @ 2005-09-06 08:53
Cool! I love your blog. 你在北京吗? 联系一下,交个朋友? icecloud@sina.com 回复 更多评论
-
# re: WebWork2.2新特性(七):异常映射/全局异常映射
Posted @ 2005-09-06 08:53
那是我MSN,嘿嘿 回复 更多评论
-
# re: WebWork2.2新特性(七):异常映射/全局异常映射
Posted @ 2005-09-06 10:52
哦,冰云啊,早知道你了
我在北京,不过俺在公司就不能用msn... 回复 更多评论
-
# re: WebWork2.2新特性(七):异常映射/全局异常映射
Posted @ 2005-09-15 16:28
这么说QQ也不能用啦,还想把你拉进群里。 回复 更多评论
-
# re: WebWork2.2新特性(七):异常映射/全局异常映射
Posted @ 2005-09-15 16:31
目前还可以用google talk,呵呵,帐号就是我的gmail地址.
太多人聊天,所以封了msn,qq. 回复 更多评论
-
# re: WebWork2.2新特性(七):异常映射/全局异常映射
Posted @ 2005-11-26 14:31
飞云...你不要误人子弟了.....你这些.自己过没有...!!!!明显的错误在那里...我靠....没有实践..你就不要害人..... 回复 更多评论
-
# re: WebWork2.2新特性(七):异常映射/全局异常映射
Posted @ 2005-11-26 14:47
什么错误?请指出
这些代码都是当时我自己亲自写的,当然可以运行
当然,现在能不能运行我不能保证.
我想说的是:你运行了吗?
回复 更多评论
-
# re: WebWork2.2新特性(七):异常映射/全局异常映射
Posted @ 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新特性(七):异常映射/全局异常映射
Posted @ 2005-11-28 10:47
关于spring的结合 ,有可能现在是错误的了,不过我没有在试.
因为我写那个文章的时候,还是beta1 or beta2,而在后来spring的结合有了很大变化,那篇英文文档也有多次修改,现在是什么样子我都不知道了.
有时间我在仔细看看.
关于ajax,其中一个是可以通过表单提交,submit的resultDivid指明目标div即可. 回复 更多评论
-
# re: WebWork2.2新特性(七):异常映射/全局异常映射
Posted @ 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新特性(七):异常映射/全局异常映射
Posted @ 2005-11-28 12:21
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新特性(七):异常映射/全局异常映射
Posted @ 2005-11-28 12:36
谢谢小侠提供!
我再去试试. 回复 更多评论
-
# re: WebWork2.2新特性(七):异常映射/全局异常映射
Posted @ 2005-11-28 15:31
大部分.我都己试过.都通过.
感谢飞云提供!...
再次为我的鲁莽而深表欠意....
回复 更多评论
-
# re: WebWork2.2新特性(七):异常映射/全局异常映射
Posted @ 2006-01-25 11:58
弱弱的说一句,现在最新的ww2.2好像不用自己配制了,defaultStack里面已经有了,而且exception拦截器应该放在最上面才对,不应该在最下面。 回复 更多评论
-
# re: WebWork2.2新特性(七):异常映射/全局异常映射
Posted @ 2006-03-06 00:09
我的问题是,这个异常信息有没有存在什么stack上,
比如我后来的转向是一个action.那么他有无办法获知刚才发生的异常是什么? 回复 更多评论
-
# re: WebWork2.2新特性(七):异常映射/全局异常映射
Posted @ 2006-03-06 00:38
你可以看一下这个拦截器的源码,它放到了stack里面一个exceptionHolder
但是显然,没有太方便的方法来获取它, 不过stack的第一个元素一般就是它。 回复 更多评论
-
# re: WebWork2.2新特性(七):异常映射/全局异常映射
Posted @ 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
回复 更多评论
|