l OGNL表达式
OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写,它是一个开源项目。 Struts2框架使用OGNL作为默认的表达式语言。
l OGNL优势
1、支持对象方法调用,如xxx.doSomeSpecial();
2、支持类静态的方法调用和值访问,表达式的格式:
@[类全名(包括包路径)]@[方法名 | 值名],例如:
@java.lang.String@format('foo %s', 'bar')
或@tutorial.MyConstant@APP_NAME;
3、支持赋值操作和表达式串联,如price=100, discount=0.8,
calculatePrice(),这个表达式会返回80;
4、访问OGNL上下文(OGNL context)和ActionContext;
5、操作集合对象 可以创建list map 集合 但EL却不行
l 总结
OGNL 有一个上下文(Context)概念,说白了上下文就是一个MAP结构,它实现了 java.utils.Map 的接口。 OgnlContext对象
分析:
ü Struts框架默认就支持Ognl表达式语言。
(struts必须引用的包:ognl.jar)
ü 作用
页面取值用。
El表达式语言,用于页面取值,jsp页面取值的标准。(默认直接可以使用) 使用EL取值为null 那么会显示空字符串""
(应用范围更广。page指令有一项为 isELIgnored="true | false")
Ognl表达式语言, struts标签默认支持的表达式语言。
必须配置struts标签用,不能离开struts标签直接用。
OgnlContext对象是ognl表达式语言的核心。
源码类:
public class OgnlContext extends Objectimplements Map{..}
硬编码方式,了解OgnlContext对象:
// OgnlContext用法 publicclass OgnlDemo1 {
/** * 1. Ognl表达式语言语言取值,取非根元素的值,必须用#号 * @throws Exception */ @Test publicvoid testOgnl()throws Exception { //创建一个Ognl上下文对象 OgnlContext context =newOgnlContext(); //放入数据 User user = new User(); user.setId(100); user.setName("Jack"); //【往非根元素放入数据,取值的时候表达式要用"#"】 context.put("user", user);
//获取数据(map) //先构建一个Ognl表达式,再解析表达式 Object ognl = Ognl.parseExpression("#user.name");//必须加# Object value = Ognl.getValue(ognl, context, context.getRoot());
System.out.println(value); }
/** * 2. Ognl表达式语言语言取值,取根元素的值,不用带#号 * @throws Exception */ @Test publicvoid testOgn2()throws Exception { //创建一个Ognl上下文对象 OgnlContext context =newOgnlContext(); //放入数据 User user = new User(); user.setId(100); user.setName("Jack"); //【往根元素放入数据】 context.setRoot(user);
//获取数据(map) //先构建一个Ognl表达式,再解析表达式 Object ognl = Ognl.parseExpression("id");//这时可直接取属性 因为是根 Object value = Ognl.getValue(ognl, context, context.getRoot()); Object ognl = Ognl.parseExpression("address.province"); Object value = Ognl.getValue(ognl, context, context.getRoot());
System.out.println(value); }
/** * 3.Ognl对静态方法调用的支持 * @throws Exception */ @Test publicvoid testOgn3()throws Exception { //创建一个Ognl上下文对象 OgnlContext context =newOgnlContext();
//Ognl表达式语言,调用类的静态方法 类 方法 //Objectognl = Ognl.parseExpression("@Math@floor(10.9)"); //由于Math类在开发中比较常用,所以也可以这样写 Object ognl = Ognl.parseExpression("@@floor(10.9)"); Object value = Ognl.getValue(ognl, context, context.getRoot()); System.out.println(value); } }
|
Ognl的API类和方法 OgnlContext类【本质是一个Map】 OgnlContext context = new OgnlContext(); context.put("user", user); context.put("address", address); context.setRoot(address) Ognl类 Object obj1 = Ognl.parseExpression(“country”); 解析ognl表达式 Ognl.getValue(obj1, context, context.getRoot()); 获取ognl的表达式值 Object obj2 = Ognl.parseExpression(“language.toUpperCase()”); 方法调用 Object obj3 = Ognl.parseExpression("@java.lang.Integer@toBinaryString(10)"); Object obj4 = Ognl.parseExpression(“@@min(10,4)”); Math类的方法直接调用 |
ValueStack, 即值栈对象。
值栈对象:
是整个struts数据存储的核心,或者叫中转站。
用户每次访问struts的action,都会创建一个Action对象、值栈对象、ActionContext对象; 然后把Action对象放入值栈中; 最后再把值栈对象放入request中,传入jsp页面。
(key: struts.valueStack); 开发者只需要通过ActionContext对象就可以访问struts的其他的关键对象。 (ActionContext是给开发者用的,便于学习与使用。)
lValueStack
ValueStack实际是一个接口,在Struts2中利用OGNL时,实际上使用的是实现了该接口的OgnlValueStack类,这个类是Struts2利用OGNL的基础。
lValueStack特点
ValueStack贯穿整个 Action 的生命周期(每个 Action类的对象实例都拥有一个 ValueStack 对象). 相当于一个数据的中转站.在其中保存当前Action 对象和其他相关对象. Struts2框架把 ValueStack 对象保存在名为“struts.valueStack” 的request请求属性中。
lValueStack存储对象
ObjectStack: Struts 把动作和相关对象压入 ObjectStack 中--List ContextMap:Struts把各种各样的映射关系(一些 Map类型的对象) 压入ContextMap 中 Struts会把下面这些映射压入ContextMap中 parameters:该 Map中包含当前请求的请求参数 request: 该 Map中包含当前 request对象中的所有属性 session: 该 Map中包含当前 session对象中的所有属性 application:该 Map中包含当前 application 对象中的所有属性 attr: 该 Map按如下顺序来检索某个属性:request, session, application |
问题:
OgnlContext与ValueStack对象的关系?
Struts标签取值,就使用了Ognl表达式语言。