一、认识Action对象
Action对象是Struts2框架的重要对象,它主要用于对HTTP请求进行处理。在Struts2API中,Action对象是一个接口,它位于
com.opensymphony.xwork2包中。Struts2项目开发中,创建Action对象都要直接或间接实现此对象,其方法声明如下:
public interface Action{
public static final String SUCCESS="success";
public static final String NONE="none";
public static final String ERROR="error";
public static final String INPUT="input";
public static final String LOGIN="login";
public String execute() throws Execption;
}
在Action接口中,包含5个静态的成员变量,它们是Struts2API为处结果定义的静态变量
SUCCESS:代表Action执行成功的返回值,如果Action执行成功,需要返回到成功页面,就可以将返回值设置为SUCCESS。
NONE:代表Action执行成功返回值,但不需要返回到成功页面。
ERROR:代表Action执行失败返回值。eg,在一些验证失败的情况下,可以使用Action返回此值。
INPUT:代表需要返回到某个输入信息页面的返回值。eg,在修改某信息时,加载数据扣需要返回到修改页面,就可以将Action
对象处理的返回值设置为INPUT。
LOGIN:代表需要用户登录的返回值。eg,在验证用户是否登录时,Action验证失败,需要用户重新登录,就可以将Action对象
返回值设置为LOGIN
二、请求参数的注入原理
在Struts2中,表单提交的数据会自动注入与Action对象中相对应的属性,定与Sring框架中IOC注入原理相同,通过Action为属性提供
setter()方法进行注入
public class UserAction extends ActionSuppor{
//用户名属性
private String username;
public void setUsername(String username){
this.username = username;
}
public String getUsername(){
return username;
}
public String execute(){
return SUCCESS;
}
}
三、Action的基本流程
(1)浏览器请求web容器
(2)web容器调用doFiter()请求Struts2过滤器
(3)Struts2过滤器调用execute()请求Action
(4)Action返回success给Struts2过滤器
(5)Sturts返回message给message.jsp
(6)mmessage.jsp返回浏览器
浏览器(请求)-------->web容器(doFilter())---->Struts2过滤器(execute())------>Action
由于在web项目中配置Strut2的过滤器,所以当浏览器向web容器发送一个HTTP请求时,web容器就要调用struts过滤器的doFilter()方法,
此时Struts2就收到了HTTP请求。通过Struts的内部处理机制,它会判断这个HTTP请求是否与某个Action对象相匹配,如果找到了与这
匹配的Action,就调用Actoin对象的execute()方法,并根据处理结果返回相应的值,然后Strut2就会通过Action的返回值查找返回值所
映射的页面,最后通过一定的视图回应给浏览器。
四、动态Action
前面用到的Action对象,都是通过重写execute()方法实现对浏览器请求处理,一个Action处理多个用户请求
五、动态Action的应用
public class UserAction extends ActionSupport{
private String info;
//添加用户信息
public String add() throws Exception{
info="添加用户信息";
return "add"
}
public String update() throws Exception{
info="更新用户信息";
return "update";
}
public String getInfo(){
return info;
}
public void setInfo(String info){
this.info = info;
}
}
struts.xml
<struts>
<!-- 声明包 -->
<package name="myPackage" extends="struts-default">
<!-- 定义action -->
<action name="userAction" class="com.lyq.action.UserAction">
<result name="add">user_add.jsp</result>
<result name="update">user_update.jsp</result>
</action>
</package>
</struts>
user_add.jsp
<body>
<font color="red">
<s:property value="info"/>
</font>
</body>
user_upate.jsp
<body>
<font color="red">
<s:property value="info"/>
</font>
</body>
idex.jsp
<body>
<a href="userAction!add">添加用户</a>
<a href="userAction!update">更新用户</a>
</body>