Struts2: 何為OGNL?[筆記]
OGNL is the Object Graph Navigation Language (see http://www.ognl.org/
for the full documentation of OGNL). Here, we will cover a few examples
of OGNL features that co-exist with the framework. To review basic
concepts, refer to OGNL Basics.
OGNL是對象圖形定位語言.這里將設計一個OGNL和框架并存的例子。
The framework uses a standard naming context to evaluate OGNL expressions. The top level object dealing with OGNL is a Map (usually referred as a context map or context). OGNL has a notion of there being a root (or default) object within the context. In expression, the properties of the root object can be referenced without any special "marker" notion. References to other objects are marked with a pound sign (#).
框架用一個標準命名上下文來計算OGNL表達式。處理OGNL的高層對象是Map。OGNL在上下文內有個根的概念。在表達式里,不需要任何“標志”關聯到根對象的屬性。關聯到其他對象得用#標識。
The framework sets the OGNL context to be our ActionContext, and the value stack to be the OGNL root object. (The value stack is a set of several objects, but to OGNL it appears to be a single object.) Along with the value stack, the framework places other objects in the ActionContext, including Maps representing the application, session, and request contexts. These objects coexist in the ActionContext, alongside the value stack (our OGNL root).
框架設置OGNLcontext為我們的 ActionContext, value stack 是OGNL根對象。(value stack是一系列的值,但對OGNL,它表現為一個對象)連同value stack,框架放置其他對象到ActionContext,包括展示application,session和request上下文。這些對象與value stack一起共存在ActionContext。
|
|--application
|
|--session
context map---|
|--value stack(root)
|
|--request
|
|--parameters
|
There are other objects in the context map. The diagram is for example only.
The Action instance is always pushed onto the value stack. Because the Action is on the stack, and the stack is the OGNL root, references to Action properties can omit the # marker. But, to access other objects in the ActionContext, we must use the # notation so OGNL knows not to look in the root object, but for some other object in the ActionContext.
Action 實例被推入value stack。因為Action在stack里,并且statck是OGNL的根,和Action關聯的屬性忽略#標記。但訪問ActionContext的其他對象,我們必須用#標識,OGNL知道不應該區根對象查找,而是到ActionCopntext的其他對象里查找。
<s:property value="postalCode"/>
Other (non-root) objects in the ActionContext can be rendered use the # notation.
<s:property value="#session.mySessionPropKey"/> or
<s:property value="#session["mySessionPropKey"]"/> or
<s:property value="#request["mySessionPropKey"]/>
The ActionContext is also exposed to Action classes via a static method.
ActionContext也通過靜態方法被暴露給Action類
ActionContext.getContext().getSession().put("mySessionPropKey", mySessionObject);
Collections (Maps, Lists, Sets)
Dealing with Collections (Maps, Lists, and Sets) in the framework comes often, so here are a few examples using the select tag.
聲明集合在框架中經常用到,所以這里是用select標簽的例子。
Syntax for list: {e1,e2,e3}. This idiom creates a List containing the String "name1", "name2" and "name3". It also selects "name2" as the default value.
list語法:{e1,e2,e3}.這個習慣創建一個包括“name1”,“name2”和“name3”。它也選擇“name2”作為默認值。
<s:select label="label" name="name" list="{'name1','name2','name3'}" value="%{'name2'}" />
Syntax for map: #{key1:value1,key2:value2}. This idiom creates a map that maps the string "foo" to the string "foovalue" and "bar" to the string "barvalue":
map語法:#{key1:value1,key2:value2}.這個創建map,把字符傳“foo”到字符串"foovalue",“bar”到字符串"barvalue".
<s:select label="label" name="name" list="#{'foo':'foovalue', 'bar':'barvalue'}" />
To determine if an element exists in a Collection, use the operations in and not in.
用in 和 not in 檢驗元素是否在一個集合里面
<s:if test="'foo' in {'foo','bar'}">
muhahaha
</s:if>
<s:else>
boo
</s:else>
<s:if test="'foo' not in {'foo','bar'}">
muhahaha
</s:if>
<s:else>
boo
</s:else>
To select a subset of a collection (called projection), use a wildcard within the collection.
- ? - All elements matching the selection logic
- ^ - Only the first element matching the selection logic
- $ - Only the last element matching the selection logic
To obtain a subset of just male relatives from the object person:
person.relatives.{? #this.gender == 'male'}
OGNL supports basic lamba expression syntax enabling you to write simple functions.
(Dedicated to all you math majors who didn't think you would ever see this one again.)
Fibonacci: if n==0 return 0; elseif n==1 return 1; else return fib(n-2)+fib(n-1);
fib(0) = 0
fib(1) = 1
fib(11) = 89
![]() |
How the expression works The lambda expression is everything inside the brackets. The #this variable holds the argument to the expression, which is initially starts at 11. |
<s:property value="#fib =:[#this==0 ? 0 : #this==1 ? 1 : #fib(#this-2)+#fib(#this-1)], #fib(11)" />
JSP 2.1
Under JSP 2.1 the # character is now used by the JSP EL.
This may cause problems with some applications that use the OGNL # operator.
One quick-fix is to disable the JSP EL in a JSP 2.1 container (like GlassFish) by adding a jsp-config element to the web.xml
和JSP2.1的兼容問題處理
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>
posted on 2007-04-29 10:45 MingIsMe 閱讀(1578) 評論(0) 編輯 收藏 所屬分類: Struts2學習