Struts2的Action的生命周期是:Struts2為每個請求都重新初始化一個Action的實例。可以稍微改造一下代碼來驗證一下。
-
給HelloWorldAction加上一個public無參的構造方法,在里面輸出一句話。
大家都知道,一個Java類如果沒有寫構造方法,那么會有一個默認的public無參的構造方法,這里只是把它明確的寫出來了,因此這么做,並沒有改變Action的任何功能,只是想看一下到底什么時候,Action會被初始化。示例代碼如下:
public HelloWorldAction(){ System.out.println("HelloWorldAction被初始化"); }
- 然后在execute方法上也加入一個打印Action自己這個對象實例的語句,示例代碼如下:
public String execute() throws Exception { System.out.println(this); this.businessExecute(); return "toWelcome"; }
注意:大家都知道在Java基礎知識里面,“System.out.println(this);”這句話,在打印一個對象實例的時候,實際上是調用的這個類的toString方法,但是HelloWorldAction類沒有實現toString方法,所以,會調用到Object的toString方法。Object的toString方法會打印出自己的全類名和Object的hashcode方法的返回值,這個hashcode方法返回一個數字,只要這個數字不同,則被打印的對象就絕不是同一個對象。
- 修改做完之后,重新啟動Tomcat,仔細察看后台的輸出信息,你會發現啟動的時候,並沒有打印出來那句“HelloWorldAction被初始化”,這說明了Action的初始化並不是在Tomcat啟動的時候進行的。
接下來按照如下順序操作:
(1)訪問http://localhost:9080/helloworld/s2impl/login.jsp,在頁面上填寫賬號和密碼,然后點擊提交按鈕,會跳轉到歡迎頁面。這個時候去察看后台的輸出信息,如下:
HelloWorldAction被初始化 cn.javass.action.action.HelloWorldAction@922804 用戶輸入的參數為===account=test,password=111111,submitFlag=login
(2)接下來,按F5來刷新這個歡迎頁面,點擊重試按鈕,這樣就相當於再次訪問HelloWorldAction,再察看后台的輸出信息,如下:
HelloWorldAction被初始化 cn.javass.action.action.HelloWorldAction@922804 用戶輸入的參數為===account=test,password=111111,submitFlag=login HelloWorldAction被初始化 cn.javass.action.action.HelloWorldAction@18e8541 用戶輸入的參數為===account=test,password=111111,submitFlag=login
“HelloWorldAction被初始化”這句話被打印了兩次,說明HelloWorldAction對象的構造方法被調用了兩次。而且兩次打印的toString分別是“cn.javass.action.action.HelloWorldAction@922804”和“cn.javass.action.action.HelloWorldAction@18e8541”,這說明了為兩次web請求服務的HelloWorldAction對象不是同一個。
因此,Struts2中的Action在每一次web請求的時候都要新建一個實例。