Struts2中Action對象的set方法和get方法調用規則


    Struts的Action是采用的是多實例多線程設計,而不是像Servlet那樣采用單實例多線程設計,因此在struts中,一個請求就對應一個Action對象,個對象之間的數據相互之間互不干擾。沒接到一個新的請求,就產生一個新的Action對象,並對Action對象的各屬性賦予默認初始值。之后再根據一定的規則調用set方法給各屬性賦值,並根據一定規則調用get方法。也就是說,Action對象不是一開始就必須調用set方法的。本文重點講Action對象調用set和get方法的規則:

1.get方法的調用規則

    Action對象get方法的調用規則相對簡單,因此先說get方法的調用規則。調用get方法方法是為了獲取屬性值,這一點不僅僅在struts中是這樣,在任何java程序中,都是這樣的。那么什么時候才需要一個Action對象的屬性值呢?就目前本人探索和總結的結果來看,分為以下三種情況:

(一)、在Action請求轉發到下一個Action時(即result的type屬性為chain時),下一個Action有對應屬性的set方法;

    這種情況是為了傳遞數據,讓數據跟着Action流程的流轉而進入到下一個Action對象,因此是非常重要的。但是呢,這種傳遞不一定能達到想要的目的,意外出現在如果最初的http請求本身就有了對應的查詢參數值,則目標Action會在獲得了源Action的get值之后,再次去過的請求的查詢參數值,並用這個值作為set方法的傳入參數,在這種情況下,目標Filed的值還是http請求的查詢參數值。

(二)、在struts.xml配置文件中引用了相應的Action屬性;

    這種情況其實是顯式調用了get方法,所以一定會被調用,也沒什么好說的。

(三)有對應的request.getAttribute(),且之前沒有用過相應的request.setAttribute()。

   這里說的request.getAttribute()一般出現在視圖中,比如jsp的requestScope.filedName,或者顯示的request.getAttribute() java 代碼。

  Action對象get方法調用的具體規則流程如下:

 

需要強調的是,只有在真正需要數據的時候,才會調用get方法,而不是在離開Action的時候。所以,在下一個Action的攔截器之后,到達Action時,上一個Action的get方法才被調用(因為這時需要給目標Action賦值了,而賦值需要值的來源,所以就要調用上一個Action的get方法以獲得賦值的來源)。

還有需要強調的是,需要get方法時,總是調用最近Action對象的get方法,如果最近的Action沒有get方法,則調用次近的,知道最開始的那個Action。

2.set方法的調用規則

    Action對象set方法的調用規則相對於get方法來說比較復雜。同樣,在任何java程序中,set方法都是為了給對象的屬性賦值,因此,set方法的調用規則關乎到Action對象的數據是怎么獲取的,因此顯得尤為重要。

    因為set方法是給Action對象數據賦值的,所以,要知道set方法的調用規則,首先要清楚Action對象的屬性數據的來源有哪些。就本人目前探索和總結來看,Action對象的屬性數據的來源有以下兩類:(1)上一個Action的get方法、(2)http請求參數。這兩類數據來源也就對應了set方法的調用規則。

(一)從源Action的get方法中獲得

    這種情況對應於get方法調用規則中的第一種情況,也是在Action轉發時發生的,而且和get方法的第一種情況總是同時發生的,也就是說,這兩張情況要么都發生,要么都不發生。兩種情況共同完成Action對象的數據傳遞。

(二)從請求參數中來

    如果有對應的請求參數值,則這種情況一定會發生,及時上一種情況已經發生過了。這樣,如果源Action有對應的get方法,請求中也有對應的請求參數值(注意是getParameter到的值,而不是getAttribute到的值,Action是不能從request的Attribute中得到屬性值的),則一個get方法會被調用兩次,后面一次獲取的是請求參數中的值,最終的屬性值和請求參數一致。

    set方法調用規則的流程如下:

測試用的代碼如下:LoginAction是源Action,LoginAction2是目標Action。

 1 import com.opensymphony.xwork2.ActionSupport;
 2 import org.apache.logging.log4j.LogManager;
 3 import org.apache.logging.log4j.Logger;
 4 import org.apache.struts2.ServletActionContext;
 5 
 6 import javax.servlet.http.HttpServletRequest;
 7 import javax.servlet.http.HttpServletResponse;
 8 
 9 public class LoginAction2 extends ActionSupport{
10     private final Logger log = LogManager.getLogger(getClass());
11     private String username;
12     private String password;
13     private String usernameAndPassword;
14     private int age;
15 
16     public String getUsername() {
17         log.trace("getUsername is in invoked");
18 
19         return username;
20     }
21 
22     public void setUsername(String username) {
23         log.trace("setUsername is in invoked");
24 
25         this.username = username;
26     }
27 
28     public String getPassword() {
29         return password;
30     }
31 
32     public void setPassword(String password) {
33         this.password = password;
34     }
35 
36     public String getUsernameAndPassword() {
37         log.trace("getUsernameAndPassword is in invoked");
38 
39         return usernameAndPassword;
40     }
41 
42     public void setUsernameAndPassword(String usernameAndPassword) {
43         log.trace("setUsernameAndPassword is in invoked");
44 
45         this.usernameAndPassword = usernameAndPassword;
46     }
47 
48     @Override
49     public void validate() {
50         log.trace("validate is invoked");
51         HttpServletRequest request = ServletActionContext.getRequest();
52         HttpServletResponse response = ServletActionContext.getResponse();
53         System.out.println( request.getAttribute("age"));
54     }
55 
56     public int getAge() {
57         log.trace("getAge is invoked");
58         System.out.println("getAge:  "+age);
59 
60         return 70;
61     }
62 
63 //    public void setAge(int age) {
64 //        log.trace("setAge is invoked");
65 //        System.out.println("setAge:  "+age);
66 //        this.age = age;
67 //    }
68 }
  1 package edu.whu.swe.learnstruts2;
  2 
  3 import com.opensymphony.xwork2.ActionContext;
  4 import com.opensymphony.xwork2.ActionSupport;
  5 import edu.whu.swe.learnstruts2.service.LoginService;
  6 import edu.whu.swe.learnstruts2.service.impl.LoginServiceImpl;
  7 import org.apache.logging.log4j.LogManager;
  8 import org.apache.logging.log4j.Logger;
  9 import org.apache.struts2.ServletActionContext;
 10 
 11 import javax.servlet.RequestDispatcher;
 12 import javax.servlet.ServletContext;
 13 import javax.servlet.http.HttpServletRequest;
 14 import javax.servlet.http.HttpServletResponse;
 15 
 16 
 17 public class LoginAction extends ActionSupport {
 18     private final Logger log = LogManager.getLogger(getClass());
 19     private String username;
 20     private String password;
 21     private String alianname;
 22     private String othertest;
 23     private int age;
 24 
 25     private final LoginService loginService = new LoginServiceImpl();
 26 
 27 
 28     public String execute() throws Exception {
 29 
 30 
 31         if (!loginService.isLogin(username, password)) {
 32 
 33             return INPUT;
 34 
 35         }
 36         HttpServletRequest request = ServletActionContext.getRequest();
 37         HttpServletResponse response = ServletActionContext.getResponse();
 38 //        request.setAttribute("age", 22);
 39 //        this.age=22;
 40 
 41 /** 因為是使用的框架,所以重定向語句之后的代碼依舊會執行,但是業務邏輯已經轉到定向后的地方了 */
 42 //        ServletContext context =request.getSession().getServletContext();
 43 //        RequestDispatcher dispatcher=context.getRequestDispatcher("/usernameInvalide.jsp");
 44 //        System.out.println("print this before dispatcher");
 45 //        dispatcher.forward(request,response);
 46 //        System.out.println("print this after dispatcher");
 47 //        age+=1000;
 48 
 49 
 50         //
 51         System.out.println("LoginAction is executed");
 52         return SUCCESS;
 53 
 54     }
 55 
 56     public String getUsernameAndPassword() {
 57         log.trace("getUsernameAndPassword is in invoked");
 58         return username + password;
 59     }
 60 
 61     public void setUsernameAndPassword(String usernameAndPassword) {
 62         log.trace("setUsernameAndPassword is in invoked");
 63 
 64     }
 65 
 66 
 67     public String getUsername() {
 68         log.trace("getUsername is in invoked");
 69         return username;
 70     }
 71 
 72     public void setUsername(String username) {
 73         log.trace("setUsername is in invoked");
 74         this.username = username;
 75     }
 76 
 77     public String getPassword() {
 78         return password;
 79     }
 80 
 81     public void setPassword(String password) {
 82         this.password = password;
 83     }
 84 
 85 
 86     public String getAlianame() {
 87         log.trace("getAlianame is in invoked");
 88 
 89         return alianname;
 90     }
 91 
 92     public void setAlianame(String alianname) {
 93         log.trace("setAlianame is in invoked");
 94 
 95         this.alianname = alianname;
 96     }
 97 
 98     public String getOthertest() {
 99         return othertest;
100     }
101 
102     public void setOthertest(String othertest) {
103         this.othertest = othertest;
104     }
105 
106 
107     @Override
108     public void validate() {
109         log.trace("validate is invoked");
110     }
111 
112     public void setAge(int age) {
113         log.trace("setAge is invoked");
114         this.age = age + 33;
115     }
116 
117     public int getAge() {
118         log.trace("setAge is invoked");
119         return 55;
120     }
121 }

關鍵的struts.xml配置如下:

<action name="login1" class="edu.whu.swe.learnstruts2.LoginAction2">
            <result name="success">/welcome.jsp</result>
</action>


<action name="login" class="edu.whu.swe.learnstruts2.LoginAction">
            <result name="success" type="chain">
                <param name="actionName">login1</param>
                <param name="namespace">/</param>
            </result>
</action>

 測試結果如下:

不輸入age
2018-01-12 16:34:58.876 TRACE edu.whu.swe.learnstruts2.LoginAction setUsername - " setUsername is in invoked " 
2018-01-12 16:34:58.877 TRACE edu.whu.swe.learnstruts2.LoginAction validate - " validate is invoked " 
LoginAction is executed
2018-01-12 16:34:58.877 TRACE edu.whu.swe.learnstruts2.LoginAction getAge - " setAge is invoked " 
2018-01-12 16:34:58.878 TRACE edu.whu.swe.learnstruts2.LoginAction2 setAge - " setAge is invoked " 
2018-01-12 16:34:58.878 TRACE edu.whu.swe.learnstruts2.LoginAction getUsername - " getUsername is in invoked " 
2018-01-12 16:34:58.878 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsername - " setUsername is in invoked " 
2018-01-12 16:34:58.878 TRACE edu.whu.swe.learnstruts2.LoginAction getUsernameAndPassword - " getUsernameAndPassword is in invoked " 
2018-01-12 16:34:58.879 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsernameAndPassword - " setUsernameAndPassword is in invoked " 
2018-01-12 16:34:58.879 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsername - " setUsername is in invoked " 
2018-01-12 16:34:58.880 TRACE edu.whu.swe.learnstruts2.LoginAction2 validate - " validate is invoked " 
2018-01-12 16:34:58.883 TRACE edu.whu.swe.learnstruts2.LoginAction2 getUsername - " getUsername is in invoked " 
2018-01-12 16:34:58.883 TRACE edu.whu.swe.learnstruts2.LoginAction2 getAge - " getAge is invoked " 
2018-01-12 16:34:58.884 TRACE edu.whu.swe.learnstruts2.LoginAction2 getUsernameAndPassword - " getUsernameAndPassword is in invoked " 

輸入了age
2018-01-12 16:35:36.356 TRACE edu.whu.swe.learnstruts2.LoginAction setAge - " setAge is invoked " 
2018-01-12 16:35:36.356 TRACE edu.whu.swe.learnstruts2.LoginAction setUsername - " setUsername is in invoked " 
2018-01-12 16:35:36.357 TRACE edu.whu.swe.learnstruts2.LoginAction validate - " validate is invoked " 
LoginAction is executed
2018-01-12 16:35:36.358 TRACE edu.whu.swe.learnstruts2.LoginAction getAge - " setAge is invoked " 
2018-01-12 16:35:36.358 TRACE edu.whu.swe.learnstruts2.LoginAction2 setAge - " setAge is invoked " 
2018-01-12 16:35:36.358 TRACE edu.whu.swe.learnstruts2.LoginAction getUsername - " getUsername is in invoked " 
2018-01-12 16:35:36.359 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsername - " setUsername is in invoked " 
2018-01-12 16:35:36.359 TRACE edu.whu.swe.learnstruts2.LoginAction getUsernameAndPassword - " getUsernameAndPassword is in invoked " 
2018-01-12 16:35:36.359 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsernameAndPassword - " setUsernameAndPassword is in invoked " 
2018-01-12 16:35:36.360 TRACE edu.whu.swe.learnstruts2.LoginAction2 setAge - " setAge is invoked " 
2018-01-12 16:35:36.360 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsername - " setUsername is in invoked " 
2018-01-12 16:35:36.360 TRACE edu.whu.swe.learnstruts2.LoginAction2 validate - " validate is invoked " 
2018-01-12 16:35:36.363 TRACE edu.whu.swe.learnstruts2.LoginAction2 getUsername - " getUsername is in invoked " 
2018-01-12 16:35:36.363 TRACE edu.whu.swe.learnstruts2.LoginAction2 getAge - " getAge is invoked " 
2018-01-12 16:35:36.363 TRACE edu.whu.swe.learnstruts2.LoginAction2 getUsernameAndPassword - " getUsernameAndPassword is in invoked " 


沒有age表單
2018-01-12 16:37:41.549 TRACE edu.whu.swe.learnstruts2.LoginAction setUsername - " setUsername is in invoked " 
2018-01-12 16:37:41.591 TRACE edu.whu.swe.learnstruts2.LoginAction validate - " validate is invoked " 
LoginAction is executed
2018-01-12 16:37:41.610 TRACE edu.whu.swe.learnstruts2.LoginAction getAge - " setAge is invoked " 
2018-01-12 16:37:41.611 TRACE edu.whu.swe.learnstruts2.LoginAction2 setAge - " setAge is invoked " 
2018-01-12 16:37:41.611 TRACE edu.whu.swe.learnstruts2.LoginAction getUsername - " getUsername is in invoked " 
2018-01-12 16:37:41.611 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsername - " setUsername is in invoked " 
2018-01-12 16:37:41.612 TRACE edu.whu.swe.learnstruts2.LoginAction getUsernameAndPassword - " getUsernameAndPassword is in invoked " 
2018-01-12 16:37:41.612 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsernameAndPassword - " setUsernameAndPassword is in invoked " 
2018-01-12 16:37:41.615 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsername - " setUsername is in invoked " 
2018-01-12 16:37:41.622 TRACE edu.whu.swe.learnstruts2.LoginAction2 validate - " validate is invoked " 
2018-01-12 16:37:41.741 TRACE edu.whu.swe.learnstruts2.LoginAction2 getUsername - " getUsername is in invoked " 
2018-01-12 16:37:41.741 TRACE edu.whu.swe.learnstruts2.LoginAction2 getAge - " getAge is invoked " 
2018-01-12 16:37:41.742 TRACE edu.whu.swe.learnstruts2.LoginAction2 getUsernameAndPassword - " getUsernameAndPassword is in invoked " 

沒有age表單,在源Action有getAge{return age+55}和setAge{this.age=age+33},返回頁面結果是:age:55
2018-01-12 16:47:33.884 TRACE edu.whu.swe.learnstruts2.LoginAction setUsername - " setUsername is in invoked " 
2018-01-12 16:47:33.933 TRACE edu.whu.swe.learnstruts2.LoginAction validate - " validate is invoked " 
LoginAction is executed
2018-01-12 16:47:33.955 TRACE edu.whu.swe.learnstruts2.LoginAction getAge - " setAge is invoked " 
2018-01-12 16:47:33.955 TRACE edu.whu.swe.learnstruts2.LoginAction2 setAge - " setAge is invoked " 
2018-01-12 16:47:33.956 TRACE edu.whu.swe.learnstruts2.LoginAction getUsername - " getUsername is in invoked " 
2018-01-12 16:47:33.956 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsername - " setUsername is in invoked " 
2018-01-12 16:47:33.956 TRACE edu.whu.swe.learnstruts2.LoginAction getUsernameAndPassword - " getUsernameAndPassword is in invoked " 
2018-01-12 16:47:33.957 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsernameAndPassword - " setUsernameAndPassword is in invoked " 
2018-01-12 16:47:33.960 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsername - " setUsername is in invoked " 
2018-01-12 16:47:33.971 TRACE edu.whu.swe.learnstruts2.LoginAction2 validate - " validate is invoked " 
2018-01-12 16:47:34.132 TRACE edu.whu.swe.learnstruts2.LoginAction2 getUsername - " getUsername is in invoked " 
2018-01-12 16:47:34.133 TRACE edu.whu.swe.learnstruts2.LoginAction2 getAge - " getAge is invoked " 
2018-01-12 16:47:34.134 TRACE edu.whu.swe.learnstruts2.LoginAction2 getUsernameAndPassword - " getUsernameAndPassword is in invoked " 


輸入age表單值為666,在源Action有getAge{return age+55}和setAge{this.age=age+33},在目標Action中打印相應的Filed。返回頁面結果是:age:22
2018-01-12 17:19:51.730 TRACE edu.whu.swe.learnstruts2.LoginAction setAge - " setAge is invoked " 
2018-01-12 17:19:51.731 TRACE edu.whu.swe.learnstruts2.LoginAction setUsername - " setUsername is in invoked " 
2018-01-12 17:19:51.731 TRACE edu.whu.swe.learnstruts2.LoginAction validate - " validate is invoked " 
LoginAction is executed
2018-01-12 17:19:51.734 TRACE edu.whu.swe.learnstruts2.LoginAction getAge - " setAge is invoked " 
2018-01-12 17:19:51.734 TRACE edu.whu.swe.learnstruts2.LoginAction2 setAge - " setAge is invoked " 
setAge:  754
2018-01-12 17:19:51.735 TRACE edu.whu.swe.learnstruts2.LoginAction getUsername - " getUsername is in invoked " 
2018-01-12 17:19:51.736 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsername - " setUsername is in invoked " 
2018-01-12 17:19:51.736 TRACE edu.whu.swe.learnstruts2.LoginAction getUsernameAndPassword - " getUsernameAndPassword is in invoked " 
2018-01-12 17:19:51.736 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsernameAndPassword - " setUsernameAndPassword is in invoked " 
2018-01-12 17:19:51.737 TRACE edu.whu.swe.learnstruts2.LoginAction2 setAge - " setAge is invoked " 
setAge:  666
2018-01-12 17:19:51.737 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsername - " setUsername is in invoked " 
2018-01-12 17:19:51.738 TRACE edu.whu.swe.learnstruts2.LoginAction2 validate - " validate is invoked " 
2018-01-12 17:19:51.741 TRACE edu.whu.swe.learnstruts2.LoginAction2 getUsername - " getUsername is in invoked " 
2018-01-12 17:19:51.741 TRACE edu.whu.swe.learnstruts2.LoginAction2 getAge - " getAge is invoked " 
getAge:  666
2018-01-12 17:19:51.742 TRACE edu.whu.swe.learnstruts2.LoginAction2 getUsernameAndPassword - " getUsernameAndPassword is in invoked " 



輸入age表單值為666,在源Action有getAge{return age+55}和setAge{this.age=age+33},設置setAttribute("age",22);在目標Action中打印相應的Filed。返回頁面結果是:age:22
2018-01-12 16:56:50.179 TRACE edu.whu.swe.learnstruts2.LoginAction setAge - " setAge is invoked " 
2018-01-12 16:56:50.195 TRACE edu.whu.swe.learnstruts2.LoginAction setUsername - " setUsername is in invoked " 
2018-01-12 16:56:50.229 TRACE edu.whu.swe.learnstruts2.LoginAction validate - " validate is invoked " 
LoginAction is executed
2018-01-12 16:56:50.249 TRACE edu.whu.swe.learnstruts2.LoginAction getAge - " setAge is invoked " 
2018-01-12 16:56:50.250 TRACE edu.whu.swe.learnstruts2.LoginAction2 setAge - " setAge is invoked " 
setAge:  754
2018-01-12 16:56:50.250 TRACE edu.whu.swe.learnstruts2.LoginAction getUsername - " getUsername is in invoked " 
2018-01-12 16:56:50.250 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsername - " setUsername is in invoked " 
2018-01-12 16:56:50.251 TRACE edu.whu.swe.learnstruts2.LoginAction getUsernameAndPassword - " getUsernameAndPassword is in invoked " 
2018-01-12 16:56:50.251 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsernameAndPassword - " setUsernameAndPassword is in invoked " 
2018-01-12 16:56:50.253 TRACE edu.whu.swe.learnstruts2.LoginAction2 setAge - " setAge is invoked " 
setAge:  666
2018-01-12 16:56:50.255 TRACE edu.whu.swe.learnstruts2.LoginAction2 setUsername - " setUsername is in invoked " 
2018-01-12 16:56:50.263 TRACE edu.whu.swe.learnstruts2.LoginAction2 validate - " validate is invoked " 
2018-01-12 16:56:50.414 TRACE edu.whu.swe.learnstruts2.LoginAction2 getUsername - " getUsername is in invoked " 
2018-01-12 16:56:50.415 TRACE edu.whu.swe.learnstruts2.LoginAction2 getUsernameAndPassword - " getUsernameAndPassword is in invoked " 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM