Struts2 之 ognl
OGNL表达式语言(#号的用法)
用法1:访问OGNL上下文和Action上下文,#相当ActionContext.getContext()
1、 如果访问其他Context中的对象,由于他们不是根对象,所以在访问时,需要添加#前缀

也可写为#request[‘userName’]或#session[‘userName’]或#appliction[‘userName’]
2 、OGNL会设定一个根对象(root对象),在Struts2中根对象就是ValueStack(值栈) 。如果要访问根对象(即ValueStack)中对象的属性,则可以省略#命名对象,直接访问该对象的属性即可
Action中代码:
ValueStack valueStack=ServletActionContext.getContext().getValueStack();
valueStack.set("msg", "msg_xxx");
Jsp页面:
valueStack:<s:property value="msg"/><br>
用法2:集合的投影(过滤)
1、集合的投影(只输出部分属性)
collectionName.{ expression }

<s:iterator value="#request.persons.{name}" var="person">
<s:property value="#person"/><br>
</s:iterator>
2、集合的过滤
1) 集合的过滤有以下三种方式:
a.“?#”:过滤所有符合条件的集合,如:users.{?#this.age > 19};
b.“^#”:过滤第一个符合条件的元素,如:users.{^#this.age > 19};
c.“$#”:过滤最后一个符合条件的元素,如:users.{$#this.age > 19}
2) this 表示集合中的元素;
<s:iterator value="#request.persons.{?#this.age>24}" var="person">
<s:property value="#person"/><br>
</s:iterator>
3、集合的投影和过滤
投影(过滤)操作返回的是一个集合,可以使用索引取得集合中指定的元素,如:users.{?#this.age > 19}[0]
<s:iterator value="#request.persons.{?#this.age>24}.{name}" var="person">
<s:property value="#person"/><br>
</s:iterator>
用法3:构造Map,如#{‘foo1’:‘bar1’, ‘foo2’:‘bar2’}。
这种方式常用在给radio或select、checkbox等标签赋值上
jsp页面:
<s:radio list=“#{‘male’:‘男’,‘female’:‘女’}” name=“sex” label=“性别” />
运行结果是
<input type="radio" name="sex" id="sexmale" value="male"/>男
<input type="radio" name="sex" id="sexfemale" value="female"/>女
Action中的代码:
Map map=new HashMap();
map.put("male", "男");
map.put("female", "女");
ServletActionContext.getRequest().setAttribute("map", map);
jsp页面:
<s:radio list="#request.map" name="sex" label="性别" />
运行结果是
<input type="radio" name="sex" id="sexfemale" value="female"/>女
<input type=“radio” name=“sex” id=“sexmale” value=“male”>男
OGNL表达式语言(%用法)
%”符号的用途是在标签的属性值被理解为字符串类型时,告诉执行环境%{}里的是OGNL表达式。
形式一: { }中ognl表达式
Action中的代码:
ServletActionContext.getRequest().setAttribute("username", "username_request");
jsp页面:
<s:textfield name="name" label="%{#request.username} "/>
运行结果是
username_request : <input type="text" name="name" value="" id="name"/>
形式二: { }中值用 ’ ’引起来,这是不再是ogle表达式,而是普通的字符串
jsp页面:
<s:textfield name="name" label="%{'foo'}"/>
运行结果是
foo : <input type="text" name="name" value="" id="name"/>
OGNL表达式语言($用法)
“$”有两个主要的用途
* 用于在国际化资源文件中,引用OGNL表达式
* 在Struts 2配置文件中,引用OGNL表达式
在struts2配置文件中引用ognl表达式 ,引用request等作用域中的值
Action中的代码:
ServletActionContext.getRequest().setAttribute("msgxx", "msg_request");
struts.xml文件中
<package name="ognl" namespace="/ognl" extends="struts-default" >
<action name="ognlAction_*" class="cn.itcast.ognl.OgnlAction" method="{1}">
<result name="ognl">/ognl/ongl.jsp?msg=${#request.msgxx}</result>
</action>
</package>
jsp页面:
parameters Msg:<s:property value="#parameters.msg[0]"/>
运行结果是
msg_request
在struts2配置文件中引用ognl表达式 ,引用值栈的值
Action中的代码:
valueStack.set("msgxx", "msg_valueStack");
struts.xml文件中
<package name="ognl" namespace="/ognl" extends="struts-default" >
<action name="ognlAction_*" class="cn.itcast.ognl.OgnlAction" method="{1}">
<result name="ognl">/ognl/ongl.jsp?msg=${msgxx}</result>
</action>
</package>
jsp页面:
parameters Msg:<s:property value="#parameters.msg[0]"/>
运行结果是
msg_valueStack
OGNL标签
property标签
property标签用于输出指定值:
<s:property value=“#name" default="a default value" />
* default: 可选属性, 如果需要输出的属性值为null,则显示该属性指定的值
* escape:可选属性,指定是否格式化HTML代码。 escape=“false”时,hr作为html标签使用
* value: 可选属性,指定需要输出的属性值,如果没有指定该属性,则默认输出ValueStack栈顶的值。
<s:property value="#request.username"/>:输出栈顶的值
输出: username=username_valueStack, msgxx=msg_valueStack <s:property value="#request.username111" default="default value"/>
<s:property value="%{'<hr> hr的使用'}" escape="false" />
输出:<hr> hr的使用
注:escape=“false”时,hr作为html标签使用
set标签
set标签用于将某个值放入指定范围。
var:变量的名字,name,id和var表达的含义是一样的,name,id被var替代
scope:指定变量被放置的范围,该属性可以接受application、session、request、 page或action。如果没有设置该属性,则默认放置在action中。
value:赋给变量的值.如果没有设置该属性,则将ValueStack栈顶的值赋给变量。
<s:set value="#request.username" var="xxx“ scope=“request” /><br>
<s:property value=“#request.xxx" /><br> <s:set value="#request.username" var="xxx" scope="page" /><br>
<s:property value="#attr.xxx" /><br> <s:set value="#request.username" var="xxx" /><br>
<s:property value="xxx" /><br>
push标签
push:将对象放入栈顶,不能放入其他范围,当标签结束,会从栈顶删除。
value:要push到堆栈中的值 。
<s:push value="#request.username">
<s:property/>
</s:push>
<br>
测试删除: <s:property/>
action标签
Action:通过指定命名空间和action名称,该标签允许在jsp页面直接调用Action
name:action名字(不包括后缀,如.action)
namespace:action所在命名空间
executeResult:Action的result是否需要被执行,默认值是false不执行
<package name="ognl" namespace="/ognl" extends="struts-default" >
<action name="ognlAction_*" class="cn.itcast.ognl.OgnlAction" method="{1}">
<result name="ognl">/ognl/ongl.jsp?msg=${msgxx}</result>
</action>
</package> <s:action name="ognlAction_test" namespace="/ognl" executeResult="true" />
iterator标签
Iterator:标签用于对集合进行迭代,这里的集合包含List、Set和数组。
value:可选属性,指定被迭代的集合,如果没有设置该属性,则使用ValueStack栈顶的集合。
var: 可选属性,引用变量的名称.
status:可选属性,该属性指定迭代时的IteratorStatus实例。该实例包含如下几个方法:
int getCount(),返回当前迭代了几个元素。
int getIndex(),返回当前迭代元素的索引。
boolean isEven(),返回当前被迭代元素的索引是否是偶数
boolean isOdd(),返回当前被迭代元素的索引是否是奇数
boolean isFirst(),返回当前被迭代元素是否是第一个元素。
boolean isLast(),返回当前被迭代元素是否是最后一个元素。
<s:iterator value="%{#request.persons}" var="person">
<s:property value="#person"/><br>
</s:iterator>
<s:iterator value="%{#request.persons}" var="person">
<s:property value="#person.id"/>~<s:property value="#person.name"/>~<s:property value="#person.age"/>
</s:iterator>
<s:iterator value="%{#request.persons}" var="person" status="st">
返回当前迭代了几个元素. <s:property value="#st.count"/><br>
返回当前迭代元素的索引.<s:property value="#st.index"/><br>
返回当前被迭代元素的索引是否是偶数.<s:property value="#st.even"/><br>
返回当前被迭代元素的索引是否是奇数.<s:property value="#st.odd"/><br>
返回当前被迭代元素是否是第一个元素.<s:property value="#st.first"/><br>
返回当前被迭代元素是否是最后一个元素.<s:property value="#st.last"/><br><br>
</s:iterator>
<table border="1">
<s:iterator value="%{#request.persons}" var="person" status="st">
<tr class="<s:property value="#st.even?'evenClass':'oddClass'"/>">
<td><s:property value="#person.id"/></td>
<td><s:property value="#person.name"/></td>
<td><s:property value="#person.age"/></td>
</tr>
</s:iterator>
</table>
if/elseif/else标签
if/elseif/else 基本的流程控制.‘If’标签可单独使用也可以和‘Else If’标签和(或)一个多个‘Else’一起使用
<s:if test="#age==23">
23
</s:if>
<s:elseif test="#age==21">
21
</s:elseif>
<s:else>
都不等
</s:else>
url标签
url:该标签用于创建url,可以通过"param"标签提供request参数.
value:如果不提供就用当前action,使用value后缀必须加.action
action:用来生成url的action,如果没有则使用value
namespace :命名空间
var:引用变量的名称.
<s:url action="ognlTagAction_test" namespace="/ognl" var="myurl">
<s:param name="name" value="%{'张老师'}"></s:param>
<s:param name="id" value="12"></s:param>
</s:url> <a href='<s:property value="#myurl" />' >xxxx</a><br>
<a href='<s:property value="%{#myurl}" />' >xxxx</a><br> 使用value<br>
<s:url value="ognlTagAction_test.action" namespace="/ognl" var="myurl">
<s:param name="id" value="12"></s:param>
<s:param name="cnname" value="%{'zhang'}"></s:param>
</s:url> <a href='<s:property value="#myurl" />' >xxxx</a><br>
ognl操作集合
使用ognl操作list和数组
Action中:
List<Person> list = new ArrayList<Person>();
for(int i=0;i<;i++){
Person p = new Person();
p.setId(i);
p.setName("lucy"+i);
p.setAge(20+i);
list.add(p);
}
request.setAttribute("persons", list);
Jsp:
集合的长度:<s:property value="#request.persons.size"/><br>
使用ognl操作list和数组
ognl也可直接创建集合对象. 利用下拉列表框:

Jsp:
<s:iterator value="{1,2,3,4}">
<s:property/> <br>
</s:iterator> <s:iterator value="{'s1','s2','s3','s4'}" var="s">
<s:property value="#s"/> <br>
</s:iterator>
使用ognl操作map
ognl用多种方式使用#号,每种是不同的.动态map对于动态单选按扭组很有用.
创建map与创建list语法很相似,不同的是map前需要加"#"号.


<s:iterator value="#{'key01':'value01','key02':'value02'}">
<s:property/> <br>
</s:iterator>
<s:iterator value="#{'key01':'value01','key02':'value02'}">
key=<s:property value="key"/> value=<s:property value="value"/> <br>
</s:iterator>
<s:iterator value="#{'key01':'value01','key02':'value02'}" var="map">
key=<s:property value="#map.key"/> value=<s:property value="#map.value"/> <br>
</s:iterator>
Struts2 之 ognl的更多相关文章
- Struts2的OGNL表达式语言
一.OGNL的概念 OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者 ...
- Struts2之OGNL
一.OGNL是什么? OGNL(Object-Graph Navigation Language)对象图导航语言,是一种表达式语言,它可以 1.遍历对象的结构图 2.存取对象的属性(实例属性和静态属性 ...
- Struts2对Ognl的支持
Struts2对Ognl的支持 一. 写作背景 由于工作性质的变化,最近一直在研究struts2,从 ...
- Struts2的OGNL标签详解
一.Struts2可以将所有标签分成3类: UI标签:主要用于生成HTML元素的标签. 非UI标签:主要用于数据库访问,逻辑控制等标签. Ajax标签:用于Ajax支持的标签. 对于UI标签,则有可以 ...
- struts2之OGNL和struts2标签库和ValueStack对象
OGNL简介: (1)OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目. struts2框架默认就支持Ognl表达式语言(所以 ...
- 2018.11.25 struts2与OGNL表达式的结合(高级)
两者的结合原理 底层源码分析 栈原理 先进后出 我们的valuestack其实是一个接口 在实现类中有这个参数 CompoundRoot的类继承的是ArrayList,具体实现弹栈和压栈的方法具体实现 ...
- 【Struts2】Ognl与ValueStack
一.OGNL 1.1 概述 1.2 OGNL 五大类功能 1.3 演示 二.ValueStack 2.1 概述 2.2 ValueStack结构 2.3 结论 2.3 一些问题 三.OGNL表达式常见 ...
- JavaWeb_(Struts2框架)Ognl小案例查询帖子
此系列博文基于同一个项目已上传至github 传送门 JavaWeb_(Struts2框架)Struts创建Action的三种方式 传送门 JavaWeb_(Struts2框架)struts.xml核 ...
- Struts2与OGNL的联系
1.Struts与OGNL的结合原理 (1)值栈: OGNL表达式要想运行就要准备一个OGNLContext对象,Struts2内部含有一个OGNLContext对象,名字叫做值栈. 值栈也由两部分组 ...
- Struts2之OGNL与ValueStack
时间:2017-1-12 12:02 --OGNL1.OGNL表达式是什么 OGNL的全称是Object-Graph Navigation Language的缩写,中文名是对象图导航语言,它是一 ...
随机推荐
- Kafka笔记--指定消息的partition规则
参数的设定:参考资料 不错的资料:http://blog.csdn.net/honglei915/article/details/37697655 http://developer.51cto.com ...
- Windows提供了两种将DLL映像到进程地址空间的方法(隐式和显式)
调用DLL,首先需要将DLL文件映像到用户进程的地址空间中,然后才能进行函数调用,这个函数和进程内部一般函数的调用方法相同.Windows提供了两种将DLL映像到进程地址空间的方法: 1. 隐式的加载 ...
- 对WM_NCHITTEST消息的了解+代码实例进行演示(消息产生消息,共24个枚举值)
这个消息比较实用也很关键,它代表非显示区域命中测试.这个消息优先于所有其他的显示区域和非显示区域鼠标消息.其中lParam参数含有鼠标位置的x和y屏幕坐标,wParam 这里没有用. Windows应 ...
- 14.4.1 Buffer Pool
14.4.1 Buffer Pool buffer pool 是一个主人的内存区域 InnoDB caches 表和index 数据. buffer pool 允许经常访问的数据直接从内存里处理,加快 ...
- POJ2586 Y2K Accounting Bug(贪心)
题目链接. 题目大意: 题目相当晦涩难懂啊. 一年的12个月,每5个月统计一次,如从1~5,2~6,3~7,...,8~12共统计了8次,已知每次都deficit,问这一年有没有盈利的可能. 一个月s ...
- 【转】Android Studio安装配置学习教程指南 Gradle基础--不错
原文网址:http://www.linuxidc.com/Linux/2015-02/113890p4.htm 其实很早之前也写了一篇Gradle的基础博客,但是时间很久了,现在Gradle已经更新了 ...
- 【转】HashSet的用法
原文网址:http://blog.csdn.net/aidesudi/article/details/4720201 Java代码 public class TestHashSet { public ...
- C语言中for循环的使用
for循环的作用: 注意:要主要满足条件一和二后是先执行语句,后再执行条件三. 简单重复的输出 for(int i=0:i<10;i++){ printf("对一句话简单重复输出输出1 ...
- sql server 主从数据库同步 利用发布 订阅是实现
发布订阅功能自SQL 2005之后就有了 配置方法可参考:http://blog.csdn.net/wanmdb/article/details/7515277 遇到问题: 1. 如果代理无法启动 , ...
- 在linux下文件转码
在linux下转码命令: iconv -f utf-8 a.txt > b.txt