上篇 Struts2框架的基本使用(二)介绍了Action和result的相关配置操作,本篇接着介绍剩下的异常处理机制和Convention插件的使用。下篇文章介绍的是Struts2框架中标签库的使用情况。

一、Struts的异常处理机制

     每一个优秀的MVC框架都有一套完善的异常处理机制。我们不希望在Action中try..catch捕获异常,这样整个Action中耦合了大量的异常处理代码,一旦以后需要修改异常处理的代码就需要在Action中做大量变动,这是我们不愿意看到的。我们可以看到Struts框架的默认执行方法execute:

  1. public String execute() throws Exception

该方法抛出所有异常,也就是我们不需要在Action中处理任何异常,但是抛出的异常又在哪被捕获了呢?在Struts框架中默认是定义了一个异常拦截器,用于捕获Action抛出的异常,它有点像我们的核心拦截器。一旦捕获到异常信息,会去struts.xml配置文件中查找该异常信息所对应的物理视图的位置,然后请求该视图页。所以我们只需要在struts.xml文件中指定映射关系即可。下面看一个例子:

  1. //我们定义一个Action
  2. public class LoginAction extends ActionSupport {
  3. public String execute() throws Exception{
  4. //抛出java.lang.ArithmeticException异常
  5. int a = 3/0;
  6. return SUCCESS;
  7. }
  8. }
  1. //struts.xml
  2. <struts>
  3. <package name="walker" namespace="/" extends="struts-default">
  4. <action name="login" class="MyPackage.LoginAction">
  5. <result name="success">/index.jsp</result>
  6. //这块代码等会介绍
  7. <exception-mapping exception="java.lang.ArithmeticException" result="exception" />
  8. <result name="exception">/exception.jsp</result>
  9. </action>
  10. </package>
  11. </struts>

当我们请求login的时候,LoginAction 在响应我们请求的时候抛出java.lang.ArithmeticException异常,于是异常拦截器捕获到异常信息之后从struts.xml中找到该异常对应的视图,dispather该页面。结果如下:

我们在Action中使用exception-mapping元素配置了异常的映射关系,该元素主要有以下两个属性:

  • exception:该属性指定了具体的异常类型
  • result:该属性用于指定一个result元素

其中的result属性的值只是指定了一个抽象的result,具体的result元素还需要自行实现,正如我们上述代码展示的一样,exception-mapping 元素的result属性指定了一个名为exception的result元素,紧接着自定义了一个具体的result元素映射到exception.jsp视图页面。

     这样就完成了对一个异常的简单映射,在实际开发中,我们需要根据自己的代码判断可能发生的异常,显式的在struts.xml中指定映射关系,避免让用户直接看到这样的异常信息。

虽然这样使得用户无法直接看到抛出的异常信息,但是对于我们程序员来说,如果想要查看异常信息调试程序该怎么办呢?这一点将在下篇文章介绍标签库的使用时说明。

二、Convention插件的约定

     自Struts2.1以来,引入了Convention插件来实现开发"零配置",但是正真做到零配置还是很难的,Convention插件已经在尽力的减少配置操作了。在之前介绍的内容中,我们做了很多的配置,而使用该插件的目的就是减少这些配置的次数甚至达到零配置,但是我们需要记住这些“约定”,因为该插件就是根据这些约定实现自动配置。

     Struts包下lib中有个jar包,struts2-convention-plugin-2.3.32.jar。这就是Convention插件的jar包,我们将它引入到项目中。我们首先看第一个约定,Action的搜索和映射约定。之前我们自定义一个Action是需要在Struts.xml中通过action元素的name和class实现请求和响应映射,现在我们可以使用插件省去在struts.xml中配置的过程。我们的Convention插件会自动搜索所有位于action,actions,struts,struts2包下的Java类,遇到以下两种情况,就会把该Java类当做Action处理。

  • 实现了com.opensymphony.xwork2.Action的Java类
  • 类名类似于:xxxAction的Java类

对于以上两种情况,插件才能够自动识别这是一个Action,还有一点需要注意的是,该插件一般只会在上述提到的四个包中搜索Java类,如果想要使用这种约定,一般需要将Java类的包命名为以上四种之一。当然是可以通过配置修改这些默认搜索的包的,后文介绍。

以上介绍了如何利用约定让核心拦截器可以通过插件搜索到具体的Action,下面介绍如何让这些Action能够对应于具体的URL请求。我们知道在Java中,对于一个类的命名是依照驼峰式命名规范来的(每个单词的首字母大写,其余字符小写),所以插件在解析的时候会利用这个规范,例如下面的一些例子:

  1. ActionMyInfo------------URLmy-info
  2. ActionUserMessage-------URLuser-message

上述的这种方式定义的Action在解析成URL的时候,会拆分成一个一个的单词,单词之间使用中划线连接。连接之后的结果作为该Action对应的URL。

还有一种方式定义的Action,在定义Java类的时候命名以XXXAction的形式,也会被解析为一个Action。插件在解析它的时候就简单了,去掉后面的Action,剩下的就是该Action对应的URL。例如:

  1. ActionMyAction------------URLmy
  2. ActionUserAction----------URLuser

有关第一个约定还有一点需要注意下,以前我们配置Action的时候都是在package元素中配置的,也就是每个Action都会有一个namespace(没有显式指明的为默认命名空间下),那么我们这种约定式的配置如何区分具有相同名称的Action了呢?Convention插件通过该Action的包进行区分,例如:

  1. my.action.LoginAction------URL:/login
  2. my.actions.user.LoginAction----URL:/user/login
  3. him.struts.name.LoginAction----URL:/name/login
  4. her.struts2.age.LoginAction----URL:/age/login

如上所示,Convention通过该Action的包来指定namespace的值。

接下来我们看看第二个约定,按约定映射结果。默认情况下,Convention总会到WEB-INF/content路径下查找视图资源,也就是根据Action返回的字符串组装视图资源的逻辑 名称。例如:LoginAction返回的SUCCESS,插件会到content目录下找login-success.jsp或者login-success.html。这种组装的格式为:actionName-resultCode.suffix。当然啊,这个目录是默认的,后面我们会介绍通过配置指定成我们想用的目录。下面我们通过具体的例子完整的感受下:

  1. //首先创建一个Action
  2. public class MyInfo implements Action {
  3. public String execute() throws Exception{
  4. return "index";
  5. }
  6. }

找到WEB-INF/content路径,创建视图文件:

请求my-info:

接下来我们看看另外一种方式的实现:

  1. //创建Action,xxxAction
  2. public class MyAction {
  3. public String execute() throws Exception{
  4. return "index";
  5. }
  6. }

创建对应返回的视图文件:

请求/my:

我们可以看到利用Convention插件,几乎零配置,只需要记住几个约定即可。

下面看Convention的第三个约定,Action链式约定。我们之前介绍过,可以通过指定result元素的type属性值为redirectAction来使得Action的返回结果继续指向另外一个Action,从而形成链式Action。那么我们如何约定链式Action呢?我们只要将第二个Action的Java类放在和第一个Action的Java类同目录,并依照约定命名第二个Action即可。第二个Action的命名规则如下:firstActionName+resultCode。例如:

  1. public class MyAction {
  2. public String execute() throws Exception{
  3. return "index";
  4. }
  5. }
  6. //第二个Action命名为:MyIndexAction

下面看看完整演示:

  1. public class MyAction {
  2. public String execute() throws Exception{
  3. System.out.println("myAction is running");
  4. return "index";
  5. }
  6. }
  1. //和MyAction相同包下
  2. public class MyIndexAction extends ActionSupport {
  3. public String execute() throws Exception{
  4. System.out.println("myIndexAction is running");
  5. return SUCCESS;
  6. }
  7. }

创建MyIndexAction 的视图页面:

请求/my:

从控制台的输出我们也是能够看出来,这种Action的链式调用过程的。其中需要注意的是:只有在MyAction找不到指定的物理视图文件的时候才会到自己同包下查找是否存在匹配的下一个Action,也就是框架优先查找视图资源,在没有找到的情况下才会搜索是否有匹配的Action,所以我们如果想要实现链式Action处理的话,前面的Action返回的逻辑名一定不能匹配到任何物理视图。

三、Convention插件约定的一些细节

     在Convention插件中,提供了大量的配置常量用于配置Convention的一些默认值。

Convention中定义的所有的常量都在Convention的jar包的struts-plugin.xml文件中定义了,我们关注几个重点的,如果日后项目中需要用到一些配置可以返回来查找。

  1. //指定Convention插件默认从哪些包中搜索Action
  2. <constant name="struts.convention.exclude.packages" value="org.apache.struts.*,org.apache.struts2.*,org.springframework.web.struts.*,org.springframework.web.struts2.*,org.hibernate.*"/>

我们看到该常量指定了四个包,正是我们之前强调的action ,actions ,struts,struts2。当然我们可以修改或者添加我们自己的包以便在项目中直接使用。

  1. <constant name="struts.convention.result.path" value="/WEB-INF/content/"/>

该常量指定了插件默认寻找资源文件的起点,我们也可以自己定义想要它从哪开始搜索资源文件。

  1. <constant name="struts.convention.action.suffix" value="Action"/>

我们之前可以为Java类命名为xxxAction表示这是一个Action,其实我们也可以通过修改该常量的值来指定什么后缀的Java类可以被视作Action。

等等还有很多常量的配置在我们日常的项目中具有重大作用,大家在使用的时候可以返回来查阅。

到目前为止,有关Struts2的基本使用就简单的介绍完了,下篇介绍struts2的标签库技术。总结的不好,望大家不吝赐教!

Struts2框架的基本使用(三)的更多相关文章

  1. struts2框架学习之第三天

    day03 上传下载 1        上传下载组件介绍 l  jspSmartUpload(model1的年代): l  apache-commons-fileupload,Struts2默认上传组 ...

  2. 从零打造在线网盘系统之Struts2框架配置全解析

    欢迎浏览Java工程师SSH教程从零打造在线网盘系统系列教程,本系列教程将会使用SSH(Struts2+Spring+Hibernate)打造一个在线网盘系统,本系列教程是从零开始,所以会详细以及着重 ...

  3. Struts2框架学习(三) 数据处理

    Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:Value ...

  4. JavaWeb_(Struts2框架)Struts创建Action的三种方式

    此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...

  5. Struts2框架基础

    Struts2框架基础 1.Java的框架 1.1.框架简介 在大型项目开发过程中,经常会使用到一些框架,这样做好的好处是能够提高工作效率,在java中最常用的的框架就是SSH,这其实是三个框架的简称 ...

  6. struts2 框架处理流程

    struts2 框架处理流程 流程图如下: 注意:StrutsPrepareAndExecuteFilter替代了2.1.3以前的FilterDispatcher过滤器,使得在执行Action之前可以 ...

  7. 搭建一个简单struts2框架的登陆

    第一步:下载struts2对应的jar包,可以到struts官网下载:http://struts.apache.org/download.cgi#struts252 出于学习的目的,可以把整个完整的压 ...

  8. Struts2框架之-注解开发

    Struts2主要解决了从JSP到Action上的流程管理,如何进行Uri和action类中每个方法的绑定这是重点,在这里先简单看一下配置文件中的简单配置: <span style=" ...

  9. Struts2 框架的快速搭建

    方便myEclipse 手动配置Struts2框架,写下此文,需要的朋友拿走不谢~ 一.引入JAR包 WEB工程->WebRoot->WEB-INF->lib引入Struts2对应版 ...

随机推荐

  1. HTML5学习笔记<二>:元素,属性,格式化

    HTML元素 元素是指从开始标签到结束标签的所有代码. 开始(开放)标签 元素内容 结束(闭合)标签 <p> this is my web page </p> 没有内容的 HT ...

  2. eclipse中以debug方式启动tomcat报错

    在eclipse中debug  Tomcat报错,错误如下: FATAL ERROR in native method: JDWP No transports initialized, jvmtiEr ...

  3. .NET Framework 各版本区别(简介)

    本文通过在网络资料整理而得. .NET Framework1.1 1.自带了对mobile asp.net控件的支持.(在1.0版本是以附加功能实现) 2.加入了ASP.NET应用程序的代码安全访问功 ...

  4. Linux块设备驱动(二) _MTD驱动及其用户空间编程

    MTD(Memory Technology Device)即常说的Flash等使用存储芯片的存储设备,MTD子系统对应的是块设备驱动框架中的设备驱动层,可以说,MTD就是针对Flash设备设计的标准化 ...

  5. java集合体系

    Collection接口: 1.单列集合类的根接口. 2.定义了可用于操作List.Set的方法--增删改查: 3.继承自Iterable<E>接口,该接口中提供了iterator() 方 ...

  6. ASP.NET Core:CMD命令行+记事本 创建Console程序和Web Application

    今天看了Scott关于ASP.NET Core的介绍视频,发现用命令行一步一步新建项目.添加Package.Restore.Build.Run 执行的实现方式,更让容易让我们了解.NET Core的运 ...

  7. VMware workstation转到vsphere解决办法

    一.前因 上一篇http://www.cnblogs.com/cuncunjun/p/6611837.html 中提到,我想把本地的vmware workstation的虚拟机拷贝到服务器上,因为鄙人 ...

  8. 【转】FLEX中SharedObject介绍及应用

    ShareObject介绍: 1 ShareObject,顾名思义共享对象,而通常意义上的共享,从B/S结构上来讲,无非是客户端(浏览器端)的共享和服务器端的共享了,不错,ShareObject刚好份 ...

  9. BinarySearch的一些注意事项

    BinarySearch原理比较简单,不过在处理实际问题的过程中需要注意几个小问题: 1. 找出有序数组中第一个为某特定值的数,以及没找到则返回-1 2. 找出有序数组中最后一个为某特定值的数,以及没 ...

  10. 2.Maven 使用

    1 Maven使用 1.1 编写POM 就像Make的Makefile,Ant的build.xml一样,Maven项目的核心是pom.xml. 首先创建一个名为hello-world的文件夹(本书中各 ...