OGNL表达式:
OGNL:Object Graphic Navigation Language. 对象视图导航语言. struts2没有选择使用EL表达式作为整合表达式语言.而选择了功能更加强大OGNL表达式作为整合语言. 在Struts2环境中,更加推荐使用ognl表达式获得数据.
语法使用:
1.从Context部分取值: #号前缀
System.out.println(Ognl.getValue("#user1.name", oc.getValues(), oc.getRoot()));
System.out.println(Ognl.getValue("#user1.age", oc.getValues(), oc.getRoot()));
2.从Root部分取值: 不需要任何前缀
System.out.println(Ognl.getValue(“name”, oc.getValues(), oc.getRoot()));
System.out.println(Ognl.getValue(“age”, oc.getValues(), oc.getRoot()));
3. 调用方法
Ognl.getValue("#user1.setName(‘jack’)", oc.getValues(), oc.getRoot());
System.out.println(Ognl.getValue("#user1.getName()", oc.getValues(), oc.getRoot()));
4.调用方法(静态方法),访问静态属性
4.1 访问静态方法
System.out.println(Ognl.getValue("@cn.itcast.a_ognl.TestUtils@echo('hello ~ ')", oc.getValues(), oc.getRoot()));
4.2 访问静态属性
System.out.println(Ognl.getValue("@java.lang.Math@PI", oc.getValues(), oc.getRoot()));
5.为属性赋值
注意:赋值时,OGNL表达式支持自动类型转换. 8大基本数据类型以及对应包装类再加上Date类型.
System.out.println(Ognl.getValue("#user1.name=‘rose’ , #user1.name “, oc.getValues(), oc.getRoot()));
System.out.println(Ognl.getValue(”#user1.age=‘16’ , #user1.age ", oc.getValues(), oc.getRoot()));
Struts2与OGNL的整合
struts2与OGNL整合,准备了一个OGNLValuesStack对象.该对象由两部分构成.
Context:部分.类型是一个Map. 实质上就是数据中心;
Root部分: 类型是一个栈;
struts2 为 OGNL 准备了数据
|- Context => 数据中心
|- Root => 栈
数据中心中放置
|- request域 session域 application域
|- 原生request对象,response对象,servletContext对象
|- parameters参数集合...................
栈中放置了什么数据
栈中放置了当前访问Action
Ognl在Struts2中的应用
1> 页面中根据OGNL获得值
2> 参数赋值
3> 在struts.xml 中使用OGNL表达式
4>进阶: el 与 OGNL 的关系