我们知道,Struts2结合了WebWork和Struts1的优点,并且,Struts2和Struts1之间有很大的不同,其中原因是因为大部分都是继承自WebWork框架。
在编写Struts2框架的过程中,Action和ActionForm合二为一。Action从Web容器中解放出来,大大降低了耦合度。因为它大可不必继承自Action类,
并且不存在现成安全。
下面简单测试下Struts2中Action的生命周期:
(1) 首先是最简单的Action(简单类型的变量)
首先是一个页面表单:
<form action="verify.action" method="post">
姓名:<input type="text" name="username" /> <br/>
密码:<input type="password" name="password" /><br/>
<input type="submit" value="登录" />
</form>
package zjut.tsw;
public class LoginAction {
/*
* 两个实例变量
*/
private String username;
private String password;
//构造方法
public LoginAction() {
System.out.println("Invoke LoginAction->constructor");
}
//Getter and Setter Methods
public String getUsername() {
System.out.println("Invoke getUsername()");
return username;
}
public void setUsername(String username) {
System.out.println("Invoke setUsername()");
this.username = username;
}
public String getPassword() {
System.out.println("Invoke getPassword()");
return password;
}
public void setPassword(String password) {
System.out.println("Invoke setPassword()");
this.password = password;
}
public String execute() {
System.out.println("LoginAction->execute()");
if(username.equals(password))
return "success";
else
return "fail";
}
}
struts.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.1//EN" "http://struts.apache.org/dtds/struts-2.1.dtd">
<struts>
<package name="struts2" extends="struts-default">
<action name="verify" class="zjut.tsw.LoginAction">
<result name="success">/loginSuccess.jsp</result>
<result name="fail">/loginFail.jsp</result>
</action>
</package>
</struts>
loginSuccess.jsp 和 loginFail.jsp分别显示“登录成功”和“登录失败”,代码就不贴了。
输出结果为:
Invoke LoginAction->constructor
Invoke setPassword()
Invoke setUsername()
LoginAction->execute()
Invoke LoginAction->constructor
Invoke setPassword()
Invoke setUsername()
LoginAction->execute()
Invoke LoginAction->constructor
Invoke setPassword()
Invoke setUsername()
LoginAction->execute()
...
...
(2)Action类里包含 Bean:
表单内容:
<form action="verify.action" method="post">
姓名:<input type="text" name="user.username" /> <br/>
密码:<input type="password" name="user.password" /><br/>
<input type="submit" value="登录" />
</form>
User.java:
package zjut.tsw;
public class User {
public User() {
System.out.println("User->Constructor");
}
private String username;
public String getUsername() {
System.out.println("Invoke getUsername()");
return username;
}
public void setUsername(String username) {
System.out.println("Invoke setUsername()");
this.username = username;
}
public String getPassword() {
System.out.println("Invoke getPassword()");
return password;
}
public void setPassword(String password) {
System.out.println("Invoke setPassword()");
this.password = password;
}
private String password;
}
LoginAction.java:
package zjut.tsw;
public class LoginAction {
public LoginAction() {
System.out.println("LoginAction->Constructor");
}
private User user;
public User getUser() {
System.out.println("Invoke GetUser()");
return user;
}
public void setUser(User user) {
System.out.println("Invoke setUser()");
this.user = user;
}
public String execute() {
System.out.println("Invoke execute()");
System.out.println("LoginAction->execute()");
if (user.getUsername().equals(user.getPassword()))
return "success";
else
return "fail";
}
}
输出:
LoginAction->Constructor
Invoke GetUser()
User->Constructor
Invoke setUser()
Invoke setPassword()
Invoke GetUser()
Invoke setUsername()
Invoke execute()
LoginAction->execute()
Invoke getUsername()
Invoke getPassword()
LoginAction->Constructor
Invoke GetUser()
User->Constructor
Invoke setUser()
Invoke setPassword()
Invoke GetUser()
Invoke setUsername()
Invoke execute()
LoginAction->execute()
Invoke getUsername()
Invoke getPassword()
...
...
从输出结果我们可以看出,框架首先会创建一个LoginAction对象,然后调用Setter方法将表单里的值赋值给相应的变量。赋值完后再调用execute方法,然后通过struts.xml中的配置定位到相应的处理页面。
不存在线程安全问题:对于struts1框架,对于每一次请求,都会用同一个线程来处理,这样如果存在一些共享变量,会引起线程安全问题,而struts2则不存在,因为每一次请求都会新建一个对象。
另外表单里的name属性值和相应的Setter和Getter方法对应,和具体的变量名没有关系。
比如: 对于表单里的这样一个输入框 :
<input type="text" name="weight" />
在Action类里可以这样写:
private String w;
public void setWeight(String w) {
this.w = w;
}
public String getWeight() {
return w;
}
总之,setXXX() 和 getXXX() 中的XXX名要和表单里的name属性名相同,(在方法里的名字首字母要大写)
转载自: http://blog.youkuaiyun.com/tounaobun/article/details/8065766
struts2与spring后生命周期:http://blog.youkuaiyun.com/wxy_g/article/details/2071662
本文详细解析了Struts2框架中Action的生命周期,包括如何处理表单提交、实例化Action对象、调用setter方法进行参数绑定及execute方法执行流程等。同时对比了Struts1与Struts2在处理请求上的差异。
6315

被折叠的 条评论
为什么被折叠?



