对象导航图语言(Object Graph Navigation Language),简称OGNL,是应用于Java中的一个开源的表达式语言(Expression Language),它被集成在Struts2等框架中,作用是对数据进行访问,它拥有类型转换、访问对象方法、操作集合对象等功能。
为什么学习ognl,也就是ognl的功能
OGNL(Object-Graph Navigation Language),可以方便地·操作对象属性
的开源表达式语言,使页面更简洁;
支持运算符(如±/),比普通的标志具有更高的自由度和更强的功能;
Struts 2默认的表达式语言是OGNL
,原因是它相对其它表达式语言具有下面几大优势
:
支持对象方法调用,如xxx.doSomeSpecial();
支持类静态的方法调用和值访问
,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名],例如:@java.lang.String@format(‘foo %s’, ‘bar’)或@tutorial.MyConstant@APP_NAME;
支持赋值操作和表达式串联
,如price=100, discount=0.8, calculatePrice(pricediscount),这个表达式会返回80;
访问OGNL上下文(OGNL context)和ActionContext;
主要学习的重点
操作集合对象。
可以直接new一个对象
ognl的使用要素
表达式:从什么地方获取数据,获取会什么样的数据
跟对象:你要操作那个对象
context对象:在哪操作
ognl入门案例
引入ognl包
这里的方法是静态方法是random,且这个值是0-1之间的
通常情况下会给root里面存放实体对象
创建user类
package com.biyi.pojo;
public class User {
private String username;
private String password;
public User(String username, String password) {
this.username = username;
this.password = password;
}
public User() {
super();
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
第三节
ognl在struts2里面的使用,ognl在struts2的入门案例
引用的包和上一次的包一样
但是这次需要配置过滤器等配置文件,通常情况下ognl是获取页面的数据
值栈概述
Struts2将XWork对Ognl的扩展这一套机制封装起来,这个对象叫ValueStack。
ValueStack实际上就是一个容器。它由Struts框架创建,当前端页面如jsp发送一个请求时,Struts的默认拦截器会将请求中的数据进行封装,并入ValueStack的栈顶。
ValueStack是struts2的一个接口,ognlValueStack是一个实现类,客户端发起一个请求,struts2框架会创建一个action实例对象,同时,还创建了一个ognlValueStack的一个实例,ognlValueStack会贯穿整个生命周期,struts会将请求action参数封装为对象存储到值栈中,并通过ognl表达式读取值栈中对象的属性的值;
ValueStack氛围两个区域:
root区域:其实就是一些arraylist,通常放置的就是对象,获取root数据是不需要添加#
context区域:其实就是一些map,通常放置的是;web开发中的对象的引用(request,session,application,attr,parameter)获取context数据是需要添加#
通常所说的操作值栈,通常指的是操作ValueStack的root区域
actioncontext:就是action上下文,就是之前的事和之后的是都知道,创建对象,以及执行某个方法;
通过源码,当请求过来的时候执行dofilter方法,在这个方法中创建actioncontext,在创建actioncontext过程中,
创建ValueStack对象,将ValueStack对象传递给actioncontext对象,所以可以通过actioncontext获取值栈对象
actioncontext对象之所以能够访问servlet的API(访问的是域对象的数据)因为在其内部是值栈的引用
通过actioncontext对象获取值栈
在struts2的内部,将值栈存入到request中一份
通过actioncontext对象获取值栈
在struts2的内部,将值栈存入到request中一份
这两个的方式创建的对象是同一个,因为ValueStack贯穿了action的生命周期,有一个action实例就只会有一个值栈实例
有两种方法
1.在action中提供属性的get方法
2.使用ValueStack的本身的方法
ognl的特殊字符
1,作用是获取context的数据
2,使用#构建map集合
在配置文件中使用ognl
1,属性文件
1.1国际化的地方(比如某个国家等这种情况)
message_zh_CN.properties
user.key=登陆
user.welcome=欢迎,KaTeX parse error: Expected '}', got '#' at position 2: {#̲session.name} …{#session.name}
上面这种情况是假如是中国登陆则出现登陆
字样,假如是英国登陆则出现login
还有一种是变量的时候使用,就比如欢迎谁或者welcome谁,这个人是动态的
2,xml文件
综合案例:优化查询