菜鸟学Struts2——Actions
在对Struts2的工作原理学习之后,对Struts2的Action进行学习。主要对Struts2文档Guides中的Action分支进行学习,如下图:

1、Model Driven(模型驱动)
Struts2可以让开发者不必在需要接收很多参数的时候,在Action定义一系列的属性,或者定义一个类属性传参的时候使用className.fieldName的形式传值。使用Struts2的Model Driven需要打开Model Driven拦截器,不过这个拦截器(scopedModelDriven)默认是打开的,只要将自己的包继承“struts-default”包即可(<package name="..." extends="struts-default" namespace="...">)。
(1)利用模型驱动进行开发,Action需要实现ModelDriven接口,并重写getModel()提供泛型中的Model对象。
package yaolin.core.action; import com.opensymphony.xwork2.ModelDriven;
import yaolin.core.entity.Person; public class PersonAction implements ModelDriven<Person>{ private Person person = new Person(); public String input() {
return "input";
} public String index() {
return "index";
}
// 重写ModelDriven的getModel()方法并提供Model对象
@Override
public Person getModel() {
return person;
}
// UI getter 这里只是方便页面取值
public Person getPerson() {
return person;
}
}
(2)Model有两个属性(name、age),提供必要getter和setter。
package yaolin.core.entity;
public class Person {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
(3)创建编辑页面(input.jsp)和回显页面(index.jsp),访问input.action到input.jsp填写信息提交到person.action(index方法处理)到index.jsp回显。
input.jsp不需要参数名不需要使用person.name、person.age,直接使用name和age。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>INPUT</title>
</head>
<body>
<!-- /person/... -->
<form action="person.action" method="post">
<input name="name">
<input name="age">
<input type="submit" value="to_index">
</form>
</body>
</html>
index.jsp直接获取person的值。
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>INPUT</title>
</head>
<body>
${person.name} - ${person.age}
</body>
</html>
(4)修改struts.xml对访问路径进行路由
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="person" extends="struts-default" namespace="/person">
<action name="person" class="yaolin.core.action.PersonAction" method="index">
<result name="index">/index.jsp</result>
</action>
<action name="input" class="yaolin.core.action.PersonAction" method="input">
<result name="input">/input.jsp</result>
</action>
</package>
</struts>
(5)访问input.action填写信息并提交观察结果


如果没有Model Driven则需要在Action,定义两个属性name、age而不是person并提供getter和setter,或者定义person并提供getter和setter同时将页面参数名称改成person.name、person.age
2、Action Chaining (Aciton链)
Action链可以将一个请求经过多个Action处理,并保持Request中的参数,这个Redirect重定向有点区别,Action链可以将请求叫同一个namespace的action处理,也可以交给其他namespace的action处理,实现Action Chain需要将result的type设置成“chain”。
(1)修改Struts.xml添加chain.action,还是使用ModelDriven学习中的input方法来处理这个请求,将result的type设置成“chain”把请求交给namespace="/chain"的chain.action处理。
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="person" extends="struts-default" namespace="/person">
<action name="person" class="yaolin.core.action.PersonAction" method="index">
<result name="index">/index.jsp</result>
</action>
<action name="input" class="yaolin.core.action.PersonAction" method="input">
<result name="input">/input.jsp</result>
</action>
<action name="chain" class="yaolin.core.action.PersonAction" method="input">
<result type="chain" name="input">
<param name="actionName">chain</param>
<param name="namespace">/chain</param>
</result>
</action>
</package> <package name="chain" extends="struts-default" namespace="/chain">
<action name="chain" class="yaolin.core.action.ChainAction" method="index">
<result name="index">/index.jsp</result>
</action>
</package>
</struts>
(2)创建ChainAction对请求进行再次处理,并对额外参数进行处理,结果还是回显在index.jsp页面中。ChainAction中将person的名字加上前缀“Chain:”同时将额外参数extras加到名字后面。
package yaolin.core.action;
import com.opensymphony.xwork2.ModelDriven;
import yaolin.core.entity.Person;
public class ChainAction implements ModelDriven<Person>{
private Person person = new Person();
private String extra;
public String index() {
// 修改person的name属性
person.setName("Chain : " + person.getName() + " " + extra);
return "index";
}
@Override
public Person getModel() {
return person;
}
// UI
public Person getPerson() {
return person;
}
// POI
public void setExtra(String extra) {
this.extra = extra;
}
}
(3)访问input.action并带上name,age和额外参数extras:http://localhost/person/chain.action?name=yaolin&age=18&extra=chen观察结果

3、ActionEventListener (Action事件监听器)
Action事件监听器可以使开发者在Action创建的时候加入一些业务逻辑,或者在Action处理出错的时候进行处理。整个Struts应用ActionEventListener只要一个实例就可以了,设置成单例,使用ActionEventListener可以在struts.xml中配置bean,ActionEventListener需要实现ActionEventListener接口。
(1)编写自己的ActionEventListener,并重写prepare()和handleException()方法,在prepare()方法中为Action的extra设置值
package yaolin.core.listener; import com.opensymphony.xwork2.ActionEventListener;
import com.opensymphony.xwork2.util.ValueStack; import yaolin.core.action.ChainAction; public class MyActionEventListener implements ActionEventListener{ @Override
public Object prepare(Object action, ValueStack stack) {
if (action instanceof ChainAction) {
// 设置Action的extra值
((ChainAction)action).setExtra("##ChainActionEventListener##");
}
return action;
} @Override
public String handleException(Throwable t, ValueStack stack) {
if (t != null) {
System.err.println(t.getMessage());
}
return null;
}
}
(2)在Struts.xml中配置ActionEventListener,指定其类型为其实现的主要接口com.opensymphony.xwork2.ActionEventListener。其他配置沿用之前两个部分学习的配置。
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd">
<struts>
<package name="person" extends="struts-default" namespace="/person">
<action name="person" class="yaolin.core.action.PersonAction" method="index">
<result name="index">/index.jsp</result>
</action>
<action name="input" class="yaolin.core.action.PersonAction" method="input">
<result name="input">/input.jsp</result>
</action>
<action name="chain" class="yaolin.core.action.PersonAction" method="input">
<result type="chain" name="input">
<param name="actionName">chain</param>
<param name="namespace">/chain</param>
</result>
</action>
</package> <package name="chain" extends="struts-default" namespace="/chain">
<action name="chain" class="yaolin.core.action.ChainAction" method="index">
<result name="index">/index.jsp</result>
</action>
</package> <!-- 配置ActionEventListener -->
<bean type="com.opensymphony.xwork2.ActionEventListener" class="yaolin.core.listener.MyActionEventListener"></bean>
</struts>
(3)直接访问/chain/chain.aciton不带参数,参数由ActionEventListener设置,观察结果

至此,Struts2中Guides的Action Tag学习了。
未完,待续。
菜鸟学Struts2——Actions的更多相关文章
- 菜鸟学Struts2——Results
在对Struts2的Action学习之后,对Struts2的Result进行学习.主要对Struts2文档Guides中的Results分支进行学习,如下图: 1.Result Types(Resul ...
- 菜鸟学Struts2——零配置(Convention )
又是周末,继续Struts2的学习,之前学习了,Struts的原理,Actions以及Results,今天对对Struts的Convention Plugin进行学习,如下图: Struts Conv ...
- 菜鸟学Struts2——Interceptors
昨天学习Struts2的Convention plugin,今天利用Convention plugin进行Interceptor学习,虽然是使用Convention plugin进行零配置开发,这只是 ...
- 菜鸟学Struts2——Struts工作原理
在完成Struts2的HelloWorld后,对Struts2的工作原理进行学习.Struts2框架可以按照模块来划分为Servlet Filters,Struts核心模块,拦截器和用户实现部分,其中 ...
- 菜鸟学Struts2——HelloWorld
写在前面 自从工作后就过上了只有一个月记忆的生活,太健忘,很多学过的东西因为用得少便忘记了,第二次学习struts,为了以后便于查阅,开始自己的博客之旅.Struts的学习还是从Hello World ...
- 菜鸟学自动化测试(八)----selenium 2.0环境搭建(基于maven)
菜鸟学自动化测试(八)----selenium 2.0环境搭建(基于maven) 2012-02-04 13:11 by 虫师, 11419 阅读, 5 评论, 收藏, 编辑 之前我就讲过一种方试来搭 ...
- 菜鸟学IT之四则运算升级版
菜鸟学IT之四则运算升级版 本次作业要求来自:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE1/homework/2213 团队代码github远程仓库的 ...
- 菜鸟学Java(十五)——Java反射机制(二)
上一篇博文<菜鸟学编程(九)——Java反射机制(一)>里面,向大家介绍了什么是Java的反射机制,以及Java的反射机制有什么用.上一篇比较偏重理论,理论的东西给人讲出来总感觉虚无缥缈, ...
- 菜鸟学Java(十四)——Java反射机制(一)
说到反射,相信有过编程经验的人都不会陌生.反射机制让Java变得更加的灵活.反射机制在Java的众多特性中是非常重要的一个.下面就让我们一点一点了解它是怎么一回事. 什么是反射 在运行状态中,对于任意 ...
随机推荐
- logstash file输入,无输出原因与解决办法
1.现象 很多同学在用logstash input 为file的时候,经常会出现如下问题:配置文件无误,logstash有时一直停留在等待输入的界面 2.解释 logstash作为日志分析的管道,在实 ...
- iOS系列文章
本博客全为原创,如果借鉴了其他文章会在博文的下面进行说明.欢迎转载,但要在文章中给出原文链接,谢谢. 有链接的说明已经发布,没有链接的说明还没有发布. 并不是所有的博文都在这里罗列,有兴趣的可以看博客 ...
- 从零开始编写自己的C#框架(25)——网站部署
导航 1.关掉访问保护 2.发布网站 3.复制网站到服务器 4.添加新网站 5.设置网站访问权限 6.设置文件夹访问权限 7.控制可更新文件夹执行权限 8.设置“应用程序池”.net版本与模式 9.附 ...
- 【开源】.Net 分布式服务中心
分布式服务中心 开源地址: http://git.oschina.net/chejiangyi/Dyd.BaseService.ServiceCenter 当垂直应用越来越多,应用之间交互不可避免,将 ...
- ASP.NET WebApi OWIN 实现 OAuth 2.0
OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. OAuth 允许用户提供一个令牌, ...
- 缓存工具类CacheHelper
代码: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Syst ...
- 微信小程序开发日记——高仿知乎日报(下)
本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP 要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该 ...
- jQuery遮罩层登录对话框
用户登录是许多网站必备的功能.有一种方式就是不管在网站的哪个页面,点击登录按钮就会弹出一个遮罩层,显示用户登录的对话框.这用方式比较灵活方便.而现在扫描二维码登录的方式也是很常见,例如QQ.微信.百度 ...
- BPM配置故事之案例6-条件可见与条件必填
小明兴奋的告诉大毛自己独立解决了必填和水印问题,腹黑的大毛决定给小明出一个进阶问题刷一下存在感. 大毛:我再考考你,我把表单改成了这样(下图).怎么做到,预算状态为"预算内"时,不 ...
- git init和git init -bare区别
1 Git init 和 git init –bare 的区别 用"git init"初始化的版本库用户也可以在该目录下执行所有git方面的操作.但别的用户在将更新push上来的 ...