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

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

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

    The NoteBook of EricKong

      BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
      611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks
    一、什么是OGNL,有什么特點?

    OGNL(Object-Graph Navigation Language),大概可以理解為:對象圖形化導航語言。是一種可以方便地操作對象屬性的開源表達式語言。OGNL有如下特點:

    1、支持對象方法調用,形式如:objName.methodName();

    2、支持類靜態的方法調用和值訪問,表達式的格式為@[類全名(包括包路)]@[方法名 | 值名],例如:

    @java.lang.String@format('foo %s', 'bar')或@tutorial.MyConstant@APP_NAME;

    3、支持賦值操作和表達式串聯,例如:

    price=100, discount=0.8, calculatePrice(),這個表達式會返回80;

    4、訪問OGNL上下文(OGNL context)和ActionContext;

    5、操作集合對象。



    二、使用OGNL表達式

    OGNL要結合struts標簽來使用。由于比較靈活,也容易把人給弄暈,尤其是“%”、“#”、“$”這三個符號的使用。由于$廣泛應用于EL中,這里重點寫%和#符號的用法。

    1、“#”符號有三種用途:

    (1)、訪問非根對象(struts中值棧為根對象)如OGNL上下文和Action上下文,#相當于ActionContext.getContext();下表有幾個ActionContext中有用的屬性:

    parameters
    包含當前HTTP請求參數的Map
    #parameters.id[0]作用相當于request.getParameter("id")

    request
    包含當前HttpServletRequest的屬性(attribute)的Map
    #request.userName相當于request.getAttribute("userName")

    session
    包含當前HttpSession的屬性(attribute)的Map
    #session.userName相當于session.getAttribute("userName")

    application
    包含當前應用的ServletContext的屬性(attribute)的Map
    #application.userName相當于application.getAttribute("userName")


    注:attr 用于按request > session > application順序訪問其屬性(attribute),#attr.userName相當于按順序在以上三個范圍(scope)內讀取 userName屬性,直到找到為止。用于過濾和投影(projecting)集合,如books.{?#this.price<100};構造 Map,如#{'foo1':'bar1', 'foo2':'bar2'}。

    (2)、用于過濾和投影(projecting)集合,如: books.{?#this.price>35}

    books.{?#this.price>35}

    (3)、構造Map,如: #{'foo1':'bar1', 'foo2':'bar2'}

    #{'foo1':'bar1', 'foo2':'bar2'}這種方式常用在給radio或select、checkbox等標簽賦值上。如果要在頁面中取一個map的值可以這樣寫:

    <s:property value="#myMap['foo1']"/>

    <s:property value="#myMap['foo1']"/>

    2、“%”符號的用途是在標簽的屬性值被理解為字符串類型時,告訴執行環境%{}里的是OGNL表達式。很有點類似javascript里面的eval_r()功能,例如:

    var oDiv = eval_r("document.all.div"+index)

    var oDiv = eval_r("document.all.div"+index)

    當index變量為1時,語句就會被當作var oDiv = document.all.div1
    var oDiv = document.all.div1來執行。%{}就是起這個作用。舉例:

    <s:set name="myMap" value="#{'key1':'value1','key2':'value2'}"/> 第1行

    <s:property value="#myMap['key1']"/> 第2行

    <s:url value="#myMap['key1']" />    第3行

    <s:set name="myMap" value="#{'key1':'value1','key2':'value2'}"/> 第4行

    <s:property value="#myMap['key1']"/> 第5行

    <s:url value="#myMap['key1']"/> 第6行

    上面的代碼第2行會在頁面上輸出“value1”,而第3行則會輸出"#myMap['key1']"這么一個字符串。如果將第3行改寫成這樣:

    <s:url value="%{#myMap['key1']}"/>

    <s:url value="%{#myMap['key1']}"/>

    則輸出為“value1”。





    這說明struts2里不同的標簽對ognl的表達式的理解是不一樣的。如果當有的標簽“看不懂”類似“#myMap['key1']”的語句時,就要用%{}來把這括進去,“翻譯”一下了。

    3、“$”有兩種用途

    (1)、在國際化資源文件中,引用OGNL表達式。

    (2)、在Struts 2配置文件中,引用OGNL表達式:

    <action name="saveUser" class="userAction" method="save">

    <result type="redirect">listUser.action?msg=${msg}</result>

    </action>

    <action name="saveUser" class="userAction" method="save">

    <result type="redirect">listUser.action?msg=${msg}</result>

    </action>
    posted on 2012-09-02 21:12 Eric_jiang 閱讀(1321) 評論(2)  編輯  收藏 所屬分類: struts2

    Feedback

    # re: OGNL表達式struts2標簽“%,#,$”的區別 2013-06-26 00:03 fff
    232323232  回復  更多評論
      

    # re: OGNL表達式struts2標簽“%,#,$”的區別 2013-08-21 14:39 SS
    寫這篇文章的人失誤,抄襲的人原封不動 2BBBBB  回復  更多評論
      

    主站蜘蛛池模板: 亚洲精品成人图区| 亚洲视频在线免费观看| 亚洲欧美日韩国产精品一区| 亚洲国产综合精品中文字幕| 亚洲av成人中文无码专区| 无码国模国产在线观看免费| 亚洲爆乳少妇无码激情| 国产在线精品一区免费香蕉| 亚洲区小说区图片区| 亚洲日韩在线观看免费视频| 亚洲午夜福利717| 亚洲AV无码一区二区三区久久精品| 最近中文字幕无免费视频| 亚洲熟妇无码AV| 国产成人免费网站在线观看| 黄色一级视频免费| 欧美大尺寸SUV免费| 亚洲国产欧美一区二区三区| 四虎永久在线精品免费观看地址 | 久久不见久久见免费影院www日本 久久WWW免费人成—看片 | 亚洲AV日韩AV永久无码绿巨人| 亚洲电影国产一区| 热re99久久6国产精品免费| 亚洲欧洲国产精品久久| 免费理论片51人人看电影| 亚洲黄色免费观看| 三级黄色片免费看| 亚洲色图视频在线观看| 岛国大片免费在线观看| 亚洲国产精品久久丫 | 波多野结衣一区二区免费视频| 一区二区3区免费视频| 亚洲日韩图片专区第1页| 四虎国产精品免费久久| 日韩一级片免费观看| 久热综合在线亚洲精品| 在线免费观看一级片| 永久免费不卡在线观看黄网站| 亚洲人成在线播放| 亚洲日韩中文字幕日韩在线| 一级a性色生活片久久无少妇一级婬片免费放|