【struts2】OGNL
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的更多相关文章
- 【Struts2】Ognl与ValueStack
一.OGNL 1.1 概述 1.2 OGNL 五大类功能 1.3 演示 二.ValueStack 2.1 概述 2.2 ValueStack结构 2.3 结论 2.3 一些问题 三.OGNL表达式常见 ...
- 【Java EE 学习 36】【struts2】【struts2系统验证】【struts2 ognl值栈】【struts2 ongl标签】【struts2 UI标签】【struts2模型驱动和令牌机制】
一.struts2系统验证 1.基于struts2系统验证的方式实际上就是通过配置xml文件的方式达到验证的目的. 2.实际上系统校验的方法和手工校验的方法在底层的基本实现是相同的.但是使用系统校验的 ...
- 【struts2】struts2中的流接收与流发送
[前言]在我们的struts2后端中,实现流的接收和发送.就能够实现向server传视频流以及下载图片. [流接收] 如今举一个传公钥的样例.struts2用一个action接收Key,而Key就是用 ...
- 【Struts2】Struts2纯手工安装、配置以及Helloworld,以最新版struts 2.3.20 GA做样例
很多网上的教程对Struts2的配置.安装弄得不明不白,非常多高手以为小白是什么都懂.很多细节上面的地方没有说明清楚,甚至还有在Maven上面解说的,要知道Struts2跟Maven没有半点的关系.全 ...
- 【Struts2】 国际化
一.概述 二.Struts2中国际化: 2.1 问题1 全局 局部 2.2 问题2 2.3 问题3 2.4 问题4 在Action中怎样使用 在JSP页面上怎样使用 一.概述 同一款软件 可以为不同用 ...
- 【Struts2】剖析Struts2中的反射技术 ValueStack(值栈)
1,Struts2框架主要组件的处理流程 在说ValueStack之前,笔者先说一说Struts2中常用的组件,struts2中常用组件有strutsPrepareAndExecuteExceptio ...
- 【struts2】值栈(后篇)
在值栈(前篇)我们学习了值栈的基本知识,接下来,来看看在程序中具体如何使用值栈. 1 ActionContext的基本使用 1.1 如何获取? 要获取ActionContext有两个基本的方法,如果在 ...
- 【struts2】值栈(前篇)
1 值栈是什么? 简单的说:值栈是对应每一个请求对象的轻量级的内存数据中心. Struts2中一个很激动人心的特性就是引入了值栈,在这里统一管理着数据,供Action.Result.Intercept ...
- 【struts2】名为dispatcher的ResultType
1)基本使用 名称为“dispatcher”的ResultType,在struts-default.xml里的配置如下: <result-type name="dispatcher&q ...
随机推荐
- java生成竖排文字图片
package com.kadang.designer.web.action;import java.awt.Color;import java.awt.Font;import java.awt.Fo ...
- 匿名管道读取CMD回显信息
之前用了很坑爹的做法去读取了cmd命令的回显信息,现在发现了用匿名管道的实现方法,由于楼主没有学过Windows核心编程,找了一个代码来凑数 存下来以后研究 #include <windows. ...
- Extjs4中RadioGroup的赋值与取值
1.定义rg var rg = new Ext.form.RadioGroup({ fieldLabel : "test", items : [{ boxLabel : '每天', ...
- python一个简单的登录
文件目录下有两个文件 user_name.txt lock_file.txt 实际中可以读数据库里的信息 代码如下 #encoding = utf-8 import sys user_file = ' ...
- 爬虫神器xpath的用法(三)
xpath的多线程爬虫 #encoding=utf-8 ''' pool = Pool(4) cpu的核数为4核 results = pool.map(爬取函数,网址列表) ''' from mult ...
- iOS开发中使用CocoaPods来管理第三方的依赖程序
之前也碰到类似的问题,怎样去管理这些第三方的文件,虽然手动添加也不算麻烦. 写这篇文章主要参考了唐巧的博文,链接如下: http://blog.devtang.com/blog/2012/12/02/ ...
- Clojure上手
Clojure,这是什么鬼?一门基于JVM(现在也有基于.NET CLR的了:Clojure CLR) 的函数式编程语言.在JVM平台运行的时候,会被编译为JVM的字节码进行运算..为什么要学它?其设 ...
- Windows技巧 - 右键菜单【在此处打开bash】
实现效果如下图: 步骤如下:按住shift,在文件夹空白处(桌面也可以)鼠标右键,即可看到 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROO ...
- CSS计数器的趣味时光
CSS计数器是“啊太好了,竟不知道CSS可以做这啊”这类非常有趣的众多特性之一.简言之,用CSS使你持续某增加某个量,而无需JavaScript. 简单计数器 我们从这个简单的分页示例开始: 你见到的 ...
- Oracle Essbase入门系列(三)
数据库计算 Essbase中单元格的数据可以是外部输入或计算而得,单元格因而分为输入单元格和计算单元格.计算单元格的计算方法可以通过大纲中维度成员的合并计算符和公式脚本定义,此称为大纲计算定义. 例1 ...