Struts2:ValueStack

1、ValueStack
    1
.ValueStack是一個接口,在struts2中使用OGNL(Object-Graph Navigation Language)表達式其實是使用
        實現了ValueStack接口的類OgnlValueStack.它是ValueStack的默認實現類.
     2 .ValueStack貫穿整個action的生命週期,每個action實例都擁有一個ValueStack對象,其中保存了當前action對象和其餘相關對象.

    3.struts2把ValueStack對象保存在名爲:struts.valueStack的request域中.即ValueStack做用域爲request.當action建立的時候,ValueStack就建立了,action被銷燬的時候,ValueStack就銷燬了 java

     4 .ValueStack中的數據分兩部分存放:root(棧結構,CompoundRoot)和context(map形式,OgnlContext)
         (1)    * 其中的root對象是CompoundRoot,CompoundRoot繼承了ArrayList,提供了額外的方法:push(),和pop()方法,
                 用來對root對象中所包含的數據進行存取.正是因爲這兩個方法,CompoundRoot變成了一個棧結構.
            * struts2中,一個請求在最終到達Action的方法以前,Action對象自己會被壓入ValueStack(實際上就是放到ValueStack
                的CompoundRoot中),因此action對象是CompoundRoot中的一個元素.
        (2)* 其中的context對象是OgnlContext,它實現了map接口,在valuestack的默認實現類中,即OgnlValueStack類中,
                調用ongl中的方法:Ognl.createDefaultContext(..)給context賦值,查看源代碼可知,
                此方法返回的是一個OgnlContext對象.
     5 .獲取ValueStack的三種方式
        (1)ValueStack valueStack = ActionContext.getContext().getValueStack();    
                ActionContext爲Action的上下文,其中有重要的6大對象
                    * valueStack,parameters,request,session,application,attr
                    * 而ognl表達式必須選擇AcitonContext中的一個對象做爲根對象(root),默認爲valueStack,所以訪問valueStack中的數據不加#
                        而若是要使用另外5個對象做爲根對象,須要加#前綴.
        (2)ValueStack valueStack = ServletActionContext.getValueStack(ServletActionContext.getRequest());        
                ServletActionContext繼承了ActionContext,它與web容器耦合,能夠獲取web容器的一些信息.

        (3)ValueStack valueStack = (ValueStack) ServletActionContext.getRequest().getAttribute("struts.valueStack"); web

    6.ValueStack內存結構圖 session

    7.經常使用的存儲數據的方法
        (1)向map棧中存數據,即ValueStack中的context(OgnlContext)
            * 經過request,session等向map中存儲數據
                ServletActionContext.getRequest().setAttribute("username","joey");
                ServletActionContext.getSession().put("pwd","123");
            * 直接向map棧中放數據
                ActionContext.getContext().put("msg","how you doing");    
        (2)向對象棧中存數據,即ValueStack中的root(CompoundRoot)對象
            * 先獲得root,再把數據壓入到root中,這中方式是放入到棧底.
                ValueStack valueStack = ActionContext.getContext().getValueStack();
                valueStack.getRoot().add(new Person());
            * 先獲得root,利用add(index,Object)把一個對象壓入到root中指定位置.
                ValueStack valueStack = ActionContext.getContext().getValueStack();
                valueStack.getRoot().add(0,new Person());//這裏0,表示壓入棧頂.
            * 存放一個map到對象棧中
                ValueStack valueStack = ActionContext.getContext().getValueStack();
                valueStack.set("msg","dude"); //先封裝成Map,在把Map放入到對象棧中,且放入棧頂.
            * 利用valueStack的push方法把一個對象直接壓入棧頂
                ValueStack valueStack = ActionContext.getContext().getValueStack();
                valueStack.push(new Person()); app

    8.利用OGNL表達式取ValueStack中的數據
        (1)<s:property />:取棧頂的元素.
        (2)<s:iterator />:取棧頂的元素.
            注意:此標籤的value屬性值不管來自對象棧仍是Map棧,均可以不加#前綴(<s:select/>標籤也適用).
                由於此標籤在迭代的時候,老是把當前正在迭代的元素放入到棧頂. jsp

2、ognl
    1
.ognl是struts2中使用的一種表達式語言,可用於jsp的標籤庫中,以方便訪問各類對象的屬性.
        它用於把界面的參數傳遞到Action中(並進行類型轉換),它還能夠用於struts2的配置文件中.
    2.Root對象
        OGNL稱爲對象圖導航語言,所謂對象圖,即以任意一個對象爲根,經過OGNL能夠訪問與這個對象關聯的其它對象.
        例如: spa

public class User{
		private String username;
		private Group group;
		//省略setter,getter方法
	}
	public class Group{
		private String name;
		private Organization org;
		//省略setter,getter方法
	}
	public class Organization{
		private String orgId;
		//省略setter,getter方法
	}

        以上三個類,描述了經過一個User對象,同過User對象能夠導航到Group對象,進而導航到Organization對象.
            以User爲根,經過基本的getters方法,能夠訪問到此根對象的其它關聯對象.【對象圖的導航,必須經過getters方法導航】
        注意:    * 導航的目的,就是爲了獲取某個對象的值或設置某個對象的值或調用某個對象的方法.
            * OGNL表達式語言的真正目的,是爲了在那些不能寫java代碼的地方執行java代碼,或者是爲了更方便的執行java代碼.
     3 .Context對象
        * 在OGNL表達式中,有可能須要訪問到多個絕不相干的對象,這時候,咱們須要給OGNL傳遞一個Map類型的對象,把表達式中須要用到的對象放到
            Map中便可.而這個Map對象稱爲Context
        * 要在表達式訪問到context中的對象,須要使用"#對象名稱"的語法規則.
        * 存在context的主要緣由就是在OGNL中,不支持多個root對象,而若是須要在表達式中訪問多個絕不相關的對象時,
            只能經過一個Map來把這些對象統一傳遞給OGNL.
相關文章
相關標籤/搜索