4. Struts2框架之 ValueStack

ValueStack 值棧(功能類似於域對象,存取值)

1. 每一個action 都有且僅有一個值棧,可在action中存值,jsp中取值
2. **獲取值棧**:
    **先得到   ActionContext,然後再 getValueStack();** 

3. 內部結構分爲2部分:
    1. root  結構是list集合(常用)
    2. context  map集合

            map集合中的key都是固定值,value放的都是對象的引用值
            key有:Request,session,application,parameters,attr
            value: Request,session,ServletContext,傳遞參數,獲取域對象中的值(優先獲取最小範圍的域)

4. 使用struts2 標籤 <s:debug> 查看值棧結構(在action返回值配置的jsp中設置)
    **1. 在action中沒有做任何操作,棧頂元素就是該action的引用**

5. 向值棧中 **存放** 數據方式:
    1. 獲取值棧對象,調用值棧的set(String name,String value)方法, 值棧會生成一個HashMap對象存這個數據,然後再將hashmap引用放入值棧的list集合中
    2. 獲取值棧對象,調用值棧的push(Object value)方法,然後生成該對象的引用放入值棧的list集合中
    3. **在action中定義變量/聲明對象並new,生成變量/對象的get()方法**
        這樣就把這個數據存到了action裏面,減少了空間浪費

6. 從值棧中** 獲取數據**  

        在jsp中使用Ognl+Struts2標籤 獲取數據 
        <s:property value="username"/>
        到action中找到名稱一致的屬性(username),然後調用該屬性的get方法,就得到了

        對象的值獲取:
        <s:property value="user.username"/>
        先到action中找到對象(user)的get方法,然後再調用對象裏面的屬性(username)的get方法,來獲取到值

        List集合數據  <s:property value = list[0].username /> list中的第一個對象
                     <s:property value = list[1].username /> list中的第二個對象

        或者配合struts標籤  <s:iterator value="list">
                            <s:property value="username">
                          </s:iterator>
        就是先獲取到list集合,遍歷,每次都得到了user對象,所以直接取值username就可以了

7. EL表達式+Jstl標籤,也可以做到 在jsp中獲取值棧數據(性能低,不建議)

    >原因:底層增強了request.getAttribute()方法,如果從request域中無法取到值,那就從值棧中取值,把值棧的值放到request域中,這樣EL表達式就可以取出來了



8. Ognl表達式與struts 標籤
    1. ognl 的 # 使用: 通常用於取 值棧中context裏的值

    >context裏主要就是域對象(request,session,servletContext),也就是說取 域對象的值,需要加上# 符號

    2. 在struts**表單** 標籤中 需要 在ognl表達式前 使用 $ , 否則 無法識別ognl表達式
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章