值棧的結構:
右邊放的是一個個對象。並且裏面有一些對象。
Map的操作, put(k,V); Get(k)
Stack的操作是,push(obj) 壓棧 ;pop(obj);
結合—————–
一:存數據的過程
上文中,我們說到Struts2 的攔截器。那麼在攔截的過程中會先創建值棧,在值棧裏面放了一些初始化的數據。例如request,session,application等等。 如果應用過程中想用的話,直接用#就可以getSeeion到。
也會在棧中放入action對象。
同時還會經過其它攔截器。它會繼續在值棧中添加信息。比如參數攔截器會繼續在值棧中添加參數信息。ModelDriven 攔截器是把model放到棧頂。
實現的時候,也就是在對應的action中去實現ModelDriven接口。例如:
public class RoleAction extends ActionSupport implements ModelDriven<Role>
其中接口裏面只有唯一的一個接口方法。我們實現如下:
private Role model=new Role();
public Role getModel(){
return model;
}
然後下一個攔截器是params。封裝參數
此時棧裏面有這個model對象(id;name) action對象(id;age)
如果當前請求地址是:
Xx.action?id=3&name=ab&age=20&xx=00
注意:該地址中傳過了4個參數。id,name,age,xx
那這裏的封裝參數就是把參數放到對象中,會先放到屬性中。從棧頂開始找 , 找到了就不會往下找了。當放Id的時候,會先
到model中的Id,然後就會把這個參數放到對象中。接着開始處理name。最後xx在對象中並沒有對應的屬性。則不放到棧中,但依然能用#方式取到該值。
二:取數據
此時,相當於數據中心有了數據。接下來就是我們怎麼去應用它。
Action中需要通過ActionContext對象,裏面有一個getContext,getValueStack
然後在JSP中通過OGNL表達式獲取。
最後,在注意一個取值順序。
這樣就是整個值棧的完整過程。需要注意值棧對象的作用範圍是一個請求。