OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。

片头(ognl.jsp)

<%
request.setAttribute("para", "request scope attribute");
request.getSession().setAttribute("para", "session scope attribute");
request.getSession().getServletContext().setAttribute("para", "aplication scope attribute"); List<Student> listStudent = new ArrayList<Student>();
listStudent.add(new Student(1, "张三", new Date()));
listStudent.add(new Student(2, "李四", new Date()));
listStudent.add(new Student(3, "赵五", new Date()));
listStudent.add(new Student(4, "孙六", new Date()));
listStudent.add(new Student(5, "钱七", new Date()));
pageContext.setAttribute("listStudent", listStudent);
%>

调用

http://127.0.0.1:8080/st/ssh/demo6/ognl.jsp?para=hello

1. 通过OGNL表达式获取属性范围中的值

    <br/>
HTTP parameters para = <s:property value="#parameters.para" />
<br/>
request attribute para = <s:property value="#request.para" />
<br/>
session attribute para = <s:property value="#session.para" />
<br/>
application attribute para = <s:property value="#application.para" />
<br/>
attr attribute para = <s:property value="#attr.para" />
<br/>
<hr>

输出:

HTTP parameters para = hello
request attribute para = request scope attribute
session attribute para = session scope attribute
application attribute para = aplication scope attribute
attr attribute para = request scope attribute

2. 通过OGNL表达式创建list集合,并且遍历出集合中的值

    <br>
<s:set name="list" value="{'eeeee','ddddd','ccccc','bbbbb','aaaaa'}"></s:set>
<s:iterator value="#list" var="o">
${o}<br/>
<!--<s:property />-->
</s:iterator>
<br/>
<hr>

输出:

eeeee
ddddd
ccccc
bbbbb
aaaaa

3. 通过OGNL表达式创建Map集合,并且遍历出集合中的值

    <br>
<s:set name="map"
value="#{'1':'eeeee','2':'ddddd','3':'ccccc','4':'bbbbb','5':'aaaaa'}"></s:set>
<s:iterator value="#map" var="o">
${o.key}->${o.value}<br/>
<!-- <s:property value="#o.key"/>-><s:property value="#o.value"/><br/> -->
<!-- <s:property value="key" />-><s:property value="value" /> -->
</s:iterator>
<br/>
<hr>

输出:

1->eeeee
2->ddddd
3->ccccc
4->bbbbb
5->aaaaa

4. 通过OGNL表达式,进行逻辑判断

    <br>
<s:if test="'aaa' in {'aaa','bbb'}">
aaa 在 集合{'aaa','bbb'}中;
</s:if>
<s:else>
aaa 不在 集合{'aaa','bbb'}中;
</s:else> <br/> <s:if test="#request.req not in #list">
不 在 集合list中;
</s:if>
<s:else>
在 集合list中;
</s:else>
<br/>
<hr>

输出:

aaa 在 集合{'aaa','bbb'}中;
不 在 集合list中;

5. 通过OGNL表达式的投影功能进行数据筛选

    <s:iterator value="#attr.listStudent.{?#this.id % 2 != 0}" var="cur">
<s:property value="#cur.username"/>
</s:iterator>
<br/>
<s:iterator value="#attr.listStudent.{^#this.id % 2 != 0}" var="cur">
<s:property value="#cur.username"/>
</s:iterator>
<br/>
<s:iterator value="#attr.listStudent.{$#this.id % 2 != 0}" var="cur">
<s:property value="#cur.username"/>
</s:iterator>
<br/>
<s:property value="#attr.listStudent.{username}[0]"/>
<br/>
<s:property value="#attr.listStudent.{$#this.id == 3}.{username}[0]"/>
<br/>

输出:

张三   赵五    钱七    
张三      
钱七      
张三  
赵五

6. 通过OGNL表达式访问某个类的静态方法和值

    <br>
<s:property value="@java.lang.Maths@floor(32.56)" />
<br/>
<hr>

输出:

32.0

7. OGNL表达式 迭代标签 详细

    <br>
<s:set name="list2"
value="{'aa','bb','cc','dd','ee','ff','gg','hh','ii','jj'}"></s:set>
<table border="1">
<tr>
<td>
索引
</td>
<td>

</td>
<td>
奇?
</td>
<td>
偶?
</td>
<td>
首?
</td>
<td>
尾?
</td>
<td>
当前迭代数量
</td>
</tr>
<s:iterator value="#list2" var="o" status="s">
<tr bgcolor="<s:if test="#s.even">pink</s:if>">
<td>
<s:property value="#s.getIndex()" />
</td>
<td>
<s:property />
</td>
<td>
<s:if test="#s.odd">Y</s:if>
<s:else>N</s:else>
</td>
<td>
<s:if test="#s.even">Y</s:if>
<s:else>N</s:else>
</td>
<td>
<s:if test="#s.first">Y</s:if>
<s:else>N</s:else>
</td>
<td>
<s:if test="#s.isLast()">Y</s:if>
<s:else>N</s:else>
</td>
<td>
<s:property value="#s.getCount()"/>
</td>
</tr>
</s:iterator>
</table>

输出:

8. 完整代码(ognl.jsp)

<%@ page language="java" import="java.util.*,com.clzhang.ssh.demo6.Student" pageEncoding="utf-8"%>
<%@ taglib uri="/struts-tags" prefix="s"%>
<%
request.setAttribute("para", "request scope attribute");
request.getSession().setAttribute("para", "session scope attribute");
request.getSession().getServletContext().setAttribute("para", "aplication scope attribute"); List<Student> listStudent = new ArrayList<Student>();
listStudent.add(new Student(1, "张三", new Date()));
listStudent.add(new Student(2, "李四", new Date()));
listStudent.add(new Student(3, "赵五", new Date()));
listStudent.add(new Student(4, "孙六", new Date()));
listStudent.add(new Student(5, "钱七", new Date()));
pageContext.setAttribute("listStudent", listStudent);
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<body>
1. 通过OGNL表达式获取属性范围中的值
<br/>
HTTP parameters para = <s:property value="#parameters.para" />
<br/>
request attribute para = <s:property value="#request.para" />
<br/>
session attribute para = <s:property value="#session.para" />
<br/>
application attribute para = <s:property value="#application.para" />
<br/>
attr attribute para = <s:property value="#attr.para" />
<br/>
<hr> 2. 通过OGNL表达式创建list集合,并且遍历出集合中的值
<br>
<s:set name="list" value="{'eeeee','ddddd','ccccc','bbbbb','aaaaa'}"></s:set>
<s:iterator value="#list" var="o">
${o}<br/>
<!--<s:property />-->
</s:iterator>
<br/>
<hr>
3. 通过OGNL表达式创建Map集合,并且遍历出集合中的值
<br>
<s:set name="map"
value="#{'1':'eeeee','2':'ddddd','3':'ccccc','4':'bbbbb','5':'aaaaa'}"></s:set>
<s:iterator value="#map" var="o">
${o.key}->${o.value}<br/>
<!-- <s:property value="#o.key"/>-><s:property value="#o.value"/><br/> -->
<!-- <s:property value="key" />-><s:property value="value" /> -->
</s:iterator>
<br/>
<hr>
4. 通过OGNL表达式,进行逻辑判断
<br>
<s:if test="'aaa' in {'aaa','bbb'}">
aaa 在 集合{'aaa','bbb'}中;
</s:if>
<s:else>
aaa 不在 集合{'aaa','bbb'}中;
</s:else> <br/> <s:if test="#request.req not in #list">
不 在 集合list中;
</s:if>
<s:else>
在 集合list中;
</s:else>
<br/>
<hr>
5. 通过OGNL表达式的投影功能进行数据筛选
<br>
<s:iterator value="#attr.listStudent.{?#this.id % 2 != 0}" var="cur">
<s:property value="#cur.username"/>
</s:iterator>
<br/>
<s:iterator value="#attr.listStudent.{^#this.id % 2 != 0}" var="cur">
<s:property value="#cur.username"/>
</s:iterator>
<br/>
<s:iterator value="#attr.listStudent.{$#this.id % 2 != 0}" var="cur">
<s:property value="#cur.username"/>
</s:iterator>
<br/>
<s:property value="#attr.listStudent.{username}[0]"/>
<br/>
<s:property value="#attr.listStudent.{$#this.id == 3}.{username}[0]"/>
<br/>
<hr>
6. 通过OGNL表达式访问某个类的静态方法和值
<br>
<s:property value="@java.lang.Math@floor(32.56)" />
<br/>
<hr>
7. OGNL表达式 迭代标签 详细
<br>
<s:set name="list2"
value="{'aa','bb','cc','dd','ee','ff','gg','hh','ii','jj'}"></s:set>
<table border="1">
<tr>
<td>
索引
</td>
<td>

</td>
<td>
奇?
</td>
<td>
偶?
</td>
<td>
首?
</td>
<td>
尾?
</td>
<td>
当前迭代数量
</td>
</tr>
<s:iterator value="#list2" var="o" status="s">
<tr bgcolor="<s:if test="#s.even">pink</s:if>">
<td>
<s:property value="#s.getIndex()" />
</td>
<td>
<s:property />
</td>
<td>
<s:if test="#s.odd">Y</s:if>
<s:else>N</s:else>
</td>
<td>
<s:if test="#s.even">Y</s:if>
<s:else>N</s:else>
</td>
<td>
<s:if test="#s.first">Y</s:if>
<s:else>N</s:else>
</td>
<td>
<s:if test="#s.isLast()">Y</s:if>
<s:else>N</s:else>
</td>
<td>
<s:property value="#s.getCount()"/>
</td>
</tr>
</s:iterator>
</table>
</body>
</html>

Student.java(只用到部分方法)

package com.clzhang.ssh.demo6;

import java.util.*;

public class Student {
private int id;
private String username;
private int grade;
private Date birthday; //只要是重写一个类的构造方法,就必须要为这个类保留空的构造方法
//因为框架默认的都会去调用无参的空的构造方法
public Student(){};
public Student(int id, String username, Date birthday) {
this.id = id;
this.username = username;
this.birthday = birthday;
}
public Student(String username,int grade){
this.username = username;
this.grade = grade;
} public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getGrade() {
return grade;
}
public void setGrade(int grade) {
this.grade = grade;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
} @Override
public String toString() {
//如果不重写它的toString()方法的话,默认调用toString()将输出【类型+@+内存地址的哈希值】
return "{学生姓名:" + username + ",成绩:" + grade + "}";
}
}

更多阅读参考:

struts2中的OGNL表达式(转)

struts2:遍历自定义字符串数组,遍历Action实例所引用对象中的数组

struts2:OGNL表达式,遍历List、Map集合;投影的使用的更多相关文章

  1. struts2 OGNL表达式

    一.OGNL OGNL是Object-Graph Navigation Language的缩写,全称为对象图导航语言,是一种功能强大的表达式语言,它通过简单一致的语法,可以任意存取对象的属性或者调用对 ...

  2. struts2 OGNL 表达式

    一.Struts 2支持以下几种表达式语言: OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言:JSTL(JSP Standard ...

  3. Struts2 OGNL表达式、ValueStack

    OGNL简介 OGNL,即Object-Graph Navigation Language,对象视图导航语言,是一种数据访问语言,比EL表达式更加强大: EL只能从11个内置对象中取值,且只能获取属性 ...

  4. struts2 ognl表达式访问值栈

    1:简单的说,值栈是对应每一个请求对象的轻量级的数据存储中心,在这里统一管理着数据,供Action.Result.Interceptor等Struts2的其他部分使用,这样数据被集中管理起来而不凌乱. ...

  5. 定义一个Map集合,key和value不规定类型,任意放入数据,用keySet()和 entrySet()两种方式遍历出Map集合的数据

    package com.lanxi.demo1_1_1; import java.util.HashMap; import java.util.Iterator; import java.util.M ...

  6. struts2视频学习笔记 28(OGNL表达式)

    课时28 OGNL表达式 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目. Struts 2框架使用OGNL作为默认的表达式语 ...

  7. 20160502-struts2入门--ognl表达式

    一.OGNL表达式语言 OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目. Struts 2框架使用OGNL作为默认的表达式语言 ...

  8. OGNL表达式语言网上转来的

    1.概念:OGNL是ObjectGraphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目. Struts 2框架使用OGNL作为默认的表达式语言. 2.功能: ...

  9. struts2简单入门-OGNL表达式

    什么是OGNL表达式 Object-Graph Navigation Language的缩写. 可以遍历整个对象结构图,实现对象类型转换等功能的表达式. OGNL实际上是个Map集合,有一个上下文根对 ...

  10. Struts2的标签库(二)——OGNL表达式

    Struts2的标签库(二) --OGNL表达式 1.Struts2中的OGNL表达式增加了ValueStack的支持. 注:ValueStack--实际上是一个容器对象,该对象在启动Struts2框 ...

随机推荐

  1. 093实战 Nginx日志切割,以及脚本上传nginx的切割日志

    一:日志切割步骤 命令都在root下进行 1.创建目录 mkdir -p /etc/opt/modules/bin ## 创建文件夹 2.上传cut 3.观察目录 4.修改的cut文件 5.检测 需要 ...

  2. DP-hdu1260

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1260 题目描述: 题目大意:每一个人去电影票买票,有两种买票方法:1.自己单人买:2.与前面的人一起买 ...

  3. 程序员之路:python3+PyQt5+pycharm桌面GUI开发(转)

    程序员之路:python3+PyQt5+pycharm桌面GUI开发 http://blog.sina.com.cn/s/blog_989218ad0102wz1k.html 先看效果: 图 1 没错 ...

  4. Angular 个人深究(四)【生命周期钩子】

    Angular 个人深究(四)[生命周期钩子] 定义: 每个组件都有一个被 Angular 管理的生命周期. Angular 创建它,渲染它,创建并渲染它的子组件,在它被绑定的属性发生变化时检查它,并 ...

  5. 算法进阶面试题06——实现LFU缓存算法、计算带括号的公式、介绍和实现跳表结构

    接着第四课的内容,主要讲LFU.表达式计算和跳表 第一题 上一题实现了LRU缓存算法,LFU也是一个著名的缓存算法 自行了解之后实现LFU中的set 和 get 要求:两个方法的时间复杂度都为O(1) ...

  6. RabbitMQ for CentOS安装教程

    一.下载并安装Erlang 下载地址:http://www.erlang.org/downloads otp_src_20.3.tar.gz ①解压otp_src_20.3.tar.gz ②安装各种驱 ...

  7. 在网站中使用Bing Translator插件翻译文章。

    前一阵子给项目增加了翻译的功能,用的是Bing Translator Widget,今天看见有个兄弟写自定义自己的博客,我就尝试着把这个插件加到了自己的博客中.还真的好用.大家先看下效果,觉得好的请继 ...

  8. [NOIP2017]逛公园 最短路+拓扑排序+dp

    题目描述 给出一张 $n$ 个点 $m$ 条边的有向图,边权为非负整数.求满足路径长度小于等于 $1$ 到 $n$ 最短路 $+k$ 的 $1$ 到 $n$ 的路径条数模 $p$ ,如果有无数条则输出 ...

  9. Python3Numpy——相关性协方差应用

    基本理论 Correlation Are there correlations between variables? Correlation measures the strength of the ...

  10. 1013 ACM 杭电 root

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1013 题意:求两个数的根 如: 12->3,99->9,80->8 注意题目没有限制数的 ...