首先了解下OGNL的概念:
OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对象的方法,能够遍历整个对象的结构图,实现对象属性类型的转换等功能。
此外,还得先需弄懂OGNL的一些知识:
OGNL中重要的3个符号:#、%、$:
#符号的用途一般有三种。
— 访问非根对象属性,例如#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.%符号
3.$符号
$符号主要有两个方面的用途。
— 在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}同${max}之间。
— 在Struts 2框架的配置文件中引用OGNL表达式,例如:
- <validators>
- <fieldname="intb">
- <field-validatortype="int">
- <paramname="min">10</param>
- <paramname="max">100</param>
- <message>BAction-test校验:数字必须为${min}为${max}之间!</message>
- </field-validator>
- </field>
- </validators>
下面通过代码对OGNL有更深的了解:
- packagecom.tjcyjd.test.action;
- importjava.util.Date;
- importjava.util.LinkedList;
- importjava.util.List;
- importjavax.servlet.http.HttpServletRequest;
- importorg.apache.struts2.ServletActionContext;
- importorg.apache.struts2.convention.annotation.Action;
- importorg.apache.struts2.convention.annotation.Namespace;
- importorg.apache.struts2.convention.annotation.ParentPackage;
- importorg.apache.struts2.convention.annotation.Result;
- importorg.apache.struts2.convention.annotation.Results;
- importorg.springframework.stereotype.Controller;
- importcom.opensymphony.xwork2.ActionContext;
- importcom.opensymphony.xwork2.ActionSupport;
- @Controller
- @Namespace("/test")
- @ParentPackage("struts-default")
- @Results({@Result(name="success",location="/other_test/showognl.jsp"),
- @Result(name="fail",location="/bbs/admin_login.jsp"),
- @Result(name="input",location="/bbs/admin_login.jsp")})
- publicclassOgnlActionextendsActionSupport{
- privatestaticfinallongserialVersionUID=-1494290883433357310L;
- privateList<Person>persons;
- @Action("ognlTest")
- publicStringognlTest()throwsException{
- //获得ActionContext实例,以便访问ServletAPI
- ActionContextctx=ActionContext.getContext();
- //存入application
- ctx.getApplication().put("msg","application信息");
- //保存session
- ctx.getSession().put("msg","seesion信息");
- //保存request信息
- HttpServletRequestrequest=ServletActionContext.getRequest();
- request.setAttribute("msg","request信息");
- //为persons赋值
- persons=newLinkedList<Person>();
- Personperson1=newPerson();
- person1.setName("pla1");
- person1.setAge(26);
- person1.setBirthday(newDate());
- persons.add(person1);
- Personperson2=newPerson();
- person2.setName("pla2");
- person2.setAge(36);
- person2.setBirthday(newDate());
- persons.add(person2);
- Personperson3=newPerson();
- person3.setName("pla3");
- person3.setAge(16);
- person3.setBirthday(newDate());
- persons.add(person3);
- returnSUCCESS;
- }
- publicList<Person>getPersons(){
- returnpersons;
- }
- publicvoidsetPersons(List<Person>persons){
- this.persons=persons;
- }
- }
jsp页面showognl.jsp:
- <%@pagelanguage="java"contentType="text/html;charset=utf-8"pageEncoding="utf-8"%>
- <%@taglibprefix="s"uri="/struts-tags"%>
- <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <htmlxmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>Struts2OGNL演示</title>
- </head>
- <body>
- <h3>访问OGNL上下文和Action上下文</h3>
- <!-使用OGNL访问属性值-->
- <p>parameters:<s:propertyvalue="#parameters.msg"/></p>
- <p>request.msg:<s:propertyvalue="#request.msg"/></p>
- <p>session.msg:<s:propertyvalue="#session.msg"/></p>
- <p>application.msg:<s:propertyvalue="#application.msg"/></p>
- <p>attr.msg:<s:propertyvalue="#attr.msg"/></p>
- <hr/>
- <h3>用于过滤和投影(projecting)集合</h3>
- <p>年龄大于20</p>
- <ul>
- <!-判断年龄-->
- <s:iteratorvalue="persons.{?#this.age>20}">
- <li><s:propertyvalue="name"/>-年龄:<s:propertyvalue="age"/></li>
- </s:iterator>
- </ul>
- <p>姓名为pla1的年龄:<s:propertyvalue="persons.{?#this.name=='pla1'}.{age}[0]"/></p>
- <hr/>
- <h3>构造Map</h3>
- <s:setname="foobar"value="#{'foo1':'bar1','foo2':'bar2'}"/>
- <p>Thevalueofkey"foo1"is<s:propertyvalue="#foobar['foo1']"/></p>
- <hr/>
- <h4>%符号的用法</h4>
- <s:setname="foobar"value="#{'foo1':'bar1','foo2':'bar2'}"/>
- <p>Thevalueofkey"foo1"is<s:propertyvalue="#foobar['foo1']"/></p>
- <p>不使用%:<s:urlvalue="#foobar['foo1']"/></p>
- <p>使用%:<s:urlvalue="%{#foobar['foo1']}"/></p>
- <hr/>
- <%
- request.setAttribute("req","requestscope");
- request.getSession().setAttribute("sess","sessionscope");
- request.getSession().getServletContext().setAttribute("app",
- "aplicationscope");
- %>
- 1.通过ognl表达式获取属性范围中的值
- <br>
- <s:propertyvalue="#request.req"/>
- <br/>
- <s:propertyvalue="#session.sess"/>
- <br/>
- <s:propertyvalue="#application.app"/>
- <br/>
- <hr>
- 2.通过<spanstyle="background-color:#fafafa;">ognl表达式创建list集合,并且遍历出集合中的值
- <br>
- <s:setname="list"value="{'eeeee','ddddd','ccccc','bbbbb','aaaaa'}"></s:set>
- <s:iteratorvalue="#list"var="o">
- <!--${o}<br/>-->
- <s:property/>
- <br/>
- </s:iterator>
- <br/>
- <hr>
- 3.通过ognl表达式创建Map集合,并且遍历出集合中的值
- <br>
- <s:setname="map"
- value="#{'1':'eeeee','2':'ddddd','3':'ccccc','4':'bbbbb','5':'aaaaa'}"></s:set>
- <s:iteratorvalue="#map"var="o">
- <!--${o.key}->${o.value}<br/>-->
- <!--<s:propertyvalue="#o.key"/>-><s:propertyvalue="#o.value"/><br/>-->
- <s:propertyvalue="key"/>-><s:propertyvalue="value"/>
- <br/>
- </s:iterator>
- <br/>
- <hr>
- 4.通过ognl表达式进行逻辑判断
- <br>
- <s:iftest="'aa'in{'aaa','bbb'}">
- aa在集合{'aaa','bbb'}中;
- </s:if>
- <s:else>
- aa不在集合{'aaa','bbb'}中;
- </s:else>
- <br/>
- <s:iftest="#request.reqnotin#list">
- 不在集合list中;
- </s:if>
- <s:else>
- 在集合list中;
- </s:else>
- <br/>
- <hr>
- 5.通过ognl表达式的投影功能进行数据筛选
- <br>
- <s:setname="list1"value="{1,2,3,4,5}"></s:set>
- <s:iteratorvalue="#list1.{?#this>2}"var="o">
- <!--#list.{?#this>2}:在list1集合迭代的时候,从中筛选出当前迭代对象>2的集合进行显示-->
- ${o}<br/>
- </s:iterator>
- <br/>
- <hr>
- 6.通过ognl表达式访问某个类的静态方法和值
- <br>
- <s:propertyvalue="@java.lang.Math@floor(32.56)"/>
- <s:propertyvalue="@com.rao.struts2.action.OGNL1Action@aa"/>
- <br/>
- <br/>
- <hr>
- 7.ognl表达式迭代标签详细
- <br>
- <s:setname="list2"
- value="{'aa','bb','cc','dd','ee','ff','gg','hh','ii','jj'}"></s:set>
- <tableborder="1">
- <tr>
- <td>索引</td>
- <td>值</td>
- <td>奇?</td>
- <td>偶?</td>
- <td>首?</td>
- <td>尾?</td>
- <td>当前迭代数量</td>
- </tr>
- <s:iteratorvalue="#list2"var="o"status="s">
- <trbgcolor="<s:iftest="#s.even">pink</s:if>">
- <td>
- <s:propertyvalue="#s.getIndex()"/>
- </td>
- <td>
- <s:property/>
- </td>
- <td>
- <s:iftest="#s.odd">Y</s:if>
- <s:else>N</s:else>
- </td>
- <td>
- <s:iftest="#s.even">Y</s:if>
- <s:else>N</s:else>
- </td>
- <td>
- <s:iftest="#s.first">Y</s:if>
- <s:else>N</s:else>
- </td>
- <td>
- <s:iftest="#s.isLast()">Y</s:if>
- <s:else>N</s:else>
- </td>
- <td>
- <s:propertyvalue="#s.getCount()"/>
- </td>
- </tr>
- </s:iterator>
- </table>
- <br>
- <hr>
- 8.ognl表达式:if/elseif/else详细<br>
- <%request.setAttribute("aa",0);%>
- <s:iftest="#request.aa>=0&&#request.aa<=4">
- 在0-4之间;
- </s:if>
- <s:elseiftest="#request.aa>=4&&#request.aa<=8">
- 在4-8之间;
- </s:elseif>
- <s:else>
- 大于8;
- </s:else>
- <br>
- <hr>
- 9.ognl表达式:url详细<br>
- <%request.setAttribute("aa","sss");%>
- <s:urlaction="testAction"namespace="/aa/bb">
- <s:paramname="aa"value="#request.aa"></s:param>
- <s:paramname="id">100</s:param>
- </s:url>
- <br/>
- <s:setname="myurl"value="'http://www.baidu.com'"></s:set>
- value以字符处理:<s:urlvalue="#myurl"></s:url><br>
- value明确指定以ognl表达式处理:<s:urlvalue="%{#myurl}"></s:url>
- <br>
- <hr>
- 10.ognl表达式:checkboxlist详细<br>
- 1>.list生成;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>
- name:checkboxlist的名字<br>
- list:checkboxlist要显示的列表<br>
- value:checkboxlist默认被选中的选项,checkedchecked=checked<br>
- <s:checkboxlistname="checkbox1"list="{'上网','看书','爬山','游泳','唱歌'}"value="{'上网','看书'}"></s:checkboxlist>
- <br>
- 以上生成代码:<br>
- <xmp>
- <inputtype="checkbox"name="checkbox1"value="上网"id="checkbox1-1"checked="checked"/>
- <labelfor="checkbox1-1"class="checkboxLabel">上网</label>
- <inputtype="checkbox"name="checkbox1"value="看书"id="checkbox1-2"checked="checked"/>
- <labelfor="checkbox1-2"class="checkboxLabel">看书</label>
- <inputtype="checkbox"name="checkbox1"value="爬山"id="checkbox1-3"/>
- <labelfor="checkbox1-3"class="checkboxLabel">爬山</label>
- <inputtype="checkbox"name="checkbox1"value="游泳"id="checkbox1-4"/>
- <labelfor="checkbox1-4"class="checkboxLabel">游泳</label>
- <inputtype="checkbox"name="checkbox1"value="唱歌"id="checkbox1-5"/>
- <labelfor="checkbox1-5"class="checkboxLabel">唱歌</label>"
- </xmp>
- 2>.Map生成;~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br>
- name:checkboxlist的名字<br>
- list:checkboxlist要显示的列表<br>
- listKey:checkbox的value的值<br>
- listValue:checkbox的lablel(显示的值)<br>
- value:checkboxlist默认被选中的选项,checkedchecked=checked<br>
- <s:checkboxlistname="checkbox2"list="#{1:'上网',2:'看书',3:'爬山',4:'游泳',5:'唱歌'}"listKey="key"listValue="value"value="{1,2,5}"></s:checkboxlist>
- <br>
- 以上生成代码:<br>
- <xmp>
- <inputtype="checkbox"name="checkbox2"value="1"id="checkbox2-1"checked="checked"/>
- <labelfor="checkbox2-1"class="checkboxLabel">上网</label>
- <inputtype="checkbox"name="checkbox2"value="2"id="checkbox2-2"checked="checked"/>
- <labelfor="checkbox2-2"class="checkboxLabel">看书</label>
- <inputtype="checkbox"name="checkbox2"value="3"id="checkbox2-3"/>
- <labelfor="checkbox2-3"class="checkboxLabel">爬山</label>
- <inputtype="checkbox"name="checkbox2"value="4"id="checkbox2-4"/>
- <labelfor="checkbox2-4"class="checkboxLabel">游泳</label>
- <inputtype="checkbox"name="checkbox2"value="5"id="checkbox2-5"checked="checked"/>
- <labelfor="checkbox2-5"class="checkboxLabel">唱歌</label>
- </xmp>
- <hr>
- </body>
- </html>
总结OGNL的使用方法:
访问属性
名字属性获取:<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="@java.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) |
获取Paraments对象的属性:<s:property value="#parameters.username"/>
OGNL中%的使用
用%{}可以取出存在值堆栈中的Action对象,直接调用它的方法.
例如你的Action如果继承了ActionSupport .那么在页面标签中,用%{getText('key')}的方式可以拿出国际化信息.
OGNL中$的使用
“$”有两个主要的用途
l用于在国际化资源文件中,引用OGNL表达式
l在Struts 2配置文件中,引用OGNL表达式
值栈
ValueStack对象。这个对象贯穿整个Action的生命周期(每个Action类的对象实例会拥有一个ValueStack对象)。当 Struts 2接收到一个.action的请求后,会先建立Action类的对象实例,但并不会调用Action方法,而是先将Action类的相应属性放到 ValueStack对象的顶层节点(ValueStack对象相当于一个栈)。
在Action中获得ValueStack对象:ActionContext.getContext().getValueStack()
lTop语法
使用Top获取值栈中的第二个对象:<s:property value="[1].top.对象"/>
lN语法
使用N获取值栈中的第二个对象:<s:property value="[1].对象"/>
l@语法
调用action中的静态方法:<s:property value="@vs1@静态方法"/> vs:值栈1:表示第一个。
相关推荐
博文参考:http://blog.csdn.net/u011638419/article/details/42041991
OGNL详细讲解, 学习跟多的利用!
关于struts2中ognl的说明、原理及使用,对于初学者进阶是个不错的参考
struts2中siterator 标签的使用详解 及 OGNL用法 struts2中siterator 标签的使用详解 及 OGNL用法
主要介绍了Struts2 OGNL表达式实例详解,相关实例代码,需要的朋友可以参考。
主要介绍了Struts2中ognl遍历数组,list和map方法详解,需要的朋友可以参考下。
从 Struts1 升级到 Struts2: 1、Struts1 里使用 ActionServlet 作为控制器; Struts2 使用了一个过滤器作为控制器 2、Struts1 中每个 ...5、Struts2 在页面里使用 OGNL 来显示各种对象模型, 可以不再使用 EL 和 JSTL
主要介绍了Struts2 使用OGNL遍历map方法详解,具有一定参考价值,需要的朋友可以了解下。
本案例提供ognl使用详解,测试通过,只需解压放入自己WEB项目中,执行struts_ognl包内java文件即可(未提供jia包,若需要可以联系留言发至邮箱),若测试不好可以联系本人提供指导. Struts 2默认的表达式语言是OGNL...
第四章:struts2中的OGNL.ppt 第五章:struts2标签库.ppt 第六章:struts2国际化.ppt 第七章:Struts2验证机制.ppt 第八章:struts2文件上传下载.ppt 第九章:struts2拦截器.ppt + Struts2开发详解.ppt
Struts2和Struts1的常见区别 二. Struts2入门 3. 快速配置Struts2环境 4. 开发一个Struts2简单实例 5. struts.xml文件 三. Struts2深入开发 6. 常用标签配置和使用 7. 常用标签配置和使用 8. 标签 ...
内容: 1、OGNL —— 数据运转的催化剂 2、Result机制,让视图更丰富 3、Struts2配置详解 4、Struts2中的Action 5、Struts2中的参数传递 6、标签库,永恒的争论话题 7、拦截器详解 ...10、在Struts2中使用OGNL
介绍Struts 2及Struts 2开发环境的搭建 第一个Struts 2应用开发 解决Struts 2配置文件无提示问题 Action名称的搜索顺序 Action配置的各项默认值 result配置的各种视图转发类型 为Action属性注入值 指定...
使用Struts2时,利用ognl表达式在页面获取后台参数值
。。。
。。。
1.概述strust2中的拦截器 28 2.自定义拦截器 28 方式一,实现Interceptor接口。 28 方式二、继承AbstractInterceptor抽象类 29 方式三、继承MethodFilterInteceptor类 30 3.使用来MethodFilterInterceptor灵活拦截 ...
properties文件即i18n国际化多国语言版的用法,struts2前台校验,对输入的数据进行验证validators struts2 OGNL 表达式详解 struts2 #,*,%
第一章:认识体验Struts 2 ...第四章:struts2中的OGNL 第五章:struts2标签库 第六章:struts2国际化 第七章:struts2验证 第八章:struts2文件上传下载 第九章:struts2拦截器 第十章:struts2类型转换
内容包括ognl,result机制,struts2配置详解,struts2中的action,struts2中的参数传递,标签库,拦截器的详解,深入plugin