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. mybatis配置方法

    首先导入mybatis-3.1.1.jar包以及Mysql-connector-java-5.1.6-bin.jar包 新建一个数据库 create database mybatis; use myb ...

  2. kinect for windows - SkeletonBasics-D2D详解之二

    首先看骨骼追踪例子代码的结构:

  3. SharePoint需要开启的网站集功能

    1. 管理网站功能 2. 网站集功能

  4. javascript基础、语法

    JavaScript基础(简介.语法) 一.JavaScript简介 1.JavaScript是个什么东西? 它是个脚本语言,需要有宿主文件,它的宿主文件是HTML文件. 2.它与Java什么关系? ...

  5. (转)内核线程对象--Event事件对象

    在所有的内核对象中,事件内核对象是个最基本的对象.事件能够通知一个操作已经完成. 客户机和一个服务器,它们之间需要互相进行通信例子(vs2008 ) 事件内核对象的组成 一个使用计数(与所有内核对象一 ...

  6. BZOJ 1782: [Usaco2010 Feb]slowdown 慢慢游( BIT + dfs )

    orz...hzwer 对着大神的 code 看 , 稍微理解了. 考虑一只牛到达 , 那它所在子树全部 +1 , 可以用BIT维护 --------------------------------- ...

  7. Oracle 如何写出高效的 SQL

    转自:Oracle 如何写出高效的 SQL 要想写出高效的SQL 语句需要掌握一些基本原则,如果你违反了这些原则,一般情况下SQL 的性能将会很差. 1. 减少数据库访问次数连接数据库是非常耗时的,虽 ...

  8. JDBC----数据库连接池(connection pool)

    •数据库连接池的基本思想就是为数据库连接建立一个"缓冲池".预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从"缓冲池"中取出一个,使用完毕之后再 ...

  9. 高质量程序设计指南C/C++语言——C++/C编译预处理

    C++/C的编译预处理器对预编译伪指令进行处理后生成中间文件作为编译器的输入,因此所有的预编译伪指令都不会进入编译阶段.预编译伪指令一般都以#打头,且其前面只能出现空白字符.预编译伪指令不是C++/C ...

  10. 在word中批量制作条形码

    条码打印软件可以批量生成条形码然后直接打印,但是有些客户不需要直接打印,而是想将生成的条形码在word中进行排版,发给自己的客户或者下属部门来打印.那么如何实现在word中批量制作条形码呢? 操作很简 ...