概述
Struts2框架中的表达式OGNL
ognl
1 什么是ognl
ognl表达式:全称为Object-Graph Navigation Language
是struts2默认的表达式语言 用来获取和设置java对象的属性
- 使用ognl的好处
可以方便的操作对象属性的开源表达式语言
3.使用ognl表达式的5点优势
1),支持对象方法调用 如xxx.doSomeSpecial();
2),支持类静态的方法调用和值访问,表达式的格式:@【类全名(包括包路径)】@【方法名 |值名】
3),支持赋值操作和表达式串联
4),访问OGNL上下文和actionContext
5),操作集合对象
例子部分:
例子1 上下文环境中使用ognl
import java.util.HashMap;
import java.util.Map;
import org.omg.CORBA.Context;
import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;
/上下文环境中使用ognl/
public class Ognl2 {
public static void main(String[] args) {
/*创建一个上下文Context对象,它是用保存多个对象一个环境 对象*/
Map<String,Object> context = new HashMap<String,Object>();
Person person1 = new Person();
person1.setName("张三");
Person person2 = new Person();
person2.setName("李四");
Person person3 = new Person();
person3.setName("王五");
/*person4不放到上下文环境中*/
Person person4 = new Person();
person4.setName("赵六");
/*将person1,person2,person3添加到环境中(上下文中)*/
context.put("person1",person1);
context.put("person2",person2);
context.put("person3",person3);
try {
/* 获取根对象的 name 属性值 */
Object value = Ognl.getValue("name", context,person2);
System.out.println("ognl expression"name"evaluation is:"+value);
/* 获取根对象的 name 属性值 */
Object value2 = Ognl.getValue("#person2.name", context,person2);
System.out.println("ognl expression"#person2.name" evaluation is:"+value2);
/* 获取person1对象的"name"属性值 */
Object value3 = Ognl.getValue("#person1.name", context, person2);
System.out.println("ognl expression "#person1.name" evaluation is : " + value3);
/* 将person4指定为root对象,获取person4对象的"name"属性,注意person4对象不在上下文中 */
Object value4 = Ognl.getValue("name", context, person4);
System.out.println("ognl expression "name" evaluation is : " + value4);
/* 将person4指定为root对象,获取person4对象的"name"属性,注意person4对象不在上下文中 */
Object value5 = Ognl.getValue("#person4.name", context, person4);
System.out.println("ognl expression "person4.name" evaluation is : " + value5);
} catch (OgnlException e) {
e.printStackTrace();
}
}
}
class Person{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
结果分析及总结
对于使用上下文的OGNL,若不指定从哪一个对象中查找”name”属性,则OGNL直接从根对象(root)查找,
若指定查找对象(使用’#’号指定,如#person1),则从指定的对象中查找,若指定对象不在上下文中则
会抛出异常,换句话说就是是#person1.name形式指定查找对象则必须要保证指定对象在上下文环境中。
例子2 使用OGNL调用方法
import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;
/*
* 使用OGNL调用方法
*/
public class Ognl3 {
public static void main(String[] args){
//ognl提供的一个上下文类,它实现了Map接口
OgnlContext context = new OgnlContext();
People people1 = new People();
people1.setName("zhangsan");
People people2 = new People();
people2.setName("lisi");
People people3 = new People();
people3.setName("wangwu");
context.put("people1",people1);
context.put("people2",people2);
context.put("people3",people3);
context.setRoot(people1);
try {
//调用 成员方法
Object value = Ognl.getValue("name.length()",context,context.getRoot());
System.out.println("people1 name length is:"+value);
Object upperCase = Ognl.getValue("#people2.name.toUpperCase()",context,context.getRoot());
System.out.println("people2 name upperCase is:"+upperCase);
Object invokeWithArgs = Ognl.getValue("name.charAt(5)", context,context.getRoot());
System.out.println("people1 name.charAt(5) is:"+invokeWithArgs);
//调用静态方法 对于静态方法的调用,需要使用如下格式:@ClassName@method
Object min = Ognl.getValue("@java.lang.Math@E",context,context.getRoot());
System.out.println("min(4,10) is:"+min);
//调用静态变量 对于静态变量需要使用如下格式:@ClassName@field
Object e = Ognl.getValue("@java.lang.Math@E",context,context.getRoot());
System.out.println("E is:"+e);
} catch (OgnlException e) {
e.printStackTrace();
}
}
}
class People{
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
结果分析及总结
使用OGNL调用方法十分简单,对于成员方法调用,秩序要给出方法的名称+(),若有参数,
直接写在括号内,与一般调用Java方法一致,对于静态方法的调用,需要使用如下格式:
@ClassName@method,对于静态变量需要使用如下格式:@ClassName@field
例子3 使用OGNL操作集合
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import ognl.Ognl;
import ognl.OgnlContext;
import ognl.OgnlException;
//使用OGNL操作集合
public class Ognl4 {
public static void main(String[] args) {
OgnlContext context = new OgnlContext();
Classroom classroom=new Classroom();
classroom.getStudents().add("张三");
classroom.getStudents().add("李四");
classroom.getStudents().add("王五");
classroom.getStudents().add("赵六");
classroom.getStudents().add("小明");
Student student=new Student();
student.getContactWays().put("hme:","123");
student.getContactWays().put("com:","112");
student.getContactWays().put("mob:","119");
context.put("classroom",classroom);
context.put("student",student);
context.setRoot(classroom);
try {
//获取classroom的students集合
Object collection = Ognl.getValue("students", context,context.getRoot());
System.out.println("students集合:"+collection);
//获得classroom的students集合
Object firstStudent = Ognl.getValue("students[0]",context,context.getRoot());
System.out.println("第一个学生是:"+firstStudent);
//调用集合的方法
Object size = Ognl.getValue("students.size()",context,context.getRoot());
System.out.println("students collection size is:"+size);
System.out.println("-----------------------*_*-----------------------------");
//创建集合
Object createCollection = Ognl.getValue("{'aa','bb','cc','dd'}", context,context.getRoot());
System.out.println(createCollection);
//创建map集合
Object createMapCollection = Ognl.getValue("#{'key1':'value1','key2':'value2'}", context,context.getRoot());
System.out.println(createMapCollection);
System.out.println("-----------------------*_*-----------------------------");
} catch (OgnlException e) {
e.printStackTrace();
}
}
}
class Classroom{
private List students=new ArrayList();
public List<String> getStudents() {
return students;
}
public void setStudents(List<String> students) {
this.students = students;
}
}
class Student{
private Map
最后
以上就是怡然钥匙为你收集整理的Struts2框架中OGNL表达式的学习的全部内容,希望文章能够帮你解决Struts2框架中OGNL表达式的学习所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复