全称:Object Graphic Navigation Language(对象图导航语言)是一个开源项目,是Struts2框架的默认表达式语言。

相对于EL表达式。它提供了平时我们须要的一些功能,如:

·支持对象方法调用,如method.sayHello();

·支持类静态方法调用和值訪问,表达式的格式为@[类全名(包含路径)]@[方法名|值名],比如:@java.lang.String@format(‘foo %s’,’bar’)或

@cn.itcast.Constant@APP_NAME;

·操作集合对象

 

Ognl有一个上下文(Context)概念。用来实现java.utils.Map接口。在Struts2中上下文(Context)的实现为ActionContext。

以下为ActionContext包括的对象:

·ValueStack(值栈,它是跟对象)

·parameters

·request

·session

·application

·attr

当Struts2接受一个请求时。会迅速创建ActionContext,ValueStack。action然后把action存放入ValueStack中。所以action的实例变量能够被OGNL訪问。

訪问上下文(Context)中的对象须要使用#符号标注命名空间,如:#application、#session,另外OGNL会设定一个根对象(root对象)。在Struts2中根对象就是ValueStack(值栈),假设要訪问根对象的属性,则能够省略#命名空间,直接訪问该对象的属性。

在Struts2中,根对象ValueStack的实现类为OgnlValueStack。该对象存放一组对象。在OgnlValueStack类里面有一个List类型的root变量。就是使用它存放一组对象。

在root变量中处于第一位的对象叫做栈顶对象,通常我们在OGNL表达式里直接写上属性的名称就可以訪问root变量对象的属性,搜索顺序是从栈顶对象開始寻找。假设栈顶对象不存在该属性,就会从第二个对象寻找。假设没有就继续依次往下訪问。直至找到为止。

注意:Struts2中,OGNL表达式须要配合Struts标签才干使用,如:<s:property value=”name”/>

因为ValueStack是struts2中OGNL的根对象,假设用户须要訪问值栈中的对象,在JSP页面能够直接通过以下的EL表达式訪问ValueStack中的属性:

${propertise }//获得值栈中某个对象的properties属性

假设訪问其他Context中的对象。因为不是根对象,所以在訪问时须要加入#前缀:

·application对象:用于訪问ServletContext方法:#application.userName或#application[‘userName’]

相当于调用ServletContext的   getAttribute(“userName”)。

·session对象:用于訪问HttpSession方法:#session.userName或#session[‘userName’]

相当于调用session.getAttribute(“userName”)。

·request对象:用于訪问HttpServletrequest属性的Map方法:#request.userName或#request[‘userName’]

相当于调用request.getAttribute(“userName”)。

 

·parameters对象:用于訪问Http的请求參数方法:#parameters.userName或#parameters[‘userName’]

相当于调用request.getparameter(“userName”)。

 

·attr对象:用于按page->request->session->application顺序訪问起属性。

property标签:

property标签用于输出指定值:

<s:set name=”name” value=”kk”/>
<s:property value=”#naem”/>

default:可选属性,假设须要输出属性的值为null,则显示该属性的值

escape:可选属性。指定是否格式化HTML代码

value:可选属性,指定须要输出的属性值。假设没有指定该属性,则默认输出
ValueStack栈顶的值

id:可选属性。指定该元素的标识

iterate标签:

iterate标签用于对集合进行迭代,这里的集合包括List、Set和数组。

<span style="font-size:12px;"><s:set name=”list” value=”{‘zhao’,’qian’,’sun’}”/>
<s:iterator value=”#list” status=”st”>
<font color=<s:if test=”#st.odd”>red</s:if>
<s:else>blue</s:else>>
<s:property/>
</font><br>
</s:iterator></span>

value:可选属性。指定须要输出的属性值,假设没有指定该属性,则默认输出
ValueStack栈顶的值

status:可选属性,该属性指定迭代时的iterateStatus实例,

该方法有例如以下几个方法:

int getCount(),返回当前迭代了几个元素

int getIndex(),返回当前迭代元素的索引

boolean isEven(),返回当前被迭代的元素的索引是否是偶数

boolean isOdd(),返回当前被迭代的元素的索引是否是奇数

boolean isFirst(),返回当前被迭代的元素是否为第一个元素

boolean isLast()。返回当前被迭代的元素是否为最后一个

if/elseif/else标签:

<s:set name=”age” value=”33”/>
<s:if test=”#age==33”>
33
</s:if>
<s:elseif test=”#age==22”>
22
</s:elseif>
<s:else>
都不等
</s:else>



url标签:

<span style="font-size:12px;"><s:set name="age" value="33" scope="request" />
<s:url action="hello" namespace="/test">
<s:param name="personId" value="#request.age"></s:param>
</s:url></span>

输出为:/Ognl/test/hello.action?personId=33

当标签的属性值为字符串类型处理时,”%”符号的用途是计算OGNL表达式的值。

<s:set name="myurl" value="'http://www.hao123.com'" />
<s:url value="%{#myurl}" />
<!-- 使用%{}强制输出url的value值-->

输出为:http://www.hao123.com

表单标签checkBoxList复选框:

假设集合为list:

<struts>
<!--默认的视图主题-->
<constant name="struts.ui.theme" value="simple"/>
</struts> <s:radio name="list" list="{'Java','.Net','Php','Ror'}" value="{'.Net'}" />
<s:checkboxlist name="list" list="{'Java','.Net','Php','Ror'}" value="{'Java','.Net'}" />



防止表单的反复提交:

1)登录界面index.jsp中的代码:

<s:form action="hello" namespace="/test" method="post">
姓名:<s:textfield name="name" />
<s:token />
<input type="submit" value="发送" />
</s:form>

2)struts.xml文件里的代码:

<package name="base" namespace="/test"
extends="struts-default">
<action name="hello" class="struts2.personAction">
<!-- 增加拦截器,当再一次訪问已经訪问到的页面时,会跳转到登陆页面 -->
<interceptor-ref name="defaultStack" />
<interceptor-ref name="token" />
<result name="invalid.token">/index.jsp</result>
<result name="success">/show.jsp</result>
</action>
</package>
</struts>

3)personAction中的代码:

public class personAction {
private String name; public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String execute(){
return "success";
}
}

4)显示层show.jsp中的代码:

<body>
<s:property value="name" />
<br /><%=new Date()%>
<br>
</body>

注意:以上配置了“token”拦截器和“invalid.token”结果,由于“token”拦截器在会话的token与请求的token不一致时,将会直接返回“invalid.token”结果。

struts2_13_OGNL表达式的更多相关文章

  1. 【.net 深呼吸】细说CodeDom(2):表达式、语句

    在上一篇文章中,老周厚着脸皮给大伙介绍了代码文档的基本结构,以及一些代码对象与CodeDom类型的对应关系. 在评论中老周看到有朋友提到了 Emit,那老周就顺便提一下.严格上说,Emit并不是针对代 ...

  2. 你知道C#中的Lambda表达式的演化过程吗?

    那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传递方法的类型.(用来传递数字的类型有int.float ...

  3. 再讲IQueryable<T>,揭开表达式树的神秘面纱

    接上篇<先说IEnumerable,我们每天用的foreach你真的懂它吗?> 最近园子里定制自己的orm那是一个风生水起,感觉不整个自己的orm都不好意思继续混博客园了(开个玩笑).那么 ...

  4. Linq表达式、Lambda表达式你更喜欢哪个?

    什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在& ...

  5. 背后的故事之 - 快乐的Lambda表达式(一)

    快乐的Lambda表达式(二) 自从Lambda随.NET Framework3.5出现在.NET开发者眼前以来,它已经给我们带来了太多的欣喜.它优雅,对开发者更友好,能提高开发效率,天啊!它还有可能 ...

  6. Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)

    作者:Antonio Leiva 时间:Jan 5, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin/ 由于Lambda表达式允许更简单的方式建模式 ...

  7. SQL Server-表表达式基础回顾(二十四)

    前言 从这一节开始我们开始进入表表达式章节的学习,Microsoft SQL Server支持4种类型的表表达式:派生表.公用表表达式(CTE).视图.内嵌表值函数(TVF).简短的内容,深入的理解, ...

  8. 立即执行函数表达式(IIFE)

    原文地址:benalman.com/news/2010/11/immediately-invoked-function-expression/ 译者:nzbin 也许你还没有注意到,我是一个对术语比较 ...

  9. javascript:逆波兰式表示法计算表达式结果

    逆波兰式表示法,是由栈做基础的表达式,举个例子: 5 1 2 + 4 * + 3 -  等价于   5 + ((1 + 2) * 4) - 3 原理:依次将5 1 2 压入栈中, 这时遇到了运算符 + ...

随机推荐

  1. Poj 1041--欧拉回路

    Description Little Johnny has got a new car. He decided to drive around the town to visit his friend ...

  2. 基于注解实现SpringBoot多数据源配置

    1.功能介绍 在实际的开发中,同一个项目中使用多个数据源是很常见的场景.最近在学习的过程中使用注解的方式实现了一个Springboot项目多数据源的功能.具体实现方式如下. 2.在applicatio ...

  3. android项目引入第三方库工程出现的问题及解决方案

    一.导入libar库工程 1.使用第三方库工程libary,基本上都是从github上下载,解压后里面有个libary文件夹 2.将libary导入到eclipse中,步骤如下 1)在eclipse包 ...

  4. 公钥密码之RSA密码算法大素数判定:Miller-Rabin判定法!

    公钥密码之RSA密码算法大素数判定:Miller-Rabin判定法! 先存档再说,以后实验报告还得打印上交. Miller-Rabin大素数判定对于学算法的人来讲不是什么难事,主要了解其原理. 先来灌 ...

  5. redis中redis.conf配置文件

    redis.conf文件配置解释 1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程 daemonize yes 2. 当Redis以守护进程方式运行时,Red ...

  6. BZOJ 3168 [Heoi2013]钙铁锌硒维生素 ——矩阵乘法 矩阵求逆

    考虑向量ai能否换成向量bj 首先ai都是线性无关的,然后可以a线性表出bj c1*a1+c2*a2+...=bj 然后移项,得 c1/ci*a1+...-1/ci*bj+...=ai 所以当ci不为 ...

  7. uva 10515 规律打表

    Problem G Power et al. Input: Standard Input Output: Standard Output Finding the exponent of any num ...

  8. BZOJ4723: [POI2017]Flappy Bird

    $n \leq 500000$个水管,每秒横坐标加一,纵坐标如果你点击就+1否则-1,问从$(0,0)$飞到$m$处最少点多少次,或者说明无解. 如果能飞到某个水管的高度区间$[L,R]$,那么答案肯 ...

  9. php生成压缩包

    $filename = "./" . date ( 'YmdH' ) . ".zip"; // 最终生成的文件名(含路径) // 生成文件 $zip = new ...

  10. Eclipse、IDEA安装JavaFX

    简介 JavaFX插件 e(fx)eclipse是一组工具和必要的库,它们帮助您执行JavaFX编程,确保您已经作为插件将其安装在eclipse上了. JavaFX Scene Builder Jav ...