Struts2框架的基本使用(三)
上篇 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框架的基本使用(三)的更多相关文章
- struts2框架学习之第三天
day03 上传下载 1 上传下载组件介绍 l jspSmartUpload(model1的年代): l apache-commons-fileupload,Struts2默认上传组 ...
- 从零打造在线网盘系统之Struts2框架配置全解析
欢迎浏览Java工程师SSH教程从零打造在线网盘系统系列教程,本系列教程将会使用SSH(Struts2+Spring+Hibernate)打造一个在线网盘系统,本系列教程是从零开始,所以会详细以及着重 ...
- Struts2框架学习(三) 数据处理
Struts2框架学习(三) 数据处理 Struts2框架框架使用OGNL语言和值栈技术实现数据的流转处理. 值栈就相当于一个容器,用来存放数据,而OGNL是一种快速查询数据的语言. 值栈:Value ...
- JavaWeb_(Struts2框架)Struts创建Action的三种方式
此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...
- Struts2框架基础
Struts2框架基础 1.Java的框架 1.1.框架简介 在大型项目开发过程中,经常会使用到一些框架,这样做好的好处是能够提高工作效率,在java中最常用的的框架就是SSH,这其实是三个框架的简称 ...
- struts2 框架处理流程
struts2 框架处理流程 流程图如下: 注意:StrutsPrepareAndExecuteFilter替代了2.1.3以前的FilterDispatcher过滤器,使得在执行Action之前可以 ...
- 搭建一个简单struts2框架的登陆
第一步:下载struts2对应的jar包,可以到struts官网下载:http://struts.apache.org/download.cgi#struts252 出于学习的目的,可以把整个完整的压 ...
- Struts2框架之-注解开发
Struts2主要解决了从JSP到Action上的流程管理,如何进行Uri和action类中每个方法的绑定这是重点,在这里先简单看一下配置文件中的简单配置: <span style=" ...
- Struts2 框架的快速搭建
方便myEclipse 手动配置Struts2框架,写下此文,需要的朋友拿走不谢~ 一.引入JAR包 WEB工程->WebRoot->WEB-INF->lib引入Struts2对应版 ...
随机推荐
- java-信息安全(五)-非对称加密算法RSA
概述 信息安全基本概念: RSA算法(Ron Rivest.Adi Shamir.Leonard Adleman,人名组合) RSA RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rive ...
- gzip 与 gunzip 语法与示例
gzip 与 gunzip 语法与示例 语法: gunzip -c 被压缩的文件 > 已解压的文件示例: 将 catalina.out.gz 文件解压到 catalina.out 文件中: gu ...
- 解决ecshop进入后台服务器出现500的问题
ecshop安装完成以后,前台页面打开正常,但是后台页面大家会出现500错误,看了很多的论坛和网站,删除过top.htm里面的JS代码的,.htaccess文件的修改的,都没有解决,后来找到原因, 原 ...
- React开发的一些注意点
react是R系技术栈中最基础同时也是最核心的一环,2年不到获取了62.5k star(截止到目前),足可见其给力程度.下面对一些react日常开发中的注意事项进行罗列.建议初学的朋友还是先过一遍这篇 ...
- Android使用ADB命令和stetho查看app数据库
一.使用ADB命令查看 打开命令窗口,进入Android SDK目录下的platform-tools,执行命令: 1.输入:在windows下: adb shell 在linux下: ./adb sh ...
- Android开发遇到短信备份失败
今天做了一个有关ContentProvider的短信备份的小案例,遇到短信备份失败,费了一番周折后终于找到了问题所在 该案例是将短信写到一个xml文件然后保存在手机存储中实现短信的备份功能,关键实现代 ...
- Linux搭建FastFDFS文件管理系统搭建,部署及上传材料
昨天下午花了三四个小时在Linux centos 6 上搭建了一个分布式文件系统.纯粹是搭建来做自己的文件备份.所以把一些自己在其中遇到的一些问题给总结出来,免得更多人走错路. FastDFS 的一些 ...
- 开源的.NET媒体文件操作组件TagLib#解析
人生得意须尽欢 莫使金樽空对月.写博客都会在吃饭后,每次吃饭都要喝上二两小酒,写博客前都要闲扯,这些都是个人爱好,改不掉了,看不惯的人,还望多多包含一下,有相同爱好的同学,咱们可以一起喝着小酒一边吹牛 ...
- h5开发app之在线生成二维码
h5通过jquery和qrcode在线生成二维码 首先我们需要下载一个qrcode.js文件,然后依次引入jquery和qrcode文件. 1.创建一个输入框以便做演示使用: <input id ...
- 菜鸟学IT之IP基础
IT菜鸟,以后研究的方向是云计算,从基础的开始,这是第一篇博文.有不对的地方希望大家指正.IP是网络知识的基础,今天就开始学习IP. IP地址格式:IP地址就是"网络地址+主机地址" ...