我们知道,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>
然后是一个Action类:
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()
...
...
不存在线程安全问题:对于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属性名相同,(在方法里的名字首字母要大写)