淺析值棧
ValueStack對象至關於一個棧,它貫穿整個Action的生命週期,每一個Action類的對象實例都會擁有一個ValueStack對象
當Struts2接收到一個*.action請求後,並非直接調用Action方法,而是先將Action類的相應屬性放到ValueStack對象的頂層節點
值棧也位於內存中,它也是和parameters、request、session、application、attr對象放在一塊兒的
值棧屬於ONGL Context裏面的根對象。也就是說它位於整個內存中最最重要的地方,因此叫根對象
根對象和另外五個對象是有區別的,根對象能夠省寫#號,好比<s:property value="user.username"/>
服務器
值棧的生命週期與request請求相關,每次請求產生一個值棧。默認全部的Action會被自動放到值棧裏session
服務器跳轉時共用值棧
假設從一個Action11經過服務器跳轉到Action22的話,就意味着這兩個Action是共享一個值棧的,由於一次請求只使用一個值棧這時內存中狀況是這樣的:首先接收到Action11請求後,會產生一個值棧,在棧頂存放Action11對象以及它全部的屬性而後通過服務器跳轉到Action22,這時就會把Action22對象壓入值棧的棧頂位置,此時Action11對象以及它的全部屬性就位於棧底了app
取值過程
棧的特徵是後進先出。因而首先到棧頂的對象裏查找是否存在這個屬性,若是棧頂的Action22對象中不存在這個屬性的話
它就會繼續向下尋找直至棧底對象,一直查找是否存在這個屬性若是最後找到該屬性的話,那麼就會在JSP頁面中經過<s:property value="username"/>輸出屬性值若是在Action22和Action11都有一個同名的同類型的username屬性的話,那麼將輸出Action22中的屬性值由於它是先從棧頂開始尋找屬性的,值棧的特徵就是後進先出,但有個前提:請求過程是經過服務器跳轉的spa