关于struts2里的ognl与值栈
来源:互联网 发布:马蓉出轨的代价 知乎 编辑:程序博客网 时间:2024/05/16 03:37
struts2里用的并不是原生的ognl,而是把ognl进行了改良。在原生ognl里只能有一个root对象,而到了struts2里能有多个root对象,其实这里我个人感觉实际上还是一个对象,只不过这个对象是个容器,可以封装其它对象,所以看上去好像是可以有多个root对象。注意这个root对象,也就是所谓的容器实际上用的是一个栈的结构,栈顶始终默认存放着一次请求的action对象。而struts2里的ognl上下文是ActionContext。
下面附上原生ongl的一些常用存值取值实例
OgnlContext context = new OgnlContext();
Person person = new Person();
person.setName("zhangsan");
Dog dog = new Dog();
dog.setName("wangcai");
person.setDog(dog);
context.put("person", person);
context.put("dog", dog);
context.setRoot(person);
Object object1 = Ognl.parseExpression("name");//如果不指定对象名 则找的是根元素里的name
System.out.println(object1);//这里打印的只是对象导航图而已
Object object2 = Ognl.getValue(object1, context, context.getRoot());
System.out.println(object2);//这里打印的才是真正获得的属性
Object object3 = Ognl.parseExpression("#person.name");//指定对象名前要加#号
System.out.println(object3);
Object object4 = Ognl.getValue(object3, context, context.getRoot());
System.out.println(object4);
Object object5 = Ognl.parseExpression("#dog.name");//指定对象名前要加#号
System.out.println(object5);
Object object6 = Ognl.getValue(object5, context, context.getRoot());
System.out.println(object6);
Object object7 = Ognl.parseExpression("#person.dog.name");//指定对象名前要加#号
System.out.println(object7);
Object object8 = Ognl.getValue(object7, context, context.getRoot());
System.out.println(object8);
Object object9 = Ognl.parseExpression("new java.util.LinkedList()");//可以 直接 创建对象
System.out.println(object9);
Object object10 = Ognl.getValue(object9, context, context.getRoot());
LinkedList linkedList = (LinkedList)object10;//这里的object10其实就是LinkedList类的对象
linkedList.add("linkedlist1");
linkedList.add("linkedlist2");
System.out.println(object10);
Object object11 = Ognl.getValue("{'aa', 'bb', 'cc'}", context, context.getRoot());
System.out.println(object11);//可以用上述的方法来 直接 创建集合,且集合和数组的访问方法是一样的、可以用下标来访问
Object object12 = Ognl.getValue("{'aa', 'bb', 'cc'}[1]", context, context.getRoot());
System.out.println(object12);
Object object13 = Ognl.getValue("#{'key1':'aav', 'key2':'bbv', 'key3':'ccv'}", context, context.getRoot());
System.out.println(object13);//可以用上述方法来直接创建 映射(map) 注意创建映射必须使用#号,且这里的#和前面说的#号不是一个意思,前面的#代表访问根元素
Object object14 = Ognl.getValue("#{'key1':'aav', 'key2':'bbv', 'key3':'ccv'}['key1']", context, context.getRoot());
System.out.println(object14);//访问映射中的具体key对应的值
//下面演示OGNL里的过滤功能,主要用在集合里
List<Person> list = new ArrayList<Person>();
Person p1 = new Person();
Person p2 = new Person();
Person p3 = new Person();
p1.setName("zhangsan");
p2.setName("lisi");
p3.setName("wangwu");
list.add(p1);
list.add(p2);
list.add(p3);
context.put("list", list);
//下面是筛选集合里的属性语法,其中 #this 代表的是集合里的每一个对象(相当于遍历集合) 只要那么属性长度大于4的都会被返回(返回的是个新的集合)
//其中前面的 ?号可以换成 ^ 或者 $ 符号 前者代表返回结果里的第一个元素,后者是代表返回结果里最后一个元素(注意即使返回一个属性也是用集合形式返回的,并不是返回单个属性)
Object object15 = Ognl.parseExpression("#list.{? #this.name.length() > 4}");
Object object16 = Ognl.getValue(object15, context, context.getRoot());
System.out.println(object16);
//下面演示的是OGNL里的投影操作
//其实投影操作就是返回集合里的对象里指定的属性的一个集合,如下的person类 可以只返回name属性的集合 返回后的集合里只包含name属性 不包含age属性
// class person
// {
// String name;
// String age;
// }
Object object17 = Ognl.parseExpression("#list.{name}");//这里表示只返回list集合里对象的name属性
Object object18 = Ognl.getValue(object17, context, context.getRoot());
System.out.println(object18);
//下面表示在投影的基础上返回name长度大于5的值,把小于5的值换成helloworld返回
Object object19 = Ognl.parseExpression("#list.{#this.name.length() < 5 ? 'helloworld' : #this.name}");
Object object20 = Ognl.getValue(object19, context, context.getRoot());
System.out.println(object20);
- 关于struts2里的ognl与值栈
- 关于struts2的值栈以及OGNL
- Struts2-OGNL与值栈
- 关于Struts2的OGNL
- struts2里的ognl实现
- Struts2中关于值栈和OGNL表达式的理解
- Struts2的值栈-OGNL
- 关于struts2的OGNL(二)
- Struts2使用之值栈与OGNL
- Struts2<4>值栈与 OGNL
- struts2--3.Ognl与值栈
- struts2的ognl与valuestack
- Struts2的OGNL与struts2标签
- Struts2的OGNL与struts2标签
- 框架 day29 Struts2-上传,下载,OGNL与Struts2的结合(值栈与ActionContext),Struts2标签,Token机制
- Struts2使用16 -- 值栈与 OGNL 1 -- 概述
- Struts2使用17 -- 值栈与 OGNL 2 -- 使用
- Struts2使用之值栈与OGNL-使用
- Android调试adb端口被占用
- RedHat9通过Host-only配置网络连接(图解步骤完全版)
- 关联容器
- 再探Java基础——String.format(String format, Object… args)的使用
- java script 单元测试JSUnit 使用
- 关于struts2里的ognl与值栈
- CSS属性总结
- unity 使用Dotfuscator给dll混淆(原)
- @RequestMapping地址映射
- 每周一记之初学c/c++(1)
- RMQ问题
- context.startActivity(Intent intent)方法启动activity
- 如何将Mindjet的宏放到自定义功能区
- WINDOWS已显衰象,桌完美世界面版安卓曙光现前!2015