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

一、Struts的异常处理机制

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

public String execute() throws Exception

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

//我们定义一个Action
public class LoginAction extends ActionSupport {
public String execute() throws Exception{
//抛出java.lang.ArithmeticException异常
int a = 3/0;
return SUCCESS;
}
}
//struts.xml
<struts>
<package name="walker" namespace="/" extends="struts-default">
<action name="login" class="MyPackage.LoginAction">
<result name="success">/index.jsp</result> //这块代码等会介绍
<exception-mapping exception="java.lang.ArithmeticException" result="exception" />
<result name="exception">/exception.jsp</result>
</action>
</package>
</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中,对于一个类的命名是依照驼峰式命名规范来的(每个单词的首字母大写,其余字符小写),所以插件在解析的时候会利用这个规范,例如下面的一些例子:

Action:MyInfo------------URL:my-info
Action:UserMessage-------URL:user-message

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

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

Action:MyAction------------URL:my
Action:UserAction----------URL:user

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

my.action.LoginAction------URL:/login
my.actions.user.LoginAction----URL:/user/login
him.struts.name.LoginAction----URL:/name/login
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。当然啊,这个目录是默认的,后面我们会介绍通过配置指定成我们想用的目录。下面我们通过具体的例子完整的感受下:

//首先创建一个Action
public class MyInfo implements Action { public String execute() throws Exception{ return "index";
}
}

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

请求my-info:

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

//创建Action,xxxAction
public class MyAction {
public String execute() throws Exception{
return "index";
}
}

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

请求/my:

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

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

public class MyAction  {
public String execute() throws Exception{
return "index";
}
}
//第二个Action命名为:MyIndexAction

下面看看完整演示:

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

创建MyIndexAction 的视图页面:

请求/my:

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

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

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

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

//指定Convention插件默认从哪些包中搜索Action
<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。当然我们可以修改或者添加我们自己的包以便在项目中直接使用。

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

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

<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. Robot Framework 关键字自定义

    关键字自定义有三种方法: 1.在自动化目录中右键-->New User Keyword 2.选中case中的步骤(可选多行),右键-->Extract Keyword 3.自己写模块,自定 ...

  2. idea 中设置成公司规范的代码格式

    优雅的编码格式是一个程序员的必备素质. 最近切换到了 idea,想对自己的代码进行格式化的时候希望能自动排版成公司规定的格式,可以做以下设置: 打开 idea 的 preference: 左侧找到 c ...

  3. Android使用Aspectj

    使用AspectJ 集成步骤: 1.AS配置Aspectj环境 2.配置使用ajc编译 4.定义注解 5.配置规则 6.使用 7.注意事项 AS配置Aspectj环境.Aspect目前最新版本为 1. ...

  4. 解决win10 关键错误开始菜单和cortana无法工作 的问题(转-真的成功了)

    问题描述: 一次强制关机后出现了这个对话框,注销.重启均无法解决问题 解决过程[因为我用的英文版操作系统,所以截图都是英文,请大家自行对照自己的操作系统]: 1.ctrl+alt+del 打开任务管理 ...

  5. 基于均值漂移的三维网格分割算法(Mean Shift)

    mean shift算法是一种强大的无参数离散数据点的聚类方法,其在图像平滑.图像分割以及目标跟踪等方面都有着广泛的应用.[Yamauchi et al. 2005]基于mean shift算法提出了 ...

  6. J2那几个E和Web基础

    收到PHP童鞋的反馈: 我觉得不用讲太基础的语法,基础语法大家自己去看,主要讲讲java web开发的一个流程,从开始写代码,到编译,发布,上线,回滚整个流程 大体上的环节,以及需要用到哪些工具 具体 ...

  7. MySQL大数据量分页查询

    mysql大数据量使用limit分页,随着页码的增大,查询效率越低下. 测试实验 1.   直接用limit start, count分页语句, 也是我程序中用的方法: select * from p ...

  8. 大数据学习记录之ssh绵密登录

    1,在服务器端 ssh-keygen 2,使用ssh-copy-id 192.168.2.146 3,再测试一下ssh 192.168.2.146 exit 退出当前登录 具体流程为:A,B两台机器 ...

  9. 【C#】组件分享:FormDragger-窗体拖拽器

    适用:.net2.0+ winform项目 介绍: 类似QQ.迅雷等讲究UI体验的软件,都支持在窗口内多处地方拖动窗口,而不必老实巴交的去顶部标题栏拖,这个组件就是让winform也能这样随性拖拽,随 ...

  10. swfobject.js加载swf,关于是否加加载完成;

    这几个帖子可以参考下 http://bbs.9ria.com/forum.php?mod=viewthread&page=1&tid=38913 http://bbs.9ria.com ...