我们知道,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()
...
...




从输出结果我们可以看出,框架首先会创建一个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属性名相同,(在方法里的名字首字母要大写)

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐