<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 72  文章 - 28  trackbacks - 0
    <2014年1月>
    2930311234
    567891011
    12131415161718
    19202122232425
    2627282930311
    2345678

    常用鏈接

    留言簿(4)

    隨筆分類(66)

    隨筆檔案(72)

    文章檔案(19)

    收藏夾

    搜索

    •  

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    理解ActionContext ValueStack Stack Context
    ActionContext
    一次Action調(diào)用都會(huì)創(chuàng)建一個(gè)ActionContext
    調(diào)用:ActionContext context = ActionContext.getContext()

    ValueStack
    OGNL框架實(shí)現(xiàn)
    可以把它簡(jiǎn)單的看作一個(gè)棧(List

    Stack Object:放入stack中的對(duì)象,一般是action
    Stack Contextmap):stack上下文,它包含一系列對(duì)象,包括request/session/attr/application map等。
    EL:存取對(duì)象的任意屬性,調(diào)用對(duì)象的方法,遍歷整個(gè)對(duì)象結(jié)…

    ActionContextAction上下文,可以得到request session application
    ValueStack是值棧 存放表單中的值
    Stack Context 棧上下文 也是用來(lái)存值的



    struts2對(duì)OGNL上下文的概念又做了進(jìn)一步擴(kuò)充,在struts2中,OGNL上下文通常如下所示:

    |--request 



    |--application 



    context map---|--OgnlValueStack(root) [ user, action, OgnlUtil, ... ] 



    |--session 



    |--attr 



    |--parameters




    Struts2中,采用標(biāo)準(zhǔn)命名的上下文(Context)來(lái)處理OGNL表達(dá)式。處理OGNL的頂級(jí)對(duì)象是一個(gè)Map(也叫context map),而OGNL在這個(gè)context中就是一個(gè)頂級(jí)對(duì)象(root)。在用法上,頂級(jí)對(duì)象的屬性訪問(wèn),是不需要任何標(biāo)記前綴的。而其它非頂級(jí)的對(duì)象訪問(wèn),需要使用#標(biāo)記。
    Struts2框架把OGNL Context設(shè)置為我們的ActionContext。并且ValueStack作為OGNL的根對(duì)象。除value stack之外,Struts2框架還把代表applicationsessionrequest這些對(duì)象的Map對(duì)象也放到ActionContext中去。(這也就是Struts2建議在Action類中不要直接訪問(wèn)Servlet API的原因,他可以通過(guò)ActionContext對(duì)象來(lái)部分代替這些(Servlet API)功能,以方便對(duì)Action類進(jìn)行測(cè)試!)
    Action的實(shí)例,總是放到value stack中。因?yàn)?/span>Action放在stack中,而stackroot(根對(duì)象),所以對(duì)Action中的屬性的訪問(wèn)就可以省略#標(biāo)記。但是,要訪問(wèn)ActionContext中其它對(duì)象的屬性,就必須要帶上#標(biāo)記,以便讓OGNL知道,不是從根對(duì)象,而是從其它對(duì)象中去尋找。
    那么訪問(wèn)Action中的屬性的代碼就可以這樣寫

    <s:property value="postalCode"/>
    其它ActionContext中的非根對(duì)象屬性的訪問(wèn)要像下面這樣寫:
    <s:property value="#session.mySessionPropKey"/> or
    <s:property value="#session['mySessionPropKey']"/> or
    <s:property value="#request['myRequestPropKey']"/>
    對(duì)Collection的處理,內(nèi)容就很簡(jiǎn)單。
    <s:select label="label" name="name" list="{'name1','name2','name3'}" value="%{'name2'}" />
    這是處理List。這個(gè)代碼在頁(yè)面上建立一個(gè)下拉選項(xiàng),內(nèi)容是list中的內(nèi)容,默認(rèn)值是name2.
    處理map

    <s:select label="label" name="name" list="#{'foo':'foovalue', 'bar':'barvalue'}" />

    需要注意的是,判斷一個(gè)值是否在collection中。我們要使用in或者not in來(lái)處理。
    <s:if test="'foo' in {'foo','bar'}">
    muhahaha
    </s:if>
    <s:else>
    boo
    </s:else>
    另外,可以使用通配符來(lái)選擇collection對(duì)象的子集。
    ?——所有匹配選擇邏輯的元素
    ^——只提取符合選擇邏輯的第一個(gè)元素
    $——只提取符合選擇邏輯的最后一個(gè)元素
    person.relatives.{? #this.gender == 'male'}

    ?

    ?

    值棧(ValueStack) 
    Struts2OGNL上下文設(shè)置為Struts2中的ActionContext(內(nèi)部使用的仍然是OgnlContext),并將值棧設(shè)為OGNL的根對(duì)象。 
    我們知道,OGNL上下文中的根對(duì)象可以直接訪問(wèn),不需要使用任何特殊的“標(biāo)記”,而引用上下文中的其他對(duì)象則需要使用“#”來(lái)標(biāo)記。由于值棧是上下文中的根對(duì)象,因此可以直接訪問(wèn)。那么對(duì)于值棧中的對(duì)象該如何訪問(wèn)呢?Struts2提供了一個(gè)特殊的OGNLPropertyAccessor,它可以自動(dòng)查找棧內(nèi)的所有對(duì)象(從棧頂?shù)綏5?/span>),直接找到一個(gè)具有你所查找的屬性的對(duì)象。也就是說(shuō),對(duì)于值棧中的任何對(duì)象都可以直接訪問(wèn),而不需要使用“#”。 
    假設(shè)值棧中有兩個(gè)對(duì)象:studentemployee,兩個(gè)對(duì)象都有name屬性,student有學(xué)號(hào)屬性number,而employee有薪水屬性salaryemployee先入棧,student后入棧,位于棧頂,那么對(duì)于表達(dá)式name,訪問(wèn)的就是studentname屬性,因?yàn)?/span>student對(duì)象位于棧頂;表達(dá)式salary,訪問(wèn)的就是employeesalary屬性。正如你所見,訪問(wèn)值棧中的對(duì)象屬性或方法,無(wú)須指明對(duì)象,也不用“#”,就好像值棧中的對(duì)象都是OGNL上下文中的根對(duì)象一樣。這就是Struts2OGNL基礎(chǔ)上做出的改進(jìn)。

     值棧中的Action實(shí)例 
    Struts2框架總是把Action實(shí)例放在棧頂。因?yàn)?/span>Action在值棧中,而值棧又是OGNL中的根,所以引用Action的屬性可以省略“#”標(biāo)記,這也是為什么我們?cè)诮Y(jié)果頁(yè)面中可以直接訪問(wèn)Action的屬性的原因。

     Struts2中的命名對(duì)象 
    Struts2還提供了一些命名對(duì)象,這些對(duì)象沒有保存在值棧中,而是保存在ActionContext中,因此訪問(wèn)這些對(duì)象需要使用“#”標(biāo)記。這些命名對(duì)象都是Map類型。 

    parameters 
    用于訪問(wèn)請(qǐng)求參數(shù)。如:#parameters['id']#parameters.id,相當(dāng)于調(diào)用了HttpServletRequest對(duì)象的getParameter()方法。 
    注意,parameters本質(zhì)上是一個(gè)使用HttpServletRequest對(duì)象中的請(qǐng)求參數(shù)構(gòu)造的Map對(duì)象,一量對(duì)象被創(chuàng)建(在調(diào)用Action實(shí)例之前就已經(jīng)創(chuàng)建好了),它和HttpServletRequest對(duì)象就沒有了任何關(guān)系。 

    request 
    用于訪問(wèn)請(qǐng)求屬性。如:#request['user']#request.user,相當(dāng)于調(diào)用了HttpServletRequest對(duì)象的getAttribute()方法。 

    session 
    用于訪問(wèn)session屬性。如:#session['user']#session.user,相當(dāng)于調(diào)用了HttpSession對(duì)象的getAttribute()方法。 

    application 
    用于訪問(wèn)application屬性。如:#application['user']#application.user,相當(dāng)于調(diào)用了ServletContextgetAttribute()方法。 

    attr 
    如果PageContext可用,則訪問(wèn)PageContext,否則依次搜索requestsessionapplication對(duì)象。

    假設(shè)你的Action類中有變量String password; 要想獲取頁(yè)面中傳過(guò)來(lái)的password,必須為password設(shè)置get 和set 方法。當(dāng)你的頁(yè)面進(jìn)入Action時(shí),ActionContext(Action上下文)通過(guò)set方法獲取password的值并壓入值棧棧頂,同時(shí)request也獲取到password的值,同時(shí)也如堆棧,session等對(duì)象的值也被壓入堆棧,ActionContext中的值在頁(yè)面中可以直接用<s:porperty value="password">取值顯示,而request中存儲(chǔ)的password通過(guò)<s:porperty value="#request.password">或者${password}取值。即struts是通過(guò)一個(gè)值棧來(lái)存儲(chǔ)所有對(duì)象和ActionContext中的值得。ActionContext為棧頂對(duì)象,也稱跟對(duì)象,ActionContext的值可以直接用變量名取,而其他的變量需要用#變量名取值。


    posted on 2014-01-09 11:20 kelly 閱讀(477) 評(píng)論(0)  編輯  收藏 所屬分類: java 框架
    主站蜘蛛池模板: 亚洲一区二区三区四区视频| 1000部免费啪啪十八未年禁止观看| 亚洲三级在线免费观看| 亚洲精品国产字幕久久不卡 | 久久久久亚洲AV无码麻豆| 国产小视频在线免费| 久久精品免费一区二区喷潮 | 亚洲愉拍99热成人精品热久久| 青春禁区视频在线观看直播免费| 免费无码中文字幕A级毛片| 国产va免费精品| 污污视频免费观看网站| 亚洲最大中文字幕无码网站| 亚洲校园春色小说| 亚洲一二成人精品区| 国产亚洲一区二区精品| 亚洲综合亚洲综合网成人| 青青青国产色视频在线观看国产亚洲欧洲国产综合 | 91香蕉国产线在线观看免费| a毛片在线免费观看| 一级有奶水毛片免费看| 一级做a爰片久久毛片免费陪| 亚洲国产午夜精品理论片在线播放| 亚洲人成人77777在线播放 | 久久综合AV免费观看| 18勿入网站免费永久| 91精品免费国产高清在线| 亚洲日本在线免费观看| 13一14周岁毛片免费| 国产精品1024永久免费视频 | 亚洲国产熟亚洲女视频| 亚洲自国产拍揄拍| 2019亚洲午夜无码天堂| 亚洲午夜无码久久| 亚洲精品国产高清在线观看| 亚洲中文字幕乱码熟女在线| 亚洲精品无码av中文字幕| 朝桐光亚洲专区在线中文字幕| 国产精品久久亚洲一区二区| 特黄特色大片免费| 一级黄色免费大片|