1 OGNL概述

  OGNL是对象图导航语言Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言(Expression Language,简称为EL),通过它简单一致的表达式语法,可以存取对象的属性,调用对象的方法,遍历整个对象的结构图,实现字段类型转化等功能。它使用相同的表达式去存取对象的属性。在前面的例子中,登录页面输入框的name用到的名字就是OGNL的表达式,比如:“账号:<input type="text" name="account">”,在欢迎页面使用“<s:property value="account"/>”。两个"account"表达式都是相同的,但前一个保存对象属性的值,后一个是取得对象属性的值。表达式语言简单、易懂却又功能强大。

  2 OGNL的基本使用

  2.1 常量与操作符

  在OGNL中,可以使用Java的常量操作和数学运算。需要注意的是,String常量可以使用单引号或者双引号括起来,但是单个字符也是使用单引号,所以只有在超过一个字符的时候,使用单引号界定的常量才是String类型的。如果需要只定义一个包含单个字符的String常量,就需要使用转义。比如:<s:property value="'account'"/>这句话里面的account就是个字符串,因为它是用单引号括起来的。或者<s:property value="7+8"/>这句话,输出就是15,也就是数学运算后的值。

  2.2 方法调用

  OGNL支持方法的调用,这个在后面有演示,比如访问静态方法,访问集合对象的方法等。

  2.3 设置数值及表达式列表

  OGNL让你可以在单条语句中执行逗号分隔的多个表达式,最后一个表达式的返回值作为整条语句的输出。

  2.4 使用OGNL访问ValueStack

  在OGNL中,没有前缀代表了访问当前值栈。比如前面的示例中,在欢迎页面中使用的“<s:property value="account"/>”,这句话中<s:property>标签的value属性的值就是使用的ognl,它没有任何前缀,就表示直接访问值栈。访问到值栈过后,会按照从栈顶到栈底的顺序,寻找第一个匹配的对象,那就会找到Action中的account属性,然后就取到值了。

  2.5 使用OGNL访问ActionContext

  在ognl中,可以通过符号“#”来访问ActionContext中除了值栈之外的各种值,典型如:

  • #parameters:当前请求中的参数,对应request.getParameter(name)
  • #request:请求作用域中的属性,对应request.getAttribute(name)
  • #session:会话作用域中的属性,对应session.getAttribute(name)
  • #application:应用程序作用域的属性
  • #attr:按照页面page、请求request、会话session和应用application的顺序,返回第一个符合条件的属性。

  在引用的时候,需要加上前缀“#”,并指定范围,然后写出要引用哪个属性,形如:“#paramters.account”。

  2.6 应用示例  

  这里我们在登陆的例子上稍加修改,来试验一下这些知识。

  (1)修改action,然后设置Session和Application的属性值,示例如下:

public class HelloWorldAction extends ActionSupport {
private String account;
private String password;
private String submitFlag;
public String execute() throws Exception {
this.businessExecute();
ActionContext c = ActionContext.getContext();
c.getSession().put("account", "session中的account");
c.getApplication().put("account", "application中的account"); return "toWelcome";
}
/**
* 示例方法,表示可以执行业务逻辑处理的方法,
*/
public void businessExecute(){
System.out.println("用户输入的参数为==="+"account="+account+",password="+password+",submitFlag="+submitFlag);
}
//属性对应的getter/setter方法,省略了
}

  (2)修改欢迎页面,在页面上通过OGNL来获取这些值,示例如下:

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<%@ taglib prefix="s" uri="/struts-tags"%>
欢迎账号为<s:property value="account"/>的朋友来访 <br>
请求参数中的帐号:<s:property value="#parameters.account"/>
<br>
<%request.setAttribute("account","request的account");%>
请求属性中的帐号:<s:property value="#request.account"/>
<br>
会话属性中的帐号:<s:property value="#session.account"/>
<br>
应用属性中的帐号:<s:property value="#application.account"/>
<br>
attr中的帐号:<s:property value="#attr.account"/>
</body>
</html>

  (3)再次运行测试一下,欢迎页面如下图所示:

  备注:在ognl中还有另一种稍稍麻烦的写法来访问属性,形如“#request[‘account’]”,等价于使用“#request.account”,在访问更复杂对象的时候,两种方法可以混用。一般建议:如果访问对象的属性,建议使用“.”的方式来访问;如果访问Map等复杂对象结构的时候,建议使用“[]”的方式来访问。

  3 访问静态方法和静态属性

  在OGNL中,可以通过关键字“@”来访问任意类中的静态方法和静态属性,格式为“@类的全路径名@属性名称”,或者“@类的全路径名@方法名称(参数列表)”。这里要注意一点,在低版本的Struts2中,默认是开启了访问类的静态方法的,但是在高版本的Struts2中,比如写作本书使用的2.1.8的版本,默认是关闭了访问类的静态方法的。也就是说,要想访问类的静态方法,需要去开启设置。配置非常简单,在struts.xml中,添加开启访问类的静态方法的配置,示例如下:

<constant name="struts.ognl.allowStaticMethodAccess" value="true"/>  

  (1)写一个类,里面有一个静态方法和一个静态属性供外界访问,示例如下:

package cn.javass.hello.struts2impl.action;

public class MyStatic {
public static String staticTest = "staticTestValue"; // 静态属性 //静态方法
public static void testMethod() {
System.out.println("+++++++++++++++++++static test method.++++++++++++++++++");
}
}

  (2)在欢迎页面中添加访问它们的语句,示例如下:

<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
<%@ taglib prefix="s" uri="/struts-tags"%>
欢迎账号为<s:property value="account"/>的朋友来访 <br>
静态属性值为:<s:property value="@cn.javass.hello.struts2impl.action.MyStatic@staticTest"/>
<br>
调用静态方法
<s:property value="@cn.javass.hello.struts2impl.action.MyStatic@testMethod()"/>
</body>
</html>

  (3)去测试运行一下,此时欢迎页面如下图所示:

  另外,后台输出信息如下:

+++++++++++++++++++static test method.++++++++++++++++++

【struts2】OGNL的更多相关文章

  1. 【Struts2】Ognl与ValueStack

    一.OGNL 1.1 概述 1.2 OGNL 五大类功能 1.3 演示 二.ValueStack 2.1 概述 2.2 ValueStack结构 2.3 结论 2.3 一些问题 三.OGNL表达式常见 ...

  2. 【Java EE 学习 36】【struts2】【struts2系统验证】【struts2 ognl值栈】【struts2 ongl标签】【struts2 UI标签】【struts2模型驱动和令牌机制】

    一.struts2系统验证 1.基于struts2系统验证的方式实际上就是通过配置xml文件的方式达到验证的目的. 2.实际上系统校验的方法和手工校验的方法在底层的基本实现是相同的.但是使用系统校验的 ...

  3. 【struts2】struts2中的流接收与流发送

    [前言]在我们的struts2后端中,实现流的接收和发送.就能够实现向server传视频流以及下载图片. [流接收] 如今举一个传公钥的样例.struts2用一个action接收Key,而Key就是用 ...

  4. 【Struts2】Struts2纯手工安装、配置以及Helloworld,以最新版struts 2.3.20 GA做样例

    很多网上的教程对Struts2的配置.安装弄得不明不白,非常多高手以为小白是什么都懂.很多细节上面的地方没有说明清楚,甚至还有在Maven上面解说的,要知道Struts2跟Maven没有半点的关系.全 ...

  5. 【Struts2】 国际化

    一.概述 二.Struts2中国际化: 2.1 问题1 全局 局部 2.2 问题2 2.3 问题3 2.4 问题4 在Action中怎样使用 在JSP页面上怎样使用 一.概述 同一款软件 可以为不同用 ...

  6. 【Struts2】剖析Struts2中的反射技术 ValueStack(值栈)

    1,Struts2框架主要组件的处理流程 在说ValueStack之前,笔者先说一说Struts2中常用的组件,struts2中常用组件有strutsPrepareAndExecuteExceptio ...

  7. 【struts2】值栈(后篇)

    在值栈(前篇)我们学习了值栈的基本知识,接下来,来看看在程序中具体如何使用值栈. 1 ActionContext的基本使用 1.1 如何获取? 要获取ActionContext有两个基本的方法,如果在 ...

  8. 【struts2】值栈(前篇)

    1 值栈是什么? 简单的说:值栈是对应每一个请求对象的轻量级的内存数据中心. Struts2中一个很激动人心的特性就是引入了值栈,在这里统一管理着数据,供Action.Result.Intercept ...

  9. 【struts2】名为dispatcher的ResultType

    1)基本使用 名称为“dispatcher”的ResultType,在struts-default.xml里的配置如下: <result-type name="dispatcher&q ...

随机推荐

  1. javaweb学习总结(二十五)——jsp简单标签开发(一)

    一.简单标签(SimpleTag) 由于传统标签使用三个标签接口来完成不同的功能,显得过于繁琐,不利于标签技术的推广, SUN公司为降低标签技术的学习难度,在JSP 2.0中定义了一个更为简单.便于编 ...

  2. 转:最简单的基于 DirectShow 的视频播放器

    50行代码实现的一个最简单的基于 DirectShow 的视频播放器 本文介绍一个最简单的基于 DirectShow 的视频播放器.该播放器对于初学者来说是十分有用的,它包含了使用 DirectSho ...

  3. ZookeeperNet太难用,写了个RetryHelper来进行配套使用

    普通的zk用法,如下写法: zk.Exists("/aaa", true); zk.Create(...); 但是由于这些API会抛Zookeeper的Exception,比如Co ...

  4. 如何利用OCS缓存TomcatSession全局变量(转)

    转: 首先非常感谢阿里云给我们提供了一个如此省事的平台. 我们公司是一家物流公司,主要提供运输和仓储的服务.我们现在正在把我们的系统往阿里云迁移.当然,还在迁移过程中,所以还有很多是没办法现在说得太清 ...

  5. Andriod调用http请求

    // 新建HttpPost对象 HttpPost httpPost = new HttpPost( "http://180.153.1.1:8080/mybankGateway/gatewa ...

  6. Codeforces Round #379 (Div. 2) A. Anton and Danik 水题

    A. Anton and Danik 题目连接: http://codeforces.com/contest/734/problem/A Description Anton likes to play ...

  7. Road to the future——伪MVVM库Q.js

    模仿Vuejs的伪MVVM库,下面是使用说明 项目地址:https://github.com/miniflycn/Q.js 相关项目:https://github.com/miniflycn/Ques ...

  8. ab 测试模块高并发

    转载:http://gekie.iteye.com/blog/1704235 作为程序员,写好一个模块后,不知道这个模块在高并发的情况下能不能平稳过渡,这里所说的平稳过渡是指,在高并发的情况下还能正常 ...

  9. BW:如何加载和生成自定义的层次结构,在不使用平面文件的SAP业务信息仓库

    介绍 通常情况下,报告需要在一个类似树的结构来显示数据.通过启用此特性在SAP BW层次结构.高级数据显示的层次结构的顶层节点.更详细的数据可以向下钻取到的层次结构中的下级节点的可视化. 考虑一个例子 ...

  10. 关于移动App的五个提问

    1.你的移动App利用了手机的哪些特性? 2.你们是否有用移动的角度和思维来考虑产品形态?还是简单的把Web照搬到手机上? 3.用户有什么特殊的动力去安装你们的App? 4.用户是否能很好的上手和使用 ...