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 ...
随机推荐
- ASP.Net MVC3 - The easier to run Unit Tests by moq #Reprinted#
From: http://www.cnblogs.com/techborther/archive/2012/01/10/2317998.html 前几天调查完了unity.现在给我的任务是让我调查Mo ...
- IOS 特定于设备的开发:UIDevice
UIDevice类展示了一些关键的特定于设备的属性,包括使用的iPhone ,Ipad或iPod Touch型号.设备名称.以及OS名称和版本. 他是一种一站式解决方案,用于提取出某些系统详细信息.每 ...
- Lotus Sametime
编辑 Lotus Sametime属于IBM旗下的Lotus软件,包括一个成熟的协作平台提供商. 外文名 Lotus Sametime 属 于 IBM旗下的Lotus软件 包 括 一个成熟 ...
- C++访问权限的问题
以前一直认为对于类中的private数据成员,只有调用该方法的对象才能更能访问自身的私有成员,其他的类在该成员函数(公共接口)中也无法调用自身的私有成员,今天看到<c++ prime plus& ...
- java项目组会议纪要
上周五项目经理开例会让我记录会议纪要,以下是我记录的纪要.给大家分享一下! 一.时间:2014年04月25日 二.地点:研发部 三.人物:xx,xx,xx 四.内容(相关项目的一些事项): 1.对待需 ...
- 介绍一个python的新的web framework——karloop框架
karloop是一款轻型的web framework,和tornado.webpy类似.mvc分层设计,眼下已经公布早期版本号了,使用方便, 下载地址例如以下:https://github.com/k ...
- js超简单日历
用原生js写了一个超级简单的日历.当做是练习js中的Date类型. 思路: 获取某个日期,根据年份计算出每个月的天数. 利用Date中的getDay()知道该月份的第一天为星期几. 循环创建表格,显示 ...
- asp.net传值
asp.net页面传至几种方法 Response.Redirect (或称 Query String 方式.URL方式) Response.Redirect("WebForm5.aspx&q ...
- 获取图片中的文本--MODI
http://www.aspsnippets.com/Articles/Read-Extract-Text-from-Image-OCR-in-ASPNet-using-C-and-VBNet.asp ...
- Android中的一些基础知识(三)
最近在回顾Android的基础知识,就把一些常见的知识点整理一下,以后忘了也可以翻出来看一看. 在TextView中显示图像(使用< img>标签) 在TextView中显示图片的方法有许 ...