OGNL操作 (讀取值棧裏面的屬性值)
其實就是利用OGNL表達式獲取值棧裏面的屬性值,
值棧裏面有兩個主要部分,一個是對OgnlContext的引用context
一個是CompoundRoot類型的root是真正數據結構上的棧對象,
值棧裏面的屬性值
對於對象棧
對象棧裏面的對象的屬性
方式
object["propertyName"] object['propertyName'] object.propertyName
默認從對象棧裏的第一個對象查找看後面的【N】語法
Map棧
request,session,application的一個屬性值或是一個請求參數的值
方式
#request.屬性值
#session.屬性值
#application.屬性值
#attr.屬性值(這個默認按照PageContext,request,session,application)對象檢索屬性。
操作符
@調用靜態方法和靜態字段@全類名@字段名@java.lang.Math@PI@全類名@方法名@java.lang.String@min(3,5)不給出類名,默認是java.lang.Math包@@min(5,3)#@@PI訪問Map棧裏面的屬性值構建Map對象%#{"key1":"value1","key2":"value2"},構建List不需要使用#struts2標籤的強制解析%{},%{''}''裏面是不解析的String。$
el表達式
struts2中的命名對象
這些命名對象保存到值棧中的Map棧裏面,訪問需要#requestsessionapplicationattrparameters本質是一個HttpServletRequest對象中請求參數構造的一個Map對象。
在調用Action實例之前就已經創建好了,和HttpServletRequest沒有了任何關係
[N]語法
從值棧的對象棧裏面第幾個對象開始訪問,默認第一個對象開始訪問,可以省略[0]
top關鍵字
結合[N]語法可以取出值棧任意位置的對象,
[0].top 取出第一個對象,[0].top.name第一個對象的name屬性。
ActionContext
是一個OgnlContext的封裝,提供解耦方式訪問Servlet API的方法,其實也就是從OgnlContext裏面去的值。
lambda表達式
格式:[]
使用lambda來計算階乘
#fact=:[#this<=1?1:#this*#fact(#this-1)],#fact(30H)
整個ognl表達式是一個逗號表達式
投影(projection)和選擇(selection)
ognl提供了一種簡單的方法對集合中的每個元素調用相同的方法,或是抽取相同的屬性,並將結果保存爲一個新的列表,稱爲投影例如employees保存了employee對象#employees.(name)將會得到一個保存了所有employee對象name的列表,對於列名還可以進行索引#employees.(name)[0],不過當列表爲空時會拋出異常。
將集合中的元素按照某種規則抽取出來保存爲一個新的列表,稱爲選擇。當前正在迭代的元素用#this表示
#employees.(?#this.age>20) 得到所有age大於20的employee對象的列表? 選擇匹配的所有元素^ 選擇匹配的第一個元素$ 選擇匹配的最後一個元素
集合的僞屬性
List,Map,SetsizeisEmptyListiteratorSetiteratorMapkeys,valuesIteratornext,hasNext
struts2標籤標籤屬性解析規則
所有非字符串都會被當做OGNL表達式解析
所有的字符串都會解析%{}這種語法結構,{}裏面的將被解析。
#request.屬性值
#session.屬性值
#application.屬性值
#attr.屬性值(這個默認按照PageContext,request,session,application)對象檢索屬性。