Struts2入门3 深入学习 处理结果和异常

前言:

Struts学习的差不多了,还有最后的一点就收官了就是结果处理和异常处理。前面学习Struts主要围绕就是Action以及struts.xml配置方法,通过简单的编程实现了struts的基本功能。其实这样的入门效果就达到了,因为任何一个框架技术,如果想速成,就拿出一天的时间来学习;但是想要掌握到炉火纯青的地步,那就是在平时的项目中利用它去解决实际的问题,同时不断的深入框架,直到源代码级别。单独学习完这几个框架,后面还有很多的事情,就是讲它们整合,还有Spring的一大块东西,同时在Java中有很多的设计模式,那本厚厚的设计模式,不知能不能够看下去。同时这本SSH的后面的实验要做吗?也是个问题,不纠结了,还是先把Struts2看完最后这一点入门的知识。

1.处理结果

Action是Struts2的业务控制器,他负责处理用户的请求,并且通过调用业务处理逻辑进行业务处理。当Action处理完毕,处理结果会通过视图展示,而Action本身是不直接提供针对用户请求的响应,但是Action控制器应该能够控制将那个试图资源呈现给读者。Struts2的Action中只会返回一个字符串。

1.1处理结果的流程

这个流程就不总结了,其实最终显示给用户的视图资源不仅有JSP还有Velocity或者是FreeMarket这里,因为Struts支持多种视图资源,同时在视图层,EL表达式是十分重要的,可以直接获得很多的数据资源,同时还有标签,可以节省很多的代码资源。

1.2result配置信息

Struts2中提供了两种结果配置:

局部结果:将result元素作为action的子元素出现

<result name=”success” type=”dispatcher”>视图资源</result>

全局结果:将result元素作为<global-results>元素配置

<package name=”test” extends=”struts-default”>

<global-results>

<result name=””>视图资源</result>

</global-results>

</package>

这样的会给他提供一个全局的默认结果success,这个全局结果的作用范围对所有的Action都会有效。但是局部结果优先有全局结果。

1.3result的类型

Struts2支持多种视图技术,可以和JSP,Velocity, FreeMarket, XSLT等等视图技术整合。Action处理结束之后,返回的普通字符串就是逻辑视图,根据在上struts.xml中的配置,可以使得逻辑视图资源和物理视图资源产生映射关系,默认的result都是dispatcher类型的。Struts2默认提供了result类型:

chain 用于进行Action链式处理

chart         整合JFreeChart技术

dispatcher 整合JSP页面技术

freemarket       整合FreeMarket技术

httpheader       控制特殊行为的http行为

jasper       整合JasperReport技术

jsf     整合JSF技术

redirect    用于重定向到其他的URL

redirectAction 重定向到其他的Action

stream 向浏览器返回InputStream,一般用于文件下载

tiles 用于整合Tiles技术

velocity    整合velocity技术

xslt   整合XML/XSLT技术

plaintext  显示源代码

关于redirect和dispatcher是相对的,dispatcher是将请求结果转发到指定的JSP资源,而redirect的结果类型则意味者将请求重定向到指定的视图资源。

Dispatcher和Redirect的主要区别是在转发和重定向上:重定向会丢失所有的请求参数,请求属性,同时Action处理的结果也会丢失,当使用redirect的时候,系统实际上会调用HttpServletResponse的sendRedirect()方法来重定向指定的视图资源,这种效果就是重新生成一个请求,之前请求的所有参数、属性、Action对象等等都会丢失,一般重定向使用在发生错误,不知如何处理,到ERROR界面,或者是主页;或者是登陆的时候,登陆成功,重定向到主页。

redirectAction结果类型和redirect的结果类型是相似的,同样也会生成一个新的请求,当需要在Action处理结束之后直接将请求重定向到另一个Action的时候,配置redirectAction的结果类型实现,同时还可以指定 actionName属性和namespace

<action name=”login” class=”com.yang.stru2.action.LoginAction”>

<result name=”success” type=”redirectAction”>

<param name=”actionName”>listuser</param>

<param name=”namespace”>/user</param>

</result>

</action>

1.4动态的result

不怎么喜欢使用,就是表示是匹配,

<package name="user" extends="struts-default">

<action name="*user" class="com.yang.stru2.action.UserAction" method="{1}"> 这里的{1}就表示的是不确定的哪一个部分

<result>/{1}.jsp</result>

</action>

</package>

2.异常处理

一个程序的健壮,关键不是程序不会出错,而是出错了,如果保证程序能够继续运行。因为没有程序不存在错误。在实际的应用中,有些异常是因为违反了业务逻辑而导致的错误,和特定的业务相关,这种错误不能进行声明式处理,只能够使用编程进行处理,还有一些莫名奇怪的错误,但是有经常存在:

无法处理:系统级别或者是资源级别的,于Web的逻辑无关的,比如网络原因导致的数据库连接失败

和业务处理无关,但是需要用户重定向到执行额外操作的页面,比如用户未登录,这个时候就会跳转。

和业务逻辑相关,修改工作的流程解决,比如数据并发的问题和资源锁的问题

任何成熟的框架都会提供相当完善的异常处理机制,Struts2就是这样,他提供了一种声明式的异常处理机制。当Action处理用户请求的时候,比如出现了异常1,则Struts2会捕获异常之后,按照struts.xml配置的映射,转入到exception1.jsp页面进一步处理。这种方式使得异常处理和代码的耦合度降低,便于维护。

关于异常的配置信息,在struts.xml中配置<exception-mapping>元素来完成,配置元素的一下属性:

exception:指定Action出现的异常所映射的异常类型

result:指定Action抛出异常的时候,系统转入该属性值对应的Action或者是global-results中配置的result

同时<exception-mapping>还分为局部异常映射和全局异常映射:

局部异常映射:将<exception-mapping>元素作为<action>的子元素配置

全局异常映射:将<exception-mapping>元素作为<global-exception-mappings>的子元素配置:

<package name="login" extends="struts-default">

<action name="login" class="com.yang.stru2.action.LoginAction">

<exception-mapping result="error" exception="java.lang.RuntimeException"></exception-mapping>

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

</action>

</package>

YangTengfei

2013.11.30

Struts2入门3 深入学习的更多相关文章

  1. Struts2入门2 Struts2深入

    Struts2入门2 Struts2深入 链接: http://pan.baidu.com/s/1rdCDh 密码: sm5h 前言: 前面学习那一节,搞得我是在是太痛苦了.因为在Web项目中确实不知 ...

  2. Struts2入门1 Struts2基础知识

    Struts2入门1 Struts2基础知识 20131130 代码下载: 链接: http://pan.baidu.com/s/11mYG1 密码: aua5 前言: 之前学习了Spring和Hib ...

  3. struts2框架(1)---struts2入门

    struts2框架 如果你之前在MVC模式的时候一直都是通过servlet,获取和返回数据,那么现在开始学习struts2框架, Struts是一个实现MVC设计模式的优秀的框架.它的许多优点我就不说 ...

  4. Struts2 入门

    一.Struts2入门案例 ①引入jar包 ②在src下创建struts.xml配置文件 <?xml version="1.0" encoding="UTF-8&q ...

  5. 【特别推荐】Node.js 入门教程和学习资源汇总

    这篇文章与大家分享一批很有用的 Node.js 入门教程和学习资源.Node 是一个服务器端的 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用 ...

  6. struts2入门程序

    struts2入门程序 1.示例 搭建编程环境就先不说了,这里假设已经搭建好了编程环境,并且下好了strut2的jar包,接下来程序. 1.1 新建web项目 点击File->New->D ...

  7. Node.js 入门教程和学习资源汇总

    这篇文章与大家分享一批很有用的 Node.js 入门教程和学习资源.Node 是一个服务器端的 JavaScript 解释器,它将改变服务器应该如何工作的概念.它的目标是帮助程序员构建高度可伸缩的应用 ...

  8. MongoDB索引(一) --- 入门篇:学习使用MongoDB数据库索引

    这个系列文章会分为两篇来写: 第一篇:入门篇,学习使用MongoDB数据库索引 第二篇:进阶篇,研究数据库索引原理--B/B+树的基本原理 1. 准备工作 在学习使用MongoDB数据库索引之前,有一 ...

  9. [java]struts2入门

    摘要 本文是struts2入门,配置教程.如何在IntelJ Idea中进行手动配置.在使用idea新建struts2web项目的时候,在下载jar包的过程中,下载失败,没办法就直接手动进行下载jar ...

随机推荐

  1. 如何编译Less

    什么是LESS LESSCSS是一种动态样式语言,属于CSS预处理语言的一种.它编译后就是CSS了,大名鼎鼎的前端框架BootStrap就是用这个语言写的 下面示范下怎么用LESS编译成CSS,尽量简 ...

  2. iptables文件

    # Firewall configuration written by system-config-firewall# Manual customization of this file is not ...

  3. 冒泡排序优化JAVA

    本文对传统的冒泡排序进行了一些优化,减少了循环次数. 时间复杂度 若文件的初始状态是正序的,一趟扫描即可完成排序.所需的关键字比较次数 C 和记录移动次数 M 均达到最小值: C(min)=n-1 , ...

  4. Java里的if else嵌套语句例子

    import java.util.Scanner; public class if_else3 { public static void main(String[] args) { Scanner s ...

  5. Text input(文本输入框)

    Text input(文本输入框)是用来获得用户输入的绝佳方式. 你可以用如下方法创建: <input type="text"> 注意,input元素是自关闭的.

  6. 动态时间归整/规整/弯曲(Dynamic time warping,DTW)

    动态时间规整DTW   在日常的生活中我们最经常使用的距离毫无疑问应该是欧式距离,但是对于一些特殊情况,欧氏距离存在着其很明显的缺陷,比如说时间序列,举个比较简单的例子,序列A:1,1,1,10,2, ...

  7. as的一些常见问题

    assets文件的存放目录在”src/main/”目录下,和java.res文件夹平级: aidl文件需要单独在”src/main/”目录下新建一个文件夹,然后创建对应的包名,将aidl文件放在包名对 ...

  8. 做php网站后台开发,在Linux系统上进行更好吗?

    1. PHP是开源软件,它在bsd/linux/win下都有很好的正式版及孪生版.并非开发php就必须要在linux下进行.主机服务商们习惯性的把asp与php分为两个主机系列几进行销售.由于asp只 ...

  9. mysql 5.6并行复制事件分发机制

    并行复制相关线程 在MySQL 5.6并行复制中,当设置set global slave_parallel_workers=2时,共有4个复制相关的线程,如下: +----+------------- ...

  10. elixir 高可用系列(五) Supervisor

    概述 OTP 平台的容错性高,是因为它提供了机制来监控所有 processes 的状态,如果有进程出现异常, 不仅可以及时检测到错误,还可以对 processes 进行重启等操作. 有了 superv ...