在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>
jsp页面的异常显示:其中AddException,DaoException,FindException是自己定义的异常,继承exception
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<%@ taglib prefix="ww" uri="/webwork"%>
<%@ page import="com.opensymphony.xwork.util.OgnlValueStack"%>
<%@ page import="com.opensymphony.xwork.ActionContext"%>
<%@ page import="com.opensymphony.xwork.interceptor.ExceptionHolder"%>
<%@ page import="com.mdcl.framework.exception.*"%>
<%@ page import="java.io.*"%>
<%@ page import="com.mdcl.timecard.util.Translate"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
<body>
异常信息
<%
String tipMessge = null;//中文提示信息
OgnlValueStack s = ActionContext.getContext().getValueStack();
ExceptionHolder e;
String s1 = new String("");;
String name = new String("");
for(int i = s.size();i>0;i--){
Object obj = s.pop();
if(obj instanceof ExceptionHolder){
e = (ExceptionHolder)obj;
Object o = e.getException();
if(o instanceof AddException){
AddException we = (AddException)o;
tipMessge = Translate.translate("ErrorException");
}else if(o instanceof DaoException){
DaoException we = (DaoException)o;
tipMessge = Translate.translate("ErrorException");
}
else if(o instanceof FindException){
FindException we = (FindException)o;
tipMessge = Translate.translate("ErrorException");
}
s1 =e.getExceptionStack();
System.out.println(tipMessge);
break;
}
}
OutputStream b = response.getOutputStream();
%>
<br/>
<%=tipMessge%>
<%=s1%>
</body>
</html>
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>
jsp页面的异常显示:其中AddException,DaoException,FindException是自己定义的异常,继承exception
<%@ page language="java" contentType="text/html; charset=GB18030"
pageEncoding="GB18030"%>
<%@ taglib prefix="ww" uri="/webwork"%>
<%@ page import="com.opensymphony.xwork.util.OgnlValueStack"%>
<%@ page import="com.opensymphony.xwork.ActionContext"%>
<%@ page import="com.opensymphony.xwork.interceptor.ExceptionHolder"%>
<%@ page import="com.mdcl.framework.exception.*"%>
<%@ page import="java.io.*"%>
<%@ page import="com.mdcl.timecard.util.Translate"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=GB18030">
<title>Insert title here</title>
</head>
<body>
异常信息
<%
String tipMessge = null;//中文提示信息
OgnlValueStack s = ActionContext.getContext().getValueStack();
ExceptionHolder e;
String s1 = new String("");;
String name = new String("");
for(int i = s.size();i>0;i--){
Object obj = s.pop();
if(obj instanceof ExceptionHolder){
e = (ExceptionHolder)obj;
Object o = e.getException();
if(o instanceof AddException){
AddException we = (AddException)o;
tipMessge = Translate.translate("ErrorException");
}else if(o instanceof DaoException){
DaoException we = (DaoException)o;
tipMessge = Translate.translate("ErrorException");
}
else if(o instanceof FindException){
FindException we = (FindException)o;
tipMessge = Translate.translate("ErrorException");
}
s1 =e.getExceptionStack();
System.out.println(tipMessge);
break;
}
}
OutputStream b = response.getOutputStream();
%>
<br/>
<%=tipMessge%>
<%=s1%>
</body>
</html>
发表评论
-
注册webwork/struts2的类型转换器
2010-09-23 22:46 967以全局时间统一控制为例: 时间转换器 package cn. ... -
如何给Webwork的redirect的result传递多个参数
2010-09-23 21:56 951在Webwork 2.2里面给一个Action的result传 ... -
WebWork教程-验证框架
2010-09-23 21:42 803验证框架 WebWork提供了在Action执行之前,对输入数 ... -
WebWork框架- Interceptor(拦截器)
2010-09-23 21:30 752Interceptor(拦截器)将Action共用的行为独立出 ...
相关推荐
4. 异常处理:WebWork2提供了全局异常处理器,可以统一处理未被捕获的异常,避免页面显示不友好。 5. 动态方法调用(Dynamic Method Invocation,DMI):允许通过URL直接调用对象的方法,增强了路由的灵活性。 6. ...
5. **异常处理(Exception Handling)**:WebWork提供了全局的异常处理机制,可以统一处理未被捕获的异常,增强了系统的健壮性。 三、WebWork基本架构 1. **请求接收**:当用户发起HTTP请求时,Web服务器(如...
4. **异常处理**:WebWork提供了优雅的异常处理机制,允许开发者定义全局和局部的异常处理器,可以捕获并适当地处理运行时错误,同时向用户展示友好的错误页面。 5. **拦截器(Interceptors)**:WebWork的拦截器是...
配置文件可以定制Action的路径映射、指定Action的拦截器链,以及设定全局或局部的配置选项。 四、WebWork2.0实践应用 在实际开发中,WebWork2.0常用于构建企业级的Web应用,例如B/S系统、电商平台、管理系统等。...
8. **异常处理**:WebWork提供了强大的异常处理机制,允许开发者自定义错误页面和异常策略,以优雅地处理程序中的错误。 在压缩包中的8个例子可能涵盖了WebWork的基本用法,例如: - **HelloWorld**:最基础的示例...
5. **异常处理(Exception Handling)**:WebWork提供了优雅的异常处理机制,可以将异常映射到特定的错误页面或动作,使得错误处理更加集中和规范。 **WebWork Wiki中文文档内容概览:** 这个文档可能包含了以下...
2. 异常处理:通过全局异常处理器,WebWork可以统一处理应用程序中的异常,提供友好的错误页面。 3. 国际化与本地化:WebWork支持多语言环境,方便开发者实现应用的国际化。 4. AJAX支持:WebWork提供了与AJAX集成...
5. **异常处理(Exception Handling)**:WebWork提供了一种优雅的方式来处理异常,可以定义全局和局部的异常处理策略,提高错误报告的用户体验。 6. **国际化和本地化(Internationalization and Localization)**...
2. `struts-config.xml`或`webwork-config.xml`:这是WebWork的配置文件,定义了Action的映射和全局设置。在这个文件中,你可以声明一个简单的Action,例如名为“hello”的Action,指向一个处理请求的类。 3. 创建...
8. **异常处理**:WebWork2的异常处理机制允许开发者定义全局和特定Action的异常处理器,从而统一处理可能出现的运行时错误。 9. **配置管理**:WebWork2的配置文件采用XML格式,可灵活配置Action、Interceptor、...
11. **异常处理**:WebWork提供了一套完善的异常处理机制,可以自定义错误页面,或者将特定类型的异常映射到特定的Action。 这个“WebWork 中文API”文档应该包含了上述概念的详细解释和对应的API接口,包括Action...
5. **异常处理**:WebWork提供了优雅的异常处理机制,允许开发者定义全局和特定Action的异常处理策略,从而更好地控制错误页面的显示和错误信息的处理。 6. **国际化与本地化**:WebWork支持多语言环境,开发者可以...
4. **异常处理**:WebWork提供了一套完善的异常处理机制,可以将系统异常映射到特定的结果页面,确保用户体验的连续性。 5. **国际化和本地化**:WebWork支持多语言环境,可以轻松实现应用的国际化和本地化。 6. *...
7. **异常处理**:通过配置,可以设定全局或特定Action的异常处理策略,比如将异常转换为特定的结果。 8. **插件和扩展**:WebWork2支持丰富的插件系统,如OGNL表达式语言、Tiles布局、AOP等,它们通过简单的配置...
WebWork2还提供了强大的异常处理机制,允许开发者自定义错误页面和全局异常处理器。当Action执行过程中发生异常时,WebWork2可以根据预设的规则来决定如何处理这些异常。 在实际项目中,WebWork2通常与其他开源框架...
4. **异常处理**:WebWork允许开发者定义全局和局部的异常处理策略,提供了一种优雅的方式来处理错误和异常。 5. **视图层支持**:WebWork可以与各种视图技术配合,如JSP、FreeMarker、Velocity等,使视图与业务...
通过全局异常处理器,你可以集中处理所有未捕获的异常,并自定义错误页面。 8. 国际化(i18n)与本地化(l10n): WebWork支持多语言环境,你可以创建资源文件来存储不同语言的文本,根据用户设置自动选择合适的...
7. **异常处理**:WebWork提供了全局的异常处理机制,可以捕获和处理Action执行过程中的异常,提供统一的错误反馈。 这个实例提供了学习WebWork基础和实践用户登录功能的机会。通过这个实例,你可以了解到WebWork的...
2. 异常处理:WebWork提供了全局异常处理机制,可以统一处理未捕获的异常,避免了在每个动作类中重复写异常处理代码。 3. 国际化支持:WebWork内置了国际化的支持,方便开发者实现多语言的应用。 4. 动态方法调用...
7. **异常处理(Exception Handling)**:WebWork有一套内置的异常处理机制,允许开发者定义全局或动作级别的错误页面,以优雅地处理运行时异常。 8. **开发指南**:WebWork的开发指南通常会涵盖如何创建动作、配置...