轉自:http://blog.csdn.net/hanxuemin12345/article/details/38559979session
頁面一個請求發送過來,依次通過一系列攔截器(處理公共部分,如:往數據中心(值棧)填充數據,所處理工做與業務無關),Action,Result。app
介紹其中的兩個攔截器:ModelDriven、Params;spa
——一個請求過來,首先建立一個值棧對象,通過初始化,而後在Map和對象棧中放入一些數據:.net
Map中:request=…,session=…,application=…,attr=…,parameters=…;xml
對象棧中:action對象,…對象
——初始化完以後,還會通過不少攔截器,其中一個攔截器ModelDriven(封裝model,把model放入對象棧的棧頂),一個攔截器Params(參數封裝,放入參數);blog
Action中實現ModelDriven<>,並實現它的方法:get
Public class RoleActionextends ActionSupport implements ModelDriven<Role>{博客
private Role model = new Role();io
private Role getModel(){ //獲取棧頂的model對象
return model;
}
}
ModelDriven的做用:把model對象放入對象棧棧頂(原來棧頂是action,如今棧頂是model了)
Params攔截器的做用:封裝參數。
如何封裝?——作了兩件事:第一,先到對象棧中封裝;第二,再到Map中封裝;
例子:假如,如今對象棧中有model對象在(含有id、name屬性)在棧頂,action對象(含有id、age屬性);頁面訪問地址:xx.action?id=3&name=ab&age=20&xx=00;
通過Params攔截器時,它如何將參數封裝?
——先從棧頂開始找,依次找到id、name、age屬性,經過各自的Set方法依次設值id=3,name=ab,age=20(注:雖然對象棧中有兩個id屬性,可是因爲model對象的id屬性在棧頂,因此找到此id屬性就設值,不會繼續往下找),可是對象棧中沒有xx屬性,因而棧中就沒有這個參數了,經過對象棧就沒法獲得xx參數,可是Map中有parameters,能夠把全部參數放入parameters中,不管在對象棧中有沒有寫屬性,在parameters中都能獲得;
——通過一系列攔截器以後,此時數據中心就有了數據,那咱們就能夠從中獲取數據(Action、Jsp中都可從中獲取並使用);
——一次請求。由於每發送一個請求過來,都要通過這樣一系列過程:攔截器(往值棧中壓入數據)——>Action——>Request
——ActionContext.getContext()
.put(k,v);//Map中放入數據
.get(k);//Map中獲取數據
或:ActionContext.getContext.getValueStack()
.put(k,v);//Map中放入數據
.get(k);//Map中獲取數據
——ActionContext.getContext().getValueStack()
.push(obj);//向對象棧中放入數據
.pop();//從對象棧中獲取數據
——經過ActionContext()操做Map,操做對象棧
——經過OGNL表達式獲取
OGNL表達式的格式和語法:
格式:
(1)在Struts.xml中的格式爲:${ongl};
(2)在Jsp中的格式爲:%{ongl};
(注:只能寫在Struts2的自定義標籤的屬性中)
語法:
user =findValue("user");//從棧中獲取user屬性
#user = map.get("user"); //從Map中獲取user對象
#user.name=map.get("user").getName();//從Map中獲取user對象的name屬性
(findvalue(expr))的查找順序:
(1)從對象棧中查找指定名稱的屬性,從棧頂開始向下找,找到後就返回;
(2)若是從對象棧中沒有找到屬性,則從Map中查找對應的key值,找到後就返回。
例子: