我们知道,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属性名相同,(在方法里的名字首字母要大写)
转载自:http://blog.csdn.net/tounaobun/article/details/8065766
struts2与spring后生命周期:http://blog.csdn.net/wxy_g/article/details/2071662