OGNL(Object Graph Navigation Language),是一种表达式语言。使用这种表达式语言,你可以通过某种表达式语法,存取Java对象树中的任意属性、调用Java对象树的方法、同时能够自动实现必要的类型转化。如果我们把表达式看做是一个带有语义的字符串,那么OGNL无疑成为了这个语义字符串与Java对象之间沟通的桥梁。既然OGNL那么强大,那么让我们一起来研究一下他的API,看看如何使用OGNL.

OGNL的API看起来就是两个简单的静态方法:

public static Object getValue( Object tree, Map context, Object root ) throws OgnlException;

public static void setValue( Object tree, Map context, Object root, Object value ) throws OgnlException

1.OGNL表达式的计算是围绕OGNL上下文进行的。

OGNL上下文实际上就是一个Map对象,由ognl.OgnlContext类表示。它里面可以存放很多个JavaBean对象。它有一个上下文根对象。

上下文中的根对象可以直接使用名来访问或直接使用它的属性名访问它的属性值。否则要加前缀“#key”。

2.Struts2的标签库都是使用OGNL表达式来访问ActionContext中的对象数据的。如:。

3.Struts2将ActionContext设置为OGNL上下文,并将值栈作为OGNL的根对象放置到ActionContext中。

4.值栈(ValueStack) :

可以在值栈中放入、删除、查询对象。访问值栈中的对象不用“#”。

Struts2总是把当前Action实例放置在栈顶。所以在OGNL中引用Action中的属性也可以省略“#”。

5.调用ActionContext的put(key,value)放入的数据,需要使用#访问。

OGNL中重要的3个符号:#、%、$:

“#”主要有三种用途:

访问OGNL上下文和Action上下文,#相当于ActionContext.getContext();下表有几个ActionContext中有用的属性:

名称

作用

例子

parameters

包含当前HTTP

请求参数的Map

#parameters.id[0]

作用相当于

request.getParameter("id")

request

包含当前

HttpServletRequest

的属性

(attribute)的Map

#request.userName相当于

request.getAttribute("userName")

session

包含当前

HttpSession的

属性(attribute)

的Map

#session.userName相当于

session.getAttribute("userName")

application

包含当前应用的

ServletContext

的属性(attribute)

的Map

#application.userName相当于

application.getAttribute("userName")

attr

用于按request >

session > application

顺序访问其属性

(attribute)

#attr.userName相当于

按顺序在以上三个范围(scope)

内读取userName属性,直到找到为止

用于过滤和投影(projecting)集合,如books.{?#this.price<100};

构造Map,如#{'foo1':'bar1', 'foo2':'bar2'}。

"%“符号

%符号的用途是在标志的属性为字符串类型时,计算OGNL表达式的值,这个类似js中的eval,很暴力。

"$"符号

$符号主要有两个方面的用途。

—    在国际化资源文件中,引用OGNL表达式,例如国际化资源文件中的代码:reg.agerange=国际化资源信息:年龄必须在${min}同${max}之间。

—    在Struts 2框架的配置文件中引用OGNL表达式,例如:

ListPhotos.action?albumId=${albumId}

下面代码实例对OGNL有更深的了解:

Cat.java

packagecom.oumyye.struts2.ognl;public classCat {privateDog friend;publicDog getFriend() {returnfriend;

}public voidsetFriend(Dog friend) {this.friend =friend;

}publicString miaomiao() {return "miaomiao";

}

}

Dog.java

packagecom.oumyye.struts2.ognl;public classDog {privateString name;publicDog() {

}publicDog(String name) {super();this.name =name;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}

@OverridepublicString toString() {return "dog: " +name;

}

}

User.java

packagecom.oumyye.struts2.ognl;public classUser {private int age = 8;publicUser() {

}public User(intage) {super();this.age =age;

}public intgetAge() {returnage;

}public void setAge(intage) {this.age =age;

}

@OverridepublicString toString() {return "user" +age;

}

}

OgnlAction.java

packagecom.oumyye.struts2.ognl;importjava.util.ArrayList;importjava.util.HashMap;importjava.util.HashSet;importjava.util.List;importjava.util.Map;importjava.util.Set;importcom.opensymphony.xwork2.ActionSupport;public class OgnlAction extendsActionSupport {privateCat cat;private Map dogMap = new HashMap();private Set dogs = new HashSet();privateString password;privateUser user;privateString username;private List users = new ArrayList();publicOgnlAction() {

users.add(new User(1));

users.add(new User(2));

users.add(new User(3));

dogs.add(new Dog("dog1"));

dogs.add(new Dog("dog2"));

dogs.add(new Dog("dog3"));

dogMap.put("dog100", new Dog("dog100"));

dogMap.put("dog101", new Dog("dog101"));

dogMap.put("dog102", new Dog("dog102"));

}publicString execute() {returnSUCCESS;

}publicCat getCat() {returncat;

}public MapgetDogMap() {returndogMap;

}public SetgetDogs() {returndogs;

}publicString getPassword() {returnpassword;

}publicUser getUser() {returnuser;

}publicString getUsername() {returnusername;

}public ListgetUsers() {returnusers;

}publicString m() {return "hello";

}public voidsetCat(Cat cat) {this.cat =cat;

}public void setDogMap(MapdogMap) {this.dogMap =dogMap;

}public void setDogs(Setdogs) {this.dogs =dogs;

}public voidsetPassword(String password) {this.password =password;

}public voidsetUser(User user) {this.user =user;

}public voidsetUsername(String username) {this.username =username;

}public void setUsers(Listusers) {this.users =users;

}

}

ognl.jsp

OGNL表达式语言学习

  1. 访问值栈中的action的普通属性: username =
  2. 访问值栈中对象的普通属性(get set方法): | | | wrong: --%>
  3. 访问值栈中对象的普通属性(get set方法):
  4. 访问值栈中对象的普通方法:
  5. 访问值栈中对象的普通方法:
  6. 访问值栈中action的普通方法:

  7. 访问静态方法:
  8. 访问静态属性:
  9. 访问Math类的静态方法:

  10. 访问普通类的构造方法:

  11. 访问List:
  12. 访问List中某个元素:
  13. 访问List中元素某个属性的集合:
  14. 访问List中元素某个属性的集合中的特定值: |
  15. 访问Set:
  16. 访问Set中某个元素:
  17. 访问Map:
  18. 访问Map中某个元素: | |
  19. 访问Map中所有的key:
  20. 访问Map中所有的value:
  21. 访问容器的大小: |

  22. 投影(过滤):
  23. 投影:1}.{age}"/>
  24. 投影:1}.{age}"/>
  25. 投影:1}.{age} == null"/>

  26. []:

java ognl使用_java框架篇---struts之OGNL详解相关推荐

  1. java 字节码详解_Java基础篇(JVM)——字节码详解

    这是Java基础篇(JVM)的第一篇文章,本来想先说说Java类加载机制的,后来想想,JVM的作用是加载编译器编译好的字节码,并解释成机器码,那么首先应该了解字节码,然后再谈加载字节码的类加载机制似乎 ...

  2. java mod %区别_Java中 % 与Math.floorMod() 区别详解

    %为取余(rem),Math.floorMod()为取模(mod) 取余取模有什么区别呢? 对于整型数a,b来说,取模运算或者取余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余 ...

  3. java switch 值_Java switch多值匹配操作详解

    这篇文章主要介绍了Java switch多值匹配操作详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 我们都知道 switch 用来走流程分支,大 ...

  4. java 接口函数_Java函数式接口Supplier接口实例详解

    这篇文章主要介绍了Java函数式接口Supplier接口实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 JDK提供了大量常用的函数式接口以丰 ...

  5. Java指令全集_Java的JVM字节码指令集详解

    本文详细介绍了如何使用javap查看java方法中的字节码.以及各种字节码的含义,并且配以完善的案例,一步步,从头到尾带领大家翻译javap的输出.在文末还附有JVM字节码指令集表. 本文不适合没有J ...

  6. java supplier接口_Java函数式接口Supplier接口实例详解

    这篇文章主要介绍了Java函数式接口Supplier接口实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 JDK提供了大量常用的函数式接口以丰 ...

  7. java 静态 编译_Java中的动态和静态编译实例详解

    Java中的动态和静态编译实例详解 首先,我们来说说动态和静态编译的问题. Q: java和javascript有什么区别? 总结了一下:有以下几点吧: 1.首先从运行环境来说java代码是在JVM上 ...

  8. java 分割数据_java 分割csv数据的实例详解

    java 分割csv数据的实例详解 实际需要解析的csv中很多都是从excel中转过来的,数据中本身包含了逗号的数据导致split的过程中发现数据对不上,因此,基于这种特性,重新写了一个csv数据的分 ...

  9. java foreach标签_Java中Velocity foreach循环标签详解

    Java中Velocity foreach循环标签详解 Java Velocity中foreach循环可以很容易的遍历数组或者集合. 定义 #foreach( $elem in $allElems) ...

最新文章

  1. SprintBoot中如何构造Bean原理分析
  2. android call require api level
  3. 端口复用突破防火墙(图)
  4. 【libcudnn】ImportError: libcudnn.so.7: cannot open shared object file: No such file or directory
  5. 坑爹BUG,没有详细的看还真看不出问题
  6. 做中国女人难,做中国女装更难
  7. Kaggle实战之房价预测
  8. CSDN博客 不登录不能复制粘贴
  9. 上传文件框在firefox浏览器中显示路径不全的解决方法
  10. 激光雷达发射的激光属于哪个范围???和毫米波波长相比如何???
  11. Linkflow新锐洞察 06 | DTC品牌如何快速规模化?
  12. c++ double 截取_c++ double 截取_C/C++ double取余函数
  13. HBuilderX连接苹果手机iPhone预览移动端页面
  14. starUML for MAC 破解方法
  15. 教程:Windows10下如何安装使用多版本Tensorflow2.x/Pytorch/paddlepaddle的GPU版本[和CUDA的安装及问题详解]【亲测可行】【详细和持续更新】
  16. OFDM水声通信基础
  17. 任意输入n个整数,分别统计奇数的和、奇数的个数、偶数的和、偶数的个数。
  18. 最新的ssm毕业设计题目50例
  19. 机械臂学习——标准DH法和改进MDH法建模法对比学习
  20. 无限吃巧克力:图证64=65?

热门文章

  1. Linux下QT创建项目错误处理
  2. I00023 鸡兔同笼解法二
  3. 机器学习编程接口(api)设计(oop 设计)
  4. 卡特兰(Catalan)数列
  5. 构建复杂的应用程序(二)—— visual studio 下 C/C++ 项目开发
  6. 【笔试/面试】SQL 经典面试题
  7. 质数的无穷性——从素数到数论
  8. Linux下c语言实现通讯录,学生通讯录管理系统linux下C语言
  9. vue 心跳监控_Vue中WebSocket加入心跳机制
  10. python装饰器详解-这是我见过最全面的Python装饰器详解!没有学不会这种说法!...