ognl的全名是 Object-Graph Navigation Language 表示的是圖對象導航語言...我覺得它最厲害的一點是,通過"."來實現對象的導航...下面看他他的具體例子.我們應該就可以理解這個意思了
注意,在說例子以前先說三點
(1)我們這里的例子都是訪問普通屬性和靜態方法..獲取的也只是普通屬性的值或者靜態方法返回的值..所以這里一般是用<s:property value="ognl expression">來展示..其中,value里面的值才是ognl表達式.
(2)action里面我們可以有兩種方式從頁面中獲取值.一種是直接在action里面寫屬性.這個是叫屬性驅動.還有一種是在action里面放一個JavaBean的對象.這個叫模型驅動..具體的內容不多說了.下面說的action里面的屬性,表示的是屬性驅動里面的內容,如果說action里面的對象,那就表示是模型驅動里面的對象引用.
(3)最后說一點是值棧..值棧是一個存放對象的堆棧.是用Map來存放的,存放在值棧里的內容我們可以通過ognl表達式來獲取...至於值棧都存放些什么內容.可以通過我之前說的<s:debug>標簽來讀取..
1 訪問值棧中的action的普通屬性
<s:property value="username"/>
這個不多說了.直接用對應的屬性名就OK
2 訪問值棧中的act ion的對象的普通屬性(必須有對應的get set方法)
(1)<s:property value="user.name"/>
表示的是訪問act ion里面的user對象里面的name屬性
(2)<s:property value="student.class.size"/>
表示的是訪問act ion里面的student對象里面的class對象里面的size屬性...這句話說的有點繞,但是其實很好理解.
只要有需要,里面可以嵌套任意多層.只要中間用"."來分隔就行了
3訪問值棧中對象的普通方法
(1)<s:property value="name.length()">
這里訪問的是String對象(也就是name)里面的length()這個方法..
(2)<s:property value="user.abc()"/>
這里調用的是user對象里面的abc()方法.訪問這個方法的返回值..如果沒有返回值,則為空.
4訪問act ion中的普通方法
<s:property value="abc()">
訪問的是act ion中定義的方法...其實都很類似的...
5 訪問靜態方法
<s:property value="@com.test.util.S@abc()">
注意,兩個@是約定..也就是必須這么寫.第一個@后面跟的是類的全名.第二個@后面跟的是對應的方法名.當然,這個方法必須是靜態的
這個訪問靜態方法在struts2.1以后的版本里面需要設置一個屬性,否則系統默認是不支持訪問靜態方法的(struts2.0版本默認是支持訪問靜態方法的).具體的方法是在struts.xml里面添加這么一句
<constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>
6 訪問靜態屬性
<s:property value="@com.test.util@parm"/>
這個和上面也類似...訪問的是靜態的屬性..
轉http://zzy603.iteye.com/blog/719491
重點是在struts.xml配置中加這么一句話
1 <!-- 允許調用靜態方法和靜態屬性 --> 2 <constant name="struts.ognl.allowStaticMethodAccess" value="true"></constant>