现在的位置: 首页 > 综合 > 正文

struts2 Action生命周期

2017年10月24日 ⁄ 综合 ⁄ 共 4052字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.