Struts2框架的基本使用(二)
上一篇 Struts2框架的基本使用 我们限于篇幅,最后简单介绍了Action的配置问题,本篇接着介绍有关框架的一些其他基本用法,主要内容如下:
- Action的基本配置
- result的基本配置
- Struts的异常处理机制
- Convention插件于“约定”的支持
一、Action的基本配置
上篇文章我们简单的看了Struts.xml中的package包元素的一些属性的使用情况,接下来我们看看Action的元素的一些属性及其使用情况。依然是上篇的Struts.xml文件。
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="walker" extends="struts-default">
<action name="login" class="MyPackage.LoginAction">
<result name="error">/error.jsp</result>
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
我们这里的action元素就对应于一个xxxAction,它的name属性指定了他所处理的URL,也就是我们请求/login的时候核心拦截器会匹配到此Action。class属性指定了该Action对应的物理路径。此外action元素还可以有method属性,该属性的默认值是execute,也就是当核心拦截器匹配到一个xxxAction的时候,会默认调用它的execute方法,当然我们也是可以使用method属性来显式指定某个方法作为默认方法调用。
<struts>
<package name="walker" extends="struts-default">
<action name="login" class="MyPackage.LoginAction" method="myMehod">
<result name="error">/error.jsp</result>
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
public class LoginAction extends ActionSupport {
private String username;
private String password;
public String getUsername(){
return this.username;
}
public void setUsername(String s){
this.username = s;
}
public String getPassword(){
return this.password;
}
public void setPassword(String s){
this.password = s;
}
public String execute() throws Exception{
if(getUsername().equals("walker")&&getPassword().equals("yam")){
ActionContext ac = ActionContext.getContext();
ac.put("login","hello 123");
return SUCCESS;
}
return ERROR;
}
public String myMehod(){
ActionContext ac = ActionContext.getContext();
ac.put("login","hello walker");
return SUCCESS;
}
}
我们在Struts.xml中指定了默认调用的方法是myMethod,从结果图中我们可以看出来,框架执行了我们的myMethod方法而不是默认的execute方法。
在配置action元素的时候,Struts框架允许我们在name属性字段使用通配符。即使用 * 代表一个或多个字符,然后我们可以在class属性或者子元素中使用{n}来获取 * 所代表的内容。例如:
<struts>
<package name="walker" extends="struts-default">
<action name="*" class="MyPackage.LoginAction" method="{1}">
<result name="error">/error.jsp</result>
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
当我们请求login这个URL时候,核心拦截器获取到这个URL,然后在struts.xml中查找,哪个Action能匹配这个URL呢?当它看到一个action的name值为 * 的时候,就决定用此action来响应此次请求,此时 * 的值为login,{1}表示name中的第一个 * 的值,此处自然也是login,于是显式调用LoginAction中的login方法。这就是统配符的简单使用情况,其实子元素result中也是可以通过{n}来获取 * 的值的,具体的等到介绍result的时候在详解。
下面说一下,有关使用通配符而产生的匹配顺序问题。
<struts>
<package name="walker" extends="struts-default">
<action name="loginABC" class="MyPackage.LoginAction" method="login">
<result name="error">/error.jsp</result>
<result name="success">/index.jsp</result>
</action>
<action name="*ABC" class="MyPackage.LoginAction" method="{1}">
<result name="error">/error.jsp</result>
<result name="success">/index.jsp</result>
</action>
<action name="*" class="MyPackage.LoginAction" method="{1}">
<result name="error">/error.jsp</result>
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
试想一下,如果我们请求 loginABC,框架会调用哪个action来响应呢?这三者都能匹配当前请求的URL。在Struts框架中loginABC原URL优先级最高,后面两种优先级相同,具体选择按照先后顺序。在此例中优先级为:
loginABC > *ABC > *
最后一个有关Action配置的是,为Action配置默认值,也就是在URL无法匹配到具体的某个Action的时候,默认的Action会去响应此URL。
<struts>
<package name="walker" extends="struts-default">
//为默认Action指定name
<default-action-ref name="err" />
//为默认Action指定class和处理结果
<action name="err" class="MyPackage.DefaultAction">
<result name="error">/error.jsp</result>
</action>
<action name="login" class="MyPackage.LoginAction" method="login">
<result name="error">/error.jsp</result>
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
public class DefaultAction extends ActionSupport {
public String execute() throws Exception{
return ERROR;
}
}
这样一旦用户输入了不合法的URL,我们一律跳转到错误页面。这一点在安全性方面还是很重要的。
二、配置处理结果
之前我们一直都在介绍有关Action的一些配置操作,但是始终没有说明Action返回的一个字符串是如何对应于物理视图资源的。其实从Action返回的字符串要想能够被核心拦截器识别是对应于哪个物理视图,是需要在Struts.xml中进行配置的。本小节就来学习下对处理结果的配置。
/*这是之前的Struts.xml配置文件*/
<struts>
<package name="walker" extends="struts-default">
<action name="login" class="MyPackage.LoginAction" method="login">
<result name="error">/error.jsp</result>
<result name="success">/index.jsp</result>
</action>
</package>
</struts>
我么可以看出来,配置逻辑视图和物理视图之间的映射是使用 result 元素来实现的。配置result元素时候通常是需要指定两个属性:
- name:对应于Action返回的字符串的值
- type:指定结果类型,默认值是dispatcher,可以省略
对于上面的两个属性,name属性中指定了一个字符串,如果该Action返回的是对应的字符串,那么核心拦截器就会知道该视图的物理位置。至于type属性,我们打开sturts-default.xml文件:
<result-types>
<result-type name="chain" class="com.opensymphony.xwork2.ActionChainResult"/>
//默认类型
<result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult" default="true"/>
<result-type name="httpheader" class="org.apache.struts2.dispatcher.HttpHeaderResult"/>
<result-type name="redirectAction" class="org.apache.struts2.dispatcher.ServletActionRedirectResult"/>
<result-type name="stream" class="org.apache.struts2.dispatcher.StreamResult"/>
<result-type name="xslt" class="org.apache.struts2.views.xslt.XSLTResult"/>
<result-type name="plainText" class="org.apache.struts2.dispatcher.PlainTextResult" />
<result-type name="postback" class="org.apache.struts2.dispatcher.PostbackResult" />
</result-types>
以上是Struts框架为我们提供的默认的type类型,至于这些type具有什么作用,马上介绍。此处我们还应该知道,如果想要自定义一个结果类型的话,首先需要手写一个继承自com.opensymphony.xwork2.Result,然后在struts.xml文件中使用上述的元素配置定义。最后我们就可以在result元素中使用了。
首先我们我们看第一个type类型:plainText,它没什么实际的意义,主要用于显示视图的源代码。例如:
<struts>
<package name="walker" extends="struts-default">
<action name="login" class="MyPackage.LoginAction" method="login">
<result name="error">/error.jsp</result>
//此处指定了type类型为plainText
<result name="success" type="plainText">/index.jsp</result>
</action>
</package>
</struts>
可以看到,返回的是index的源代码。从此例我们可以看出,type的作用类似于告诉核心拦截器,对于刚刚拿到的物理视图,该以怎样的形式响应用户,默认的是dispather,就是转发的意思,也就是forward请求该页面,而对于我们刚刚指定的typeplainText,就是响应用户以源代码。虽然例子没什么实际价值,但是我们从中推测出type究竟在对应物理视图的过程中扮演了怎样的角色。
第二个type类型是:redirect。它和dispather很是类似,只不过dispather是同一次请求的转发操作,而redirect则是重新的一次request,会丢失上次请求中的所有参数值。由于和dispather很是类似,此处不再赘述。
第三个type类型是:redirectAction。它和redirect又很相似,只不过redirect一般用于请求具体的资源,而redirectAction主要用于请求Action,形成Action处理链。
<struts>
<package name="walker" extends="struts-default">
<default-action-ref name="err"/>
<action name="err" class="MyPackage.DefaultAction">
<result name="error">/error.jsp</result>
</action>
<action name="login" class="MyPackage.LoginAction" method="login">
<result name="error">/error.jsp</result>
<result name="success" type="redirectAction">err</result>
</action>
</package>
</struts>
如上述代码所示,我们loginAction处理完成之后,通过result元素的type属性指定了下一个action为err。对于同package下的Action可以使用相对路劲,如果非相同的package,则需要使用Parma元素添加命名空间。
<struts>
<package name="walker" extends="struts-default" namespace="/aaa">
<default-action-ref name="err"/>
<action name="err" class="MyPackage.DefaultAction">
<result name="error">/error.jsp</result>
</action>
</package>
<package name="walker2" extends="struts-default">
<action name="login" class="MyPackage.LoginAction" method="login">
<result name="error">/error.jsp</result>
<result name="success" type="redirectAction">
<param name="actionName">err</param>
<param name="namespace">/aaa</param>
</result>
</action>
</package>
</struts>
代码比较简单,这里就不在赘述了。
最后介绍一点有关result配置的内容,我们可以使用全局结果来使得某些结果可以被所有的Action使用。我们看个例子:
<struts>
<package name="walker2" extends="struts-default">
<global-results>
<result name="error">/error.jsp</result>
</global-results>
<action name="login" class="MyPackage.LoginAction">
<result name="success" type="redirectAction">
<param name="actionName">err</param>
<param name="namespace">/aaa</param>
</result>
</action>
</package>
</struts>
我们在login这个Action中并没有配置error对应的result元素,但是使用global-results元素配置了一个全局的结果,也就是如果某个Action返回error,但是在自己的result子元素中没有找到该结果对应的物理视图,就会跑到全局下搜索,如果找到立即使用。此例中我们故意输错密码,看到的结果如下:
虽然我们没有配置error结果对应的物理视图,但是通过查找全局的结果,框架还是找到error.jsp并forward结果返回。需要注意的是,局部结果的优先级是高于全局的,也就是如果某个Action返回的结果可以在自己的result元素中找到,就不会搜索全局下的结果。因为是全局的,使用的时候还是慎重。
篇幅限制,未完待续。。。
Struts2框架的基本使用(二)的更多相关文章
- Struts2框架学习(二) Action
Struts2框架学习(二) Action Struts2框架中的Action类是一个单独的javabean对象.不像Struts1中还要去继承HttpServlet,耦合度减小了. 1,流程 拦截器 ...
- [ SSH框架 ] Struts2框架学习之二
一.Struts2访问Servlet的API 前面已经对 Struts2的流程已经执行完成了,但是如果表单中有参数如何进行接收又或者我们需要向页面保存一些数据,又要如何完成呢?我们可以通过学习 Str ...
- struts2框架学习(二)
---恢复内容开始--- 一.搭建步奏 1.新建web项目,进行必备Jar包的拷贝,放到lib目录以便项目的引用. 2.拷贝框架的核心配置文件Struts.xml,放到src目录下,保留一个基本配置即 ...
- Struts2框架基础
Struts2框架基础 1.Java的框架 1.1.框架简介 在大型项目开发过程中,经常会使用到一些框架,这样做好的好处是能够提高工作效率,在java中最常用的的框架就是SSH,这其实是三个框架的简称 ...
- Struts2框架之-注解开发
Struts2主要解决了从JSP到Action上的流程管理,如何进行Uri和action类中每个方法的绑定这是重点,在这里先简单看一下配置文件中的简单配置: <span style=" ...
- Struts2 框架的快速搭建
方便myEclipse 手动配置Struts2框架,写下此文,需要的朋友拿走不谢~ 一.引入JAR包 WEB工程->WebRoot->WEB-INF->lib引入Struts2对应版 ...
- Struts2的标签库(二)——OGNL表达式
Struts2的标签库(二) --OGNL表达式 1.Struts2中的OGNL表达式增加了ValueStack的支持. 注:ValueStack--实际上是一个容器对象,该对象在启动Struts2框 ...
- 基于Struts2框架实现登录案例 之 使用Struts2标签库简化表单+继承ActionSupport完成输入交验
一,使用Struts2标签库简化表单 在文章[基于Struts2框架实现登录案例]的基础上,通过使用Struts标签库可以简化登录页面login2.jsp <%@ page language=& ...
- struts2框架开发的第一个应用
写这篇博文,主要是帮助那些刚接触struts2框架开发而不知所措的人,希望批评指正 一.先建立一个web project,命名为struts2 二.在webroot/WEB-INF/lib目录下添加如 ...
随机推荐
- .NET Core中的包、元包与框架
本文为翻译文章,原文:Packages, Metapackages and Frameworks .NET Core是一个由NuGet包组成的平台.一些产品受益于细粒度包的定义,也有一些受益于粗粒度包 ...
- Mysql主从配置讲解
一个主机上管理多个mysql实例 资源有限,只能用一台主机备份多个机器上的mysql,所以怎么才能在一台机器上运行多个mysql呢,肯定是要包括不同的端口,搜索一下mysql multi 可以配置管理 ...
- js动态加载的蒙板弹框
我们访问一些网站时总会遇到这种点击后,背景像被打上一层模板一样,这个是怎么做到的呢? 它是将这个弹框div独立于页面容器wrap,设置position为absolute,将其水平垂直之后都居中,设置弹 ...
- Maven项目搭建(一):Maven初体验
今天给大家介绍一个项目管理和综合工具:Maven. Maven: maven读作 ['meivin],本意是指可以被信任的领域专家,致力于传播知识(来自于http://en.wikipedia.org ...
- windows phone 8.1 FlipView 实现照片自动浏览
FlipView 控件也是一个集合控件,不过它和ListView等控件不同,ListView控件是一次显示多个项,而FlipView则是每次只显示一个项.在windows phone上通过默认的左右滑 ...
- JavaScript高级程序设计---学习笔记(一)
今天,2017.3.17开始利用课余时间仔细学习<JavaScript高级程序设计>,将需要掌握的知识点记录下来,争取把书里的所有代码敲一遍并掌握. 1.标识符命名最好是第一个字母小写,剩 ...
- QTP自动化测试框架课程的目标
QTP自动化测试框架课程的目标 随着技术发展演变,qtp自动化测试工具有逐渐被其他工具和技术替换的趋势,所以我们三个POPTEST合伙人决定把qtp自动化测试的一套课程开放免费,这套qtp自动化测试课 ...
- 老李分享:HTTP协议之请求和响应
老李分享:HTTP协议之请求和响应 HTTP请求头详解: GET http://www.foo.com/ HTTP/1.1 GET是请求方式,请求方式有GET/POST http://www.fo ...
- Java中执行shell笔记
在java中执行shell有好几种方式:第一种(exec)方式一 public static synchronized void runshell2() { File superuser = n ...
- JavaScript基础学习(三)—数组
一.数组简介 JavaScript数组的每一项都可以保存任何类型的数据,也就是说数组的第一个位置保存字符串,第二个位置可以保存数值,第三个位置可以保存对象,而且数组的大小是可以动态调整的,即可 ...