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,以便访问静态方法。

<constant name="struts.ognl.allowStaticMethodAccess" value="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

<%@ page language="java" import="java.util.*,java.net.URLDecoder" pageEncoding="UTF-8"%>
<%@ 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的更多相关文章

  1. struts基于ognl的自动类型转换需要注意的地方

    好吧,坎坷的过程我就不说了,直接上结论: 在struts2中使用基于ognl的自动类型转换时,Action中的对象属性必须同时添加get/set方法. 例如: 客户端表单: <s:form ac ...

  2. struts的ognl.NoConversionPossible错误

    JSP页面便利集合的时候,代码如下 <s:iterator value="storageList" id="stList" status="st ...

  3. struts与ognl结合【重要】

    -----------------------------ognl表达式------------------------ OGNL:对象视图导航语言.  ${user.addr.name} 这种写法就 ...

  4. java框架篇---struts之OGNL详解

    OGNL(Object Graph Navigation Language),是一种表达式语言.使用这种表达式语言,你可以通过某种表达式语法,存取Java对象树中的任意属性.调用Java对象树的方法. ...

  5. 关于struts中Ognl和iterator配合再次理解

    Person.jsp (struts.xml中省略) package com.mzy.entity; public class Person { private String name; privat ...

  6. struts(三) ---OGNL的学习和理解

    OGNL:Object graphic Navgation Language(对象图形的导航语言)

  7. 在Apache Struts中利用OGNL注入

    前言 本文简要介绍了Apache Struts的OGNL注入缺陷,文章中介绍使用简单的应用程序复现OGNL注入.深入研究针对公共漏洞,并理解这类漏洞. 内容 安装Apache Tomcat服务器(入门 ...

  8. Struts2的整体回顾(Action, 拦截器, 值栈, OGNL表示式, ModelDriven)

    ValueStack里有map(request, session, attr, parameters)和对象栈. Map调用的方法: ActionContext.getContext().put(k, ...

  9. Struts-ValueStack和OGNL总结

    (1)ValueStack是一个借口,在Struts2中使用OGNL表达式实际上是使用实现了ValueStack接口类的OgnlValueStack,它是ValueStack的默认实现类. (2)Va ...

随机推荐

  1. 磁盘IO子系统学习资料

    1.http://www.ibm.com/developerworks/cn/linux/l-cn-read/    (IBM read系统调用剖析) 2.http://lenky.info/arch ...

  2. STL deque详解

    英文原文:http://www.codeproject.com/Articles/5425/An-In-Depth-Study-of-the-STL-Deque-Container 绪言 这篇文章深入 ...

  3. Windows Azure 社区新闻综述(#74 版)

    欢迎查看最新版本的每周综述,其中包含有关云计算和 Windows Azure 的社区推动新闻.内容和对话.以下是本周的亮点. 文章.视频和博客文章 ·   Azure CDN:吸取的宝贵经验(10 月 ...

  4. 使用libcurl POST数据和上传文件

    为了具有通用性,将文件的内容读到了fc变量中,fclen是fc的长度.fc也可以是任何其它内容.curl 是 libcurl句柄.演示省略了很多显而易见的步骤.   1. 普通的post请求,这里用c ...

  5. Android 4.4及以上系统下应用的状态栏颜色渐变效果的实现

    上一篇转载的博文里讲到了怎么开启状态栏透明的效果,不过如果在有ActionBar的情况下,会出现状态栏透明而ActionBar横亘在状态栏和内容之间的丑陋情况,如下图: 通过百度之后,发现了GitHu ...

  6. .net c# 提交包含文件file 的form表单 获得文件的Stream流

    1.前台html代码 要写一个有id的form,可是不能有runat="server"属性.由于一个页面中,有这个属性的form表单仅仅能有一个. 再要有一个有name的ifram ...

  7. 一些常用的Intent及intent-filter的信息

    Uri Action 功能 备注 geo:latitude,longitude Intent.ACTION_VIEW 打开地图应用程序并显示指定的经纬度   geo:0,0?q=street+addr ...

  8. 关于python 模块导入

    如何将自己写的库加入到python的库路径中: 首先查看python包含的库路径,步骤如下: a.打开python命令界面 b.import  sys    c.sys.path 1.在python安 ...

  9. authorization 元素(ASP.NET 设置架构)

    authorization 元素(ASP.NET 设置架构) 其他版本 1(共 1)对本文的评价是有帮助 - 评价此主题 [本文档仅供预览,在以后的发行版中可能会发生更改.包含的空白主题用作占位符.] ...

  10. 关于hibernate子查询参数的问题

    private Map<String, Object> createWblHqlContext(boolean needGroup, String startDate, String en ...