博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Struts2 OGNL
阅读量:5950 次
发布时间:2019-06-19

本文共 15517 字,大约阅读时间需要 51 分钟。

OGNL(Object-Graph Navigation Language)的概念:

OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。

 

1.OGNL表达式的计算是围绕OGNL上下文进行的。

 OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示。它里面可以存放很多个JavaBean对象。它有一个上下文根对象。

 上下文中的根对象可以直接使用名来访问或直接使用它的属性名访问它的属性值。否则要加前缀“#key”。

 

2.Struts2的标签库都是使用OGNL表达式来访问ActionContext中的对象数据的。

 如:<s:propertyvalue="xxx"/>。

 

3.Struts2将ActionContext设置为OGNL上下文,并将值栈作为OGNL的根对象放置到ActionContext中。

 

4.值栈(ValueStack) :

 可以在值栈中放入、删除、查询对象。访问值栈中的对象不用“#”。
 Struts2总是把当前Action实例放置在栈顶。所以在OGNL中引用Action中的属性也可以省略“#”。
 
5.调用ActionContext的put(key,value)放入的数据,需要使用#访问。

OGNL中重要的3个符号:#、%、$:

#、%和$符号在OGNL表达式中经常出现,而这三种符号也是开发者不容易掌握和理解的部分,需要时间的积累才渐渐弄清楚……

1.#符号

#符号的用途一般有三种。

   —访问非根对象属性,例如#session.msg表达式,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext. getContext();#session.msg表达式相当     于ActionContext.getContext().getSession(). getAttribute("msg") 。

   —用于过滤和投影(projecting)集合,如persons.{?#this.age>25},persons.{?#this.name=='pla1'}.{age}[0]。

   —用来构造Map,例如示例中的#{'foo1':'bar1', 'foo2':'bar2'}。

2.%符号

   %符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值,这个类似js中的eval,很暴力。

3.$符号

    $符号主要有两个方面的用途。

       —在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}同${max}之间。

       —在Struts 2框架的配置文件中引用OGNL表达式,例如:

1 
2
3
4
10 5
100 6
BAction-test校验:数字必须为${min}为${max}之间!
7
8
9

 

 

深入理解OGNL

action类OgnlAction.java:
1 package com.tjcyjd.test.action;   2    3 import java.util.Date;   4 import java.util.LinkedList;   5 import java.util.List;   6    7 import javax.servlet.http.HttpServletRequest;   8    9 import org.apache.struts2.ServletActionContext;  10 import org.apache.struts2.convention.annotation.Action;  11 import org.apache.struts2.convention.annotation.Namespace;  12 import org.apache.struts2.convention.annotation.ParentPackage;  13 import org.apache.struts2.convention.annotation.Result;  14 import org.apache.struts2.convention.annotation.Results;  15 import org.springframework.stereotype.Controller;  16   17 import com.opensymphony.xwork2.ActionContext;  18 import com.opensymphony.xwork2.ActionSupport;  19   20 @Controller  21 @Namespace("/test")  22 @ParentPackage("struts-default")  23 @Results( { @Result(name = "success", location = "/other_test/showognl.jsp"),  24         @Result(name = "fail", location = "/bbs/admin_login.jsp"),  25         @Result(name = "input", location = "/bbs/admin_login.jsp") })  26 public class OgnlAction extends ActionSupport {  27     private static final long serialVersionUID = -1494290883433357310L;  28     private List
persons; 29 30 @Action("ognlTest") 31 public String ognlTest() throws Exception { 32 // 获得ActionContext实例,以便访问Servlet API 33 ActionContext ctx = ActionContext.getContext(); 34 // 存入application 35 ctx.getApplication().put("msg", "application信息"); 36 // 保存session 37 ctx.getSession().put("msg", "seesion信息"); 38 // 保存request信息 39 HttpServletRequest request = ServletActionContext.getRequest(); 40 request.setAttribute("msg", "request信息"); 41 // 为persons赋值 42 persons = new LinkedList
(); 43 Person person1 = new Person(); 44 person1.setName("pla1"); 45 person1.setAge(26); 46 person1.setBirthday(new Date()); 47 persons.add(person1); 48 49 Person person2 = new Person(); 50 person2.setName("pla2"); 51 person2.setAge(36); 52 person2.setBirthday(new Date()); 53 persons.add(person2); 54 55 Person person3 = new Person(); 56 person3.setName("pla3"); 57 person3.setAge(16); 58 person3.setBirthday(new Date()); 59 persons.add(person3); 60 61 return SUCCESS; 62 63 } 64 65 public List
getPersons() { 66 return persons; 67 } 68 69 public void setPersons(List
persons) { 70 this.persons = persons; 71 } 72 }

jsp页面showognl.jsp:

1 <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8" %>      2       3 <%@ taglib prefix="s" uri="/struts-tags" %>      4       5       6       7       8       9      10     Struts2 OGNL 演示     11      12      13      14          15      16     

访问OGNL上下文和Action上下文

17 18
19 20

parameters:

21 22

request.msg:

23 24

session.msg:

25 26

application.msg:

27 28

attr.msg:

29 30

31 32

用于过滤和投影(projecting)集合

33 34

年龄大于20

35 36
    37 38
    39 40
    41 42
  • - 年龄:
  • 43 44
    45 46
47 48

姓名为pla1的年龄:

49 50

51 52

构造Map

53 54
55 56

The value of key "foo1" is

57 58

59 60

%符号的用法

61 62
63 64

The value of key "foo1" is

65 66

不使用%:

67 68

使用%:

69 70

71 <% 72 request.setAttribute("req", "request scope"); 73 request.getSession().setAttribute("sess", "session scope"); 74 request.getSession().getServletContext().setAttribute("app", 75 "aplication scope"); 76 %> 77 1.通过ognl表达式获取 属性范围中的值 78
79
80
81
82
83
84
85

86 87 2.通过ognl表达式创建list 集合 ,并且遍历出集合中的值 88
89
90
91
92
93
94
95
96

97 98 3.通过ognl表达式创建Map 集合 ,并且遍历出集合中的值 99
100
102
103
104
105
->
106
107
108
109

110 4.通过ognl表达式 进行逻辑判断 111
112
113 aa 在 集合{'aaa','bbb'}中; 114
115
116 aa 不在 集合{'aaa','bbb'}中; 117
118
119
120 不 在 集合list中; 121
122
123 在 集合list中; 124
125
126

127 128 5.通过ognl表达式 的投影功能进行数据筛选 129
130
131
132
133 ${o }
134
135
136

137 6.通过ognl表达式 访问某个类的静态方法和值 138
139
140 141
142
143
144

145 7.ognl表达式 迭代标签 详细 146
147
149
160
150
151
152
153
154
155
156
157
158
159
pink"> 161
164
167
171
175
179
183
186
187 188
索引 奇? 偶? 首? 尾? 当前迭代数量
162
163
165
166
168
Y
169
N
170
172
Y
173
N
174
176
Y
177
N
178
180
Y
181
N
182
184
185
189
190

191 192 193 8.ognl表达式: if/else if/else 详细
194 <% request.setAttribute("aa",0); %> 195
196 在0-4之间; 197
198
199 在4-8之间; 200
201
202 大于8; 203
204
205

206 9.ognl表达式: url 详细
207 <% request.setAttribute("aa","sss"); %> 208
209
210
100
211
212
213
214 value以字符处理:
215 value明确指定以ognl表达式处理:
216
217

218 10.ognl表达式: checkboxlist 详细
219 1> .list 生成;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
220 name:checkboxlist的名字
221 list:checkboxlist要显示的列表
222 value:checkboxlist默认被选中的选项,checked=checked
223
224
225 以上生成代码:
226
<div></div> 227 &lt;input type="checkbox" name="checkbox1" value="上网" id="checkbox1-1" checked="checked"/&gt; 228 &lt;label for="checkbox1-1" class="checkboxLabel"&gt;上网&lt;/label&gt; 229 &lt;input type="checkbox" name="checkbox1" value="看书" id="checkbox1-2" checked="checked"/&gt; 230 &lt;label for="checkbox1-2" class="checkboxLabel"&gt;看书&lt;/label&gt; 231 &lt;input type="checkbox" name="checkbox1" value="爬山" id="checkbox1-3"/&gt; 232 &lt;label for="checkbox1-3" class="checkboxLabel"&gt;爬山&lt;/label&gt; 233 &lt;input type="checkbox" name="checkbox1" value="游泳" id="checkbox1-4"/&gt; 234 &lt;label for="checkbox1-4" class="checkboxLabel"&gt;游泳&lt;/label&gt; 235 &lt;input type="checkbox" name="checkbox1" value="唱歌" id="checkbox1-5"/&gt; 236 &lt;label for="checkbox1-5" class="checkboxLabel"&gt;唱歌&lt;/label&gt;" 237 <div></div> 238 2> .Map 生成;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
239 name:checkboxlist的名字
240 list:checkboxlist要显示的列表
241 listKey:checkbox 的value的值
242 listValue:checkbox 的lablel(显示的值)
243 value:checkboxlist默认被选中的选项,checked=checked
244
245
246 以上生成代码:
247
<div></div> 248 &lt;input type="checkbox" name="checkbox2" value="1" id="checkbox2-1" checked="checked"/&gt; 249 &lt;label for="checkbox2-1" class="checkboxLabel"&gt;上网&lt;/label&gt; 250 &lt;input type="checkbox" name="checkbox2" value="2" id="checkbox2-2" checked="checked"/&gt; 251 &lt;label for="checkbox2-2" class="checkboxLabel"&gt;看书&lt;/label&gt; 252 &lt;input type="checkbox" name="checkbox2" value="3" id="checkbox2-3"/&gt; 253 &lt;label for="checkbox2-3" class="checkboxLabel"&gt;爬山&lt;/label&gt; 254 &lt;input type="checkbox" name="checkbox2" value="4" id="checkbox2-4"/&gt; 255 &lt;label for="checkbox2-4" class="checkboxLabel"&gt;游泳&lt;/label&gt; 256 &lt;input type="checkbox" name="checkbox2" value="5" id="checkbox2-5" checked="checked"/&gt; 257 &lt;label for="checkbox2-5" class="checkboxLabel"&gt;唱歌&lt;/label&gt; 258 <div></div> 259

260 261

ONGL总结

访问属性

名字属性获取:<s:property value="user.username"/><br>

地址属性获取:<s:property value="user.address.addr"/><br>

访问方法

调用值栈中对象的普通方法:<s:property value="user.get()"/><br>

访问静态属性和方法

调用Action中的静态方法:<s:property value="@struts.action.LoginAction@get()"/>

调用JDK中的类的静态方法:<s:property value="@.lang.Math@floor(44.56)"/><br>

调用JDK中的类的静态方法(同上):<s:property value="@@floor(44.56)"/><br>

调用JDK中的类的静态方法:<s:property value="@java.util.Calendar@getInstance()"/><br>

调用普通类中的静态属性:<s:property value="@struts.vo.Address@TIPS"/><br>

访问构造方法

调用普通类的构造方法:<s:property value="new struts.vo.Student('李晓红' , '美女' , 3 , 25).username"/>

 

1.5. 访问数组

获取List:<s:property value="testList"/><br>

获取List中的某一个元素(可以使用类似于数组中的下标获取List中的内容):

<s:property value="testList[0]"/><br>

获取Set:<s:property value="testSet"/><br>

获取Set中的某一个元素(Set由于没有顺序,所以不能使用下标获取数据):

<s:property value="testSet[0]"/><br> ×

获取Map:<s:property value="testMap"/><br>

获取Map中所有的键:<s:property value="testMap.keys"/><br>

获取Map中所有的值:<s:property value="testMap.values"/><br>

获取Map中的某一个元素(可以使用类似于数组中的下标获取List中的内容):

<s:property value="testMap['m1']"/><br>

获取List的大小:<s:property value="testSet.size"/><br>

 

访问集合 – 投影、选择(? ^ $)

利用选择获取List中成绩及格的对象:<s:property value="stus.{?#this.grade>=60}"/><br>

利用选择获取List中成绩及格的对象的username:

<s:property value="stus.{?#this.grade>=60}.{username}"/><br>

利用选择获取List中成绩及格的第一个对象的username:

<s:property value="stus.{?#this.grade>=60}.{username}[0]"/><br>

利用选择获取List中成绩及格的第一个对象的username:

<s:property value="stus.{^#this.grade>=60}.{username}"/><br>

利用选择获取List中成绩及格的最后一个对象的username:

<s:property value="stus.{$#this.grade>=60}.{username}"/><br>

利用选择获取List中成绩及格的第一个对象然后求大小:

<s:property value="stus.{^#this.grade>=600}.{username}.size"/><br>

集合的伪属性

OGNL能够引用集合的一些特殊的属性,这些属性并不是JavaBeans模式,例如size(),length()等等. 当表达式引用这些属性时,OGNL会调用相应的方法,这就是伪属性.

集合

伪属性

Collection(inherited by Map, List & Set)

size ,isEmpty

List

iterator

Map

keys , values

Set

iterator

Iterator

next , hasNext

Enumeration

next , hasNext , nextElement , hasMoreElements

 

 Lambda   :[…]

格式::[…]

使用Lambda表达式计算阶乘:

<s:property value="#f = :[#this==1?1:#this*#f(#this-1)] , #f(4)"/><br>

OGNL中#的使用

#可以取出堆栈上下文中的存放的对象.

名称

作用

例子

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)

 

转载地址:http://qqixx.baihongyu.com/

你可能感兴趣的文章
相逢在栀枝花开的季节
查看>>
Ajax实现直链(点击量统计)
查看>>
linux下git自动补全命令
查看>>
Ubuntu14.04LTS更新源
查看>>
Ubuntu上hi3531交叉编译环境arm-hisiv100nptl-linux搭建过程
查看>>
oracle分区表、分区索引
查看>>
Tomcat+memcached+Nginx实现session共享
查看>>
Array operation
查看>>
Python基础学习三 文件操作(一)
查看>>
Raid小知识
查看>>
Linux报“Unknown HZ value! (288) Assume 100”错误
查看>>
mysql多实例实例化数据库
查看>>
Sql 字符串长度不足补0
查看>>
我的友情链接
查看>>
golang xml和json的解析与生成
查看>>
小弟的新书《Ext JS权威指南》终于出版了
查看>>
好吧好吧,就在这里消磨时间
查看>>
二层的,DTP+CAM/ARP
查看>>
2011工作总结
查看>>
Java学习笔记二:Java开发工具Eclipse的安装与使用
查看>>