Struts學習之值棧的理解

轉自:http://blog.csdn.net/hanxuemin12345/article/details/38559979session

    頁面一個請求發送過來,依次通過一系列攔截器(處理公共部分,如:往數據中心(值棧)填充數據,所處理工做與業務無關),ActionResultapp


 

1,通過一系列攔截器

介紹其中的兩個攔截器:ModelDrivenParams;spa

 

——一個請求過來,首先建立一個值棧對象,通過初始化,而後Map和對象棧中放入一些數據.net

(1)值棧的結構:


(2)Map和對象棧中分別存入什麼數據:

Map中:request=session=…application=…attr=…parameters=…xml

 

對象棧中:action對象,…對象

 

初始化完以後,還會通過不少攔截器,其中一個攔截器ModelDriven(封裝model,把model放入對象棧的棧頂),一個攔截器Params(參數封裝,放入參數)blog

(1)通過攔截器

(2)再通過ModelDriven攔截器:

   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)

(3)通過攔截器

(4)再通過Params攔截器

   Params攔截器的做用:封裝參數。

   如何封裝?——作了兩件事:第一,先到對象棧中封裝;第二,再到Map中封裝;

   例子:假如,如今對象棧中有model對象在(含有idname屬性)在棧頂,action對象(含有idage屬性);頁面訪問地址:xx.action?id=3&name=ab&age=20&xx=00;

   通過Params攔截器時,它如何將參數封裝?

——先從棧頂開始找,依次找到idnameage屬性,經過各自的Set方法依次設值id=3,name=ab,age=20(注:雖然對象棧中有兩個id屬性,可是因爲model對象的id屬性在棧頂,因此找到此id屬性就設值,不會繼續往下找),可是對象棧中沒有xx屬性,因而棧中就沒有這個參數了,經過對象棧就沒法獲得xx參數,可是Map中有parameters,能夠把全部參數放入parameters中,不管在對象棧中有沒有寫屬性,在parameters中都能獲得

——通過一系列攔截器以後,此時數據中心就有了數據,那咱們就能夠從中獲取數據(ActionJsp中都可從中獲取並使用)

2,思考:值棧對象做用範圍是什麼?

——一次請求。由於每發送一個請求過來,都要通過這樣一系列過程:攔截器(往值棧中壓入數據)——>Action——>Request

3,細節擴充:

(1)由值棧對象,如何操做Map

——ActionContext.getContext()

                            .put(k,v);//Map中放入數據

                            .get(k);//Map中獲取數據

或:ActionContext.getContext.getValueStack()

                                          .put(k,v);//Map中放入數據

                                          .get(k);//Map中獲取數據

(2)有了值棧對象,如何操做對象棧

——ActionContext.getContext().getValueStack()

                                         .push(obj);//向對象棧中放入數據

                                         .pop();//從對象棧中獲取數據

(3)因此,值棧中有了對象,Action中如何使用棧中的數據:

——經過ActionContext()操做Map,操做對象棧

(4)因此,值棧中有了對象,jsp中如何使用棧中的數據:

——經過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值,找到後就返回。

例子:


4,總結

    經過此篇博客,咱們須要瞭解什麼?
(1)頁面一個請求過來,Struts2中依次通過了哪幾個過程?
    —— 一系列攔截器——>Action——>Request;
——ModelDriven和Params攔截器分別的主要做用;
(2)值棧的概念?
——值棧的結構:對象棧、Map;
——對象棧、Map分別存放什麼數據;
(3)(1)和(2)是如何結合在一塊兒的?
——請求過來,一開始通過攔截器,初始化並建立對象棧,通過ModelDriven和Params攔截器時,分別往值棧中封裝對象和封裝參數,分別封裝到相應的地方,此時數據中心中有就有了數據。
    以上均是攔截器爲咱們作的工做,咱們只需寫Action(經過ActionContext()操做Map,操做對象棧)和Jsp(經過OGNL表達式獲取棧中數據)便可。
相關文章
相關標籤/搜索