posts - 66, comments - 12, trackbacks - 0, articles - 0

          struts2 ognl分析(轉帖)

          Posted on 2008-12-02 12:58 cyantide 閱讀(1026) 評論(0)  編輯  收藏 所屬分類: struts2
          Struts2在OGNL基礎上的增強
            1、值棧(ValueStack)
              Struts2將OGNL上下文設置為Struts2中的ActionContext(內部使用的仍然是OgnlContext),并將值棧設為OGNL的根對象。
              我們知道,OGNL上下文中的根對象可以直接訪問,不需要使用任何特殊的“標記”,而引用上下文中的其他對象則需要使用“#”來標記。由于值棧是上下文中的根對象,因此可以直接訪問。那么對于值棧中的對象該如何訪問呢?Struts2提供了一個特殊的OGNLPropertyAccessor,它可以自動查找棧內的所有對象(從棧頂到棧底),直接找到一個具有你所查找的屬性的對象。也就是說,對于值棧中的任何對象都可以直接訪問,而不需要使用“#”。
              假設值棧中有兩個對象:student和employee,兩個對象都有name屬性,student有學號屬性number,而employee有薪水屬性salary。employee先入棧,student后入棧,位于棧頂,那么對于表達式name,訪問的就是student的name屬性,因為student對象位于棧頂;表達式salary,訪問的就是employee的salary屬性。正如你所見,訪問值棧中的對象屬性或方法,無須指明對象,也不用“#”,就好像值棧中的對象都是OGNL上下文中的根對象一樣。這就是Struts2在OGNL基礎上做出的改進。
            2、[N]語法
              如上所述,如果想要訪問employee的name屬性,應該如何寫表達式呢?我們可以使用[N].xxx(N是從0開始的整數)這樣的語法來指定從哪一個位置開始向下查找對象的屬性,表達式[1].name訪問的就是employee對象的name屬性。
              在使用[N].xxx語法時,要注意位置序號的含義,它并不是表示“獲取棧中索引為N的對象”,而是截取從位置N開始的部分棧。
            3、top關鍵字
              top用于獲取棧頂的對象,結合[N].xxx語法,我們就可以獲取棧中任意位置的對象。
              如:[0].top,[1].top等
            4、訪問靜態成員
              除了使用標準的OGNL表達式訪問靜態字段和靜態方法外,Struts2還允許你不指定完整的類名,而是通過“vs”前綴來調用保存在棧中的靜態字段和靜態方法。
              @vs@FOO_PROPERTY
              @vs@someMethod()
              @vs1@someMethod()
              vs表示ValueStack,如果只有vs,那么將使用棧頂對象的類;如果在vs后面跟上一個數字,那么將使用棧中指定位置處的對象類。
            5、值棧中的Action實例
              Struts2框架總是把Action實例放在棧頂。因為Action在值棧中,而值棧又是OGNL中的根,所以引用Action的屬性可以省略“#”標記,這也是為什么我們在結果頁面中可以直接訪問Action的屬性的原因。
            6、Struts2中的命名對象
              Struts2還提供了一些命名對象,這些對象沒有保存在值棧中,而是保存在ActionContext中,因此訪問這些對象需要使用“#”標記。這些命名對象都是Map類型。
             parameters
              用于訪問請求參數。如:#parameters['id']或#parameters.id,相當于調用了HttpServletRequest對象的getParameter()方法。
              注意,parameters本質上是一個使用HttpServletRequest對象中的請求參數構造的Map對象,一量對象被創建(在調用Action實例之前就已經創建好了),它和HttpServletRequest對象就沒有了任何關系。
             request
              用于訪問請求屬性。如:#request['user']或#request.user,相當于調用了HttpServletRequest對象的getAttribute()方法。
             session
              用于訪問session屬性。如:#session['user']或#session.user,相當于調用了HttpSession對象的getAttribute()方法。
             application
              用于訪問application屬性。如:#application['user']或#application.user,相當于調用了ServletContext的getAttribute()方法。
             attr
              如果PageContext可用,則訪問PageContext,否則依次搜索request、session和application對象。
          主站蜘蛛池模板: 闵行区| 汉阴县| 左贡县| 宝兴县| 孙吴县| 休宁县| 五莲县| 莆田市| 漳州市| 栾城县| 维西| 工布江达县| 盖州市| 积石山| 蕲春县| 塔河县| 张掖市| 翁源县| 古交市| 云梦县| 澳门| 红河县| 象州县| 新巴尔虎右旗| 常州市| 许昌市| 县级市| 阿克苏市| 肇源县| 潍坊市| 大渡口区| 禄丰县| 砚山县| 保山市| 兴业县| 宁乡县| 五大连池市| 乐清市| 崇信县| 灵山县| 通榆县|