Struts 2 OGNL
1.什么是OGNL?
2.Struts 2 OGNL 表达式
====================== 华丽丽的分割线 ======================
1.什么是OGNL?
1.0. OGNL简介:
OGNL(Object Graphic Navigation Language)对象导航语言,OGNL是一种功能强大的EL(Expression Language,表达式语言),可以通过简单的表达式来访问Java对象中的属性,而不是直接调用对象的获取和设置方法。这可以提供许多应用,比如:在XML文件中嵌入OGNL表达式语法,在JSP页面使用OGNL表达式语法,都将使界面更简洁。配合Struts标签(部分好用的标签)也使得实现某些功能(如:迭代)更容易。
1.1. OGNL基本思路:
OGNL表达式表达式的基础单元称为链(导航链),OGNL表达式基于OGNL上下文(Context,理解成环境)中的当前对象,一个链将使用上一个链的处理结果,开发者可以任意扩展该链的长度。
如:person.name.toString()
该表达式将按照如下步骤求值。
第一步,获取保存在OGNL Context中根对象(root对象)的person对象。
第二步,获取该对象的name属性。
第三步,将调用获取对象的属性的toString()方法.
(其实,这从表面看起来和java的调用方式没什么差别,只是多了OGNL Context用于保存各种数据)
1.2. OGNL优缺点:
优点:使用方便,功能丰富,可以实现EL,JSTL较难以实现的功能。
缺点:OGNL是Struts支持,并非SUN(被甲骨文收购 - -!#)自带,这就造成一个问题,移植性不好。另一个缺点,学多了容易和别的打乱。
====================== 华丽丽的分割线 ======================
2.Struts 2 OGNL 表达式
2.1. 演示OGNL的各种用法:
第一步,配置xml文件:struts.xml struts.ognl.allowStaticMethodAccess:设置其值为true,以便访问静态方法。
<package name="ognl" namespace="/" extends="struts-default">
<action name="ognl" class="cn.hasone.test.ognl.OgnlTest">
<result>/ognl.jsp</result>
</action>
</package>
详情查看:http://www.cnblogs.com/loveis/articles/2005034.html
第二步,编写Action:OgnlTest.java


第三步,编写Domain(Bean): User.java


第四步,编写JSP文件: ognl.jsp

<%@ taglib uri="/struts-tags" prefix="s"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
访问action中的普通属性:username = <s:property value="username"/></br>
访问action中的普通属性:password = <s:property value="password"/></br>
访问action中的Domain属性:user.name = <s:property value="user.name"/></br>
</br>
使用索引访问:<s:property value="[0].username"/></br>
</br>
访问值栈中的普通方法:user.getClass() = <s:property value="user.getClass()"/></br>
访问值栈中的普通方法:username.length() = <s:property value="username.length()"/></br>
访问action中的普通方法:normalMethod() = <s:property value="normalMethod()"/></br>
</br>
访问action中的静态方法:staticMethod() = <s:property value="staticMethod()"/></br>
<!-- 访问静态方法也可写成如下:
访问action中的静态方法:staticMethod() = <s:property value="@cn.hasone.test.ognl.OgnlTest@staticMethod()"/></br>
-->
访问JAR包中的静态方法:staticMethod() = <s:property value="@@max(2,3)"/></br>
<!-- 静态属性也可以,类同,略... -->
</br>
访问action中的List:<s:property value="userList"/></br>
访问action中的List某个元素:<s:property value="userList[1]"/></br>
访问action中的List元素的属性集合:<s:property value="userList.{name}"/></br>
访问action中的List特定元素的属性:<s:property value="userList[0].name"/></br>
</br>
<!-- 其他集合也类同,略,如:
<s:property value="userMap.keys"/>
<s:property value="userMap.map1"/>
注意:Set,Map无序,不能用下标方法取...
-->
<s:debug></s:debug>
</body>
</html>

2.2. 对上述代码补充说明:
注意一:#符号的用途一般有三种:
第一,访问非根对象属性,例如示例中的#session.msg表达式,由于Struts 2中值栈被视为根对象,所以访问其他非根对象时,需要加#前缀。实际上,#相当于ActionContext. getContext();#session.msg表达式相当于ActionContext.getContext().getSession(). getAttribute("msg") 。
第二,用于过滤集合,如示例中的persons.{?#this.age>20}。
第三,用来构造Map,例如示例中的#{'foo1':'bar1', 'foo2':'bar2'}。
注意二:Struts 2允许在值栈中使用索引使用索引,并不是直接获得指定的元素,而是从指定的索引位置开始取属性值,若找不到则从索引号的下一位开始,直到有结果。
2.3. 投影(过滤)
{?#条件} // 满足这个条件的集合
如:users.{?#this.age==1}[0]
{^#条件} // 满足该条件的集合的第一个
{$#条件} // 满足该条件的集合的最后一个
Struts 2 OGNL的更多相关文章
- struts基于ognl的自动类型转换需要注意的地方
好吧,坎坷的过程我就不说了,直接上结论: 在struts2中使用基于ognl的自动类型转换时,Action中的对象属性必须同时添加get/set方法. 例如: 客户端表单: <s:form ac ...
- struts的ognl.NoConversionPossible错误
JSP页面便利集合的时候,代码如下 <s:iterator value="storageList" id="stList" status="st ...
- struts与ognl结合【重要】
-----------------------------ognl表达式------------------------ OGNL:对象视图导航语言. ${user.addr.name} 这种写法就 ...
- java框架篇---struts之OGNL详解
OGNL(Object Graph Navigation Language),是一种表达式语言.使用这种表达式语言,你可以通过某种表达式语法,存取Java对象树中的任意属性.调用Java对象树的方法. ...
- 关于struts中Ognl和iterator配合再次理解
Person.jsp (struts.xml中省略) package com.mzy.entity; public class Person { private String name; privat ...
- struts(三) ---OGNL的学习和理解
OGNL:Object graphic Navgation Language(对象图形的导航语言)
- 在Apache Struts中利用OGNL注入
前言 本文简要介绍了Apache Struts的OGNL注入缺陷,文章中介绍使用简单的应用程序复现OGNL注入.深入研究针对公共漏洞,并理解这类漏洞. 内容 安装Apache Tomcat服务器(入门 ...
- Struts2的整体回顾(Action, 拦截器, 值栈, OGNL表示式, ModelDriven)
ValueStack里有map(request, session, attr, parameters)和对象栈. Map调用的方法: ActionContext.getContext().put(k, ...
- Struts-ValueStack和OGNL总结
(1)ValueStack是一个借口,在Struts2中使用OGNL表达式实际上是使用实现了ValueStack接口类的OgnlValueStack,它是ValueStack的默认实现类. (2)Va ...
随机推荐
- 前端笔试题2 JS部分
笔试题2 var EventME = {}; EventME.addHandle = function(ele, eventName, handleFunction) { if (ele.addEve ...
- 批量 GBK 转 UTF8 java
package encoding; import java.io.File; import java.io.IOException; import java.util.Collection; impo ...
- 自定义Chrome 背景色 (FF需要User Styles插件)
Chrome有个自定义背景色的文件 Custom.css 默认里面什么字都没写 html, body {background-color: #e0dcc0!important;} 这个颜色 ...
- Delphi 的动态数组
传统的Pascal 语言其数组大小是预先确定的,当你用数组结构声明数据类型时,你必须指定数组元素的个数.专业程序员也许知道些许动态数组的实现技术,一般是采用指针,用手工分配并释放所需的内存. Delp ...
- perl5 第六章 模式匹配
第六章 模式匹配 by flamephoenix 一.简介二.匹配操作符三.模式中的特殊字符 1.字符+ 2.字符 []和[^] 3.字符 *和? 4.转义字符 5.匹配任意字母或数字 6 ...
- Windows Azure 网站 (WAWS) 中的服务器端包含 (SSI)
编辑人员注释:本文章由 Windows Azure 网站团队的项目经理Erez Benari 撰写. Windows Azure 网站客户普遍关心的一个问题是关于我们对服务器端包含(Server ...
- Sicily-1443
一. 题意: 模拟队列的操作,按优先级pop.如果有元素pop,则其他在队列里面的元素的时间都要加1.如果队头的元素因为优先级不够高而要push回队列的时候,所有元素的时间都不用改变. 二. ...
- WeasyPrint - Converts HTML + CSS to PDF - WeasyPrint converts HTML/CSS documents to PDF
WeasyPrint - Converts HTML + CSS to PDF - WeasyPrint converts HTML/CSS documents to PDF WeasyPrint c ...
- Java设计模式模式观测(Observer Pattern)
Observer Pattern 设计模式通常用于.这是一个事件侦听器模型. 该模型有两个作用,一个是Subject, 有一个Observer.Subject 保存多个Observer参考,一旦一个特 ...
- adb shell top
PID:进程在系统中的ID CPU% - 当前瞬时所以使用CPU占用率 #THR - 程序当前所用的线程数 UID - 运行当前进程的用户id Name - 程序名称android.process.m ...