`

Struts2学习笔记(七) 结果(Result)(下)

 
阅读更多

异常映射
我们知道在action的execute方法签名中定义了可以抛出任何类型的异常。至于这个异常抛给了谁,那当然是struts2框架了,如果我们没有设置响应的策略,那么struts2也不会对异常进行处理,又直接抛给web容器了。

如果我们需要Aaction在发生异常时跳转到指定的提示页面,那么我们当然可以在action中使用try..catch语句来返回不同的结果,但是Struts2为我们提供了更加方便的方式,那就是异常映射。我们只需要在配置文件中进行一些配置,就可以省去action中的try。。catch语句块。配置的方式就是在<action>元素中使用<exception-mapping>元素,可以指定在动作方法抛出指定异常时要执行那个result。

<action name="*User" class="action.UserAction" method="{1}">

<result name="input">/input.jsp</result>

<result name="success">success.jsp</result>

<result name="error">/error.jsp</result>

<exception-mapping result="error" exception="java.lan.ArithmeticException"></exception-mapping>

</action>

其中exception属性用于指出捕获指定的异常类型,result属性用于指出在捕获到该异常时需要呈现的result。

异常捕获通过exception拦截器来实现,该拦截器位于defaultStack拦截器栈的最顶端,因此能够不会整个调用过程中的异常,exception拦截器对应的实现类为:

com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor查看其源码:

可以看到在exception拦截器中使用了try。。catch来捕获整个执行过程中的异常,如果执行过程中没有抛出异常,那么就将Action的执行结果正常返回,如果执行过程中出现了异常,那么就会查找与抛出的异常类型最接近的异常映射,并且将返回在在异常映射中配置的Result。

并且拦截器会将捕获到的异常包装成ExceptionHolder对象并将其压入valueSack。我们在看一下ExceptionHolder类的源码:

可以看到,在该类中将exception的trackStack转换成字符串存放在exceptionStack变量中。在struts2中要想使用OGNL调用Action类的某个属性,那么我们必须保证该属性有对应的get方法。那么实际上的调用全部是通过调用get方法来获取的,至于到底Action中是否存在对应的变量以及变量的名字是否和get方法对应其实并不影响,真正起作用的只是get方法。那么在这个ExceptionHolder类中有两个get方法,一个是getException,另一个是getExceptionStack,那么也就是说我们在使用OGNL调用该类的属性时,相当于存在两个属性:exception和exceptionStack。因为这个ExceptionHolder对象已经被放入了valueStack的顶部,也就是说,我们可以在我们配置的异常结果页面通过OGNL来访问这两个属性的内容:

<s:propertyvalue="%{exception.message}"/>

<s:propertyvalue="%{exceptionStack}"/>

PreResultListenner

不管处于什么目的,有时候我们需要在Action方法执行完毕,但是在执行Result之前能够做点什么。那么怎么实现这个功能呢?这时PreResultListener就派上用场了。一看它的名字就知道它是一个Listenner,那么它监听的事件就是Action方法执行完毕,将要执行Result。具体这个时间我们并不需要关注,struts2会自动分发这个事件,并触发我们的监听器。我们要做的就是实现这个Listenner,并把它注册到Action上。

首先我们需要实现PreResultLisenner这个接口:

我们的实现类所做的操作就打印一句话,用于我们判断执行的先后顺序。

然后我们在Result视图中也打印一句话:

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">

<html>

<head>

<title>PreResultListenner Demo Result</title>

</head>

<body>

<%

System.out.println("结果页面已经被执行....");

%>

</body>

</html>

我们在Action的excute方法中对我们的Listenner进行注册:

在struts.xml配置helloworld动作,并配置相应的Result,然后我们在浏览器中访问一下helloworld动作,页面执行完毕之后查看控制台的输出:

正在执行success结果执行之前的操作...

结果页面已经被执行....

表明在执行Result之前确实先执行了我们的Listenner。

自定义Result

自定义Result就是我们自己开发Result,不实用Struts2内建的Result Type,实际使用中我们几乎不会用到自定义Result,strut2内建的Result Type已经够我们使用了。这里就当时简单的了解一下吧。

要实现自定义Result,其步骤如下:

(1)定义一个类,实现com.opensymphony.xwork2.Result接口

(2)在struts.xml中,在<package>元素中使用<result-types>元素声明我们的Result Type

(3)在Action中的<result>元素中将type属性指定为我们在(2)中声明的Result Type

下面动手做一个简单的实例:

这里我只是简单的打印出一句话,当然,实际要实现一个Result需要做的事情很多,有兴趣的可以参看struts2内建的Result Type的实现。

struts.xml

<package name="default" namespace="/" extends="struts-default">

<result-types>

<result-type name="myresult"class="action.MyResult"></result-type>

</result-types>

<action name="hello" class="action.HelloWorld">

<result name="input">/input.jsp</result>

<result name="success" type="myresult">/success.jsp</result>

</action>

</package>

我在浏览器中测试,由于我们result实现中没有任何执行输出到浏览器的功能,因此浏览中无任何输出,查看控制台,输出如下:

要执行的reuslt为:success

到这里,我们自定义的Result就完成了。从这个例子中我们也可以看出,要实现自定义的Result其实不难,难的就是我们怎么去呈现这些数据,那么我们就必须使用一种视图呈现技术,实际Result也就是对视图呈现技术的一中包装(或者说调用吧)。







分享到:
评论
1 楼 lin244938744 2013-06-07  
讲解的不错

相关推荐

    struts2学习笔记(完美总结)——转自OPEN经验库

    本文将深入探讨Struts2的核心概念,包括Action、Result、配置文件、OGNL与ValueStack、Tags以及项目中的关键实践。 **一、Action** Action是Struts2中处理业务逻辑的核心组件,它是实现了`...

    struts2 学习重点笔记

    ### Struts2 学习重点知识点总结 #### 一、Struts2 概念与架构 **1.1 Struts2 简介** - **定义**:Struts2 是 Apache 组织提供的一个基于 MVC 架构模式的开源 Web 应用框架。 - **核心**:Struts2 的核心其实是 ...

    struts2学习笔记(1)

    ### Struts2学习笔记知识点详解 #### 一、Struts2框架的基本引入步骤 ##### 1. 导入Struts2相关Jar包 在引入Struts2框架时,首先需要将Struts2的相关Jar包导入到项目的类路径中。这些Jar包通常包括核心库以及其他...

    struts2四天的学习笔记

    13. ** strut2四天笔记**:这份学习笔记可能涵盖了以上所有知识点,包括如何创建Action,配置struts.xml,使用OGNL表达式,处理异常,以及实践中的各种技巧和最佳实践。 在四天的学习过程中,你应该通过实践和理解...

    struts2学习笔记

    Struts2是一个强大的MVC(Model-...Struts2的核心配置文件是`struts.xml`,它负责定义Action、拦截器栈、结果类型、包配置等。在这个文件中,你可以声明你的Action类,定义它们对应的方法以及结果页面。例如: ```xml ...

    struts 2 学习笔记

    以上内容仅是Struts2学习笔记中的核心部分,实际学习时还需要深入理解拦截器、结果类型配置、插件机制、异常处理等更多高级特性。Struts2提供了强大的功能和灵活性,是Java Web开发中不可或缺的一部分。

    Struts2学习笔记

    本学习笔记将深入探讨Struts2的核心概念、架构以及实际应用。 一、Struts2框架概述 1. 架构:Struts2基于Model-View-Controller(MVC)设计模式,将业务逻辑、数据处理和用户界面分离,提高了代码的可读性和可维护...

    牧紫小岩的Struts2学习笔记

    综上所述,**牧紫小岩的Struts2学习笔记**涵盖了Struts2框架的关键概念和技术细节,从框架的初始化流程、配置管理到Action的实现与调用,再到结果处理和异常管理,为初学者和资深开发者提供了一个全面深入的学习资源...

    Struts2学习笔记2012

    ### Struts2学习笔记2012 #### 一、建立一个Struts2工程 **步骤详解:** 1. **创建Web项目:** - 在MyEclipse中选择“File” &gt; “New” &gt; “Dynamic Web Project”,创建一个新的Web项目。 2. **解压并配置...

    struts2学习笔记和源码

    这份"struts2学习笔记和源码"资源是学习这个框架的理想材料,特别适合初学者。 一、Struts2框架基础 Struts2是Apache软件基金会下的一个项目,它是Struts1的升级版,弥补了Struts1的一些不足,如动作映射和拦截器等...

    Struts2 学习笔记

    02 Struts2-Result 19 一、 Result类型 (type) 19 二、 全局结果集(Globle Result) 20 三、 动态的结果集(dynamic result) 21 四、 带参数的结果集 21 五、 Result总结 22 六、 项目经理: 22 03 OGNL表达式语言 23 ...

    struts2详细学习笔记

    2. **Package**:包是Struts2中的一个关键概念,用于组织相关的Action和结果(Result)。包可以继承其他包,从而实现配置的复用和分层。`package`标签的属性包括name、extends、namespace等,其中,namespace用于...

    struts2课程笔记

    本课程笔记主要涵盖了Struts2的基础概念、核心功能及其工作流程。 首先,Struts2的处理流程是通过一系列的组件协作完成的,包括Filter Dispatcher(过滤器调度器)、Action、Interceptor(拦截器)和Result。当用户...

    struts2学习笔记.rar

    这个"struts2学习笔记.rar"文件很可能包含了关于Struts2框架的详细教程和实践案例,对于学习和理解Struts2的核心概念和技术是非常有帮助的。 首先,Struts2框架的引入是为了克服早期Struts1框架的一些局限性,提供...

Global site tag (gtag.js) - Google Analytics