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的缩写,中文名是对象图导航语言,它是一 ...
随机推荐
- JVM笔记-temp
jvm源码分析之堆外内存完全解读 http://lovestblog.cn/blog/2015/05/12/direct-buffer/
- Java笔记-快速失败and安全失败
参考资料:http://blog.csdn.net/chenssy/article/details/38151189 快速失败 fail-fast 安全失败 fail-safe java.util包下 ...
- iOS开发之WKWebView简单使用
iOS开发之WKWebView简单使用 iOS开发之 WKWebVeiw使用 想用UIWebVeiw做的,但是突然想起来在iOS8中出了一个新的WKWebView,算是UIWebVeiw的升级版. ...
- VM虚拟机上 实现CentOS 6.X下部署LVS(DR)+keepalived实现高性能高可用负载均衡
一.简介 LVS是Linux Virtual Server的简写,意即Linux虚拟服务器,是一个虚拟的服务器集群系统.本项目在1998年5月由章文嵩博士成立,是中国国内最早出现的自由软件项目之一. ...
- Web分析日志分析2
http://www.docin.com/p-649515490.html http://wenku.baidu.com/link?url=kB-83fbl1Zc3Y6U2BYLj-lKMWShe8Z ...
- OSPF+LVS ,qugga,vconfig,...感觉这些很有想法啊
将以前铁板一块的硬件拿来无限细分,路由器,交换机可灵活实现,SDN,NVF.硬盘可以分区,分区可以分布式块存储,操作系统可虚拟化,KVM OR LXC,网络可自由随时按需求定制更改配置. 操作系统支持 ...
- KEIL, a Smart Comliler
KEIL是一个神的编译器.举一二例来说明: 1. 编译器出现WARNING"expression with possibly no effect",是提示你当前语在正做无用功,如在 ...
- 使用Qt编写模块化插件式应用程序
动态链接库技术使软件工程师们兽血沸腾,它使得应用系统(程序)可以以二进制模块的形式灵活地组建起来.比起源码级别的模块化,二进制级别的模块划分使得各模块更加独立,各模块可以分别编译和链接,模块的升级不会 ...
- Delphi 托盘程序实现 转
unit MainUnit; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, F ...
- AWK中几个变量
学习AWK语言 https://awk.readthedocs.org/en/latest/chapter-one.html http://www.ibm.com/developerworks/cn/ ...