1、Action是用来处理一次用户请求的对象
2、Action在MVC中到底充当什么角色呢?答案是模型,原因在于Struts2在运行过程中,关于Action的调用是通过FilterDispacher的,此时Action只是处于被调用而已。
3、关于Action的实现。
a、通过POJO实现。
只是通过一个简单的java类即可,并不需要继承某个类或者某个接口,但对于execute方法要求如下:
public String execute() throws Exception {
...
}
//1、关于execute方法要求访问权限是public
//2、无参
//3、返回值为字符串
//4、抛出Exception为可选
b、实现Action接口。
通过实现Action接口import com.opensymphony.xwork2.Action;//此处导入的Action接口一定要是xwork2下的。
public class SomeAction implements Action {
public String execute() throws Exception {
...
}
}
c、继承ActionSupport类
通过继承ActionSupport类。
import com.opensymphony.xwork2.ActionSupport;
public class SomeAction extends ActionSupport{
public String execute() throws Exception {
...
}
}
//1、ActionSupport类实现了Action接口。
//2、ActionSupport除了实现Action接口外还实现了Validateable(验证功能,通过validate()方法)、Validateaware(保存或恢复action或field级的错误信息)、
//TextProvider(获取本地信息文本的功能)、LocaleProvider(提供getLocal()方法来获取本地信息)
d、实际开发中由于ActionSupport实现了多个功能接口,所以建议使用继承ActionSupport方式。
4、execute()方法通常要完成一下工作:
a、搜集用户传过来的数据。
b、把搜集到的数据组织成逻辑层需要的格式。
c、调用逻辑层接口,进行处理。
d、准备下一个页面所需要的数据,并存在适当的地方。
e、转下一个页面。
5、基本数据对应方式(即请求页面和被请求的Action之间数据的传递)
a、使用属性驱动(基本数据类型):
请求页面中input标签的name属性要和被请求的Action中的属性名称一样。如果Action中的属性是private的,则要提供相对应的getter/setter方法。
b、使用属性驱动(直接使用域对象):
请求页面中input标签的name属性是某域对象的属性名如obj.xxx,同时要在Action中创建对应的域模型对象如SomeObj obj = new SomeObj();,并且要提供对应的
getter/setter方法。
c、模型驱动(ModelDriven):
它的基本实现方式是让Action实现一个接口ModelDriven,并实现该接口的getModel()方法,这个方法返回的就是Action所使用的数据模型对象,该方式只能使用一个 Model
SomeAction.java:
import ....
public class SomeAction extends ActionSupport implements ModelDriven {
private SomeObj obj = new SomeObj();//注意,此时不再需要提供该对象的getter/setter方法了。
public Object getModel() {
return obj;
}
......
}//在请求页面中input中name属性值和所请求的Action对象中的属性对应即可,此时不必再加前缀。
6、如果请求页面中有checkbox控件,这样的控件会传入多个值,可以在用数组或集合。
7、通配符。
<action name="*_*" class="com.consion.demo.action.{1}Action" method="{2}Method">
<result name="welcome">/page/welcome.jsp</result>
</action>
以上的"*"代表长度不为0的任意字符 ,比如访问的是Some_add.action,则对应的Action是SomeAction,方法是addMethod()。
8、配置Action,如果class属性为空,则默认是ActionSupport类,该类中的execute()方法默认返回”success“,如果某个页面放置在WEB_INF中,则可以通过下面配置,其中result默认name="success"
<action name="someAction">
<result>/WEB_INF/page/jsp/some.jsp</result>
</action>
9、在Struts2中,每次web请求都会新建一个实例。
10、调用非execute()方法,可以通过在请求URL使用!,如/demo/someAction!someMethod.action,其中someMethod是someAction中的方法。