标签:stack person 关系数据库 request method ext array 组成 mamicode
Ognl其实就是Map,它又分为一个根对象(Root)和多个非根对象
非根对象要通过"#key"访问,根对象可以省略"#key"
比如我们获取一个为根对象的的对象的属性,就只需要直接根据属性名就好了:String employeeName = (String) OnglExpression.getValue(“name”, ctx, e);
如果不是根对象: String managerName (String)OnglExpression.getValue("#manager.name",ctx, e);
对象取值和非根对象取值的现象,以及OGNL取值和赋值的案例
1 package com.xy.test; 2 3 import ognl.OgnlContext; 4 import ognl.OgnlException; 5 6 public class Demo1 { 7 8 /** 9 * @param args 10 * @throws OgnlException 11 */ 12 public static void main(String[] args) { 13 Employee e = new Employee(); 14 e.setName("小李"); 15 16 Manager m = new Manager(); 17 m.setName("张经理"); 18 19 // 创建OGNL下文,而OGNL上下文实际上就是一个Map对象 20 OgnlContext ctx = new OgnlContext(); 21 22 // 将员工和经理放到OGNL上下文当中去 23 ctx.put("employee", e); 24 ctx.put("manager", m); 25 ctx.setRoot(e);// 设置OGNL上下文的根对象 26 27 /** ********************** 取值操作 *************************** */ 28 // 表达式name将执行e.getName(),因为e对象是根对象(请注意根对象和非根对象表达式的区别) 29 String employeeName = (String) OnglExpression.getValue("name", ctx, e); 30 System.out.println(employeeName); 31 32 // 表达式#manager.name将执行m.getName(),注意:如果访问的不是根对象那么必须在前面加上一个名称空间,例如:#manager.name 33 String managerName = (String) OnglExpression.getValue("#manager.name", 34 ctx, e); 35 System.out.println(managerName); 36 37 // 当然根对象也可以使用#employee.name表达式进行访问 38 employeeName = (String) OnglExpression.getValue("#employee.name", ctx, 39 e); 40 System.out.println(employeeName); 41 42 /** ********************** 赋值操作 *************************** */ 43 OnglExpression.setValue("name", ctx, e, "小明"); 44 employeeName = (String) OnglExpression.getValue("name", ctx, e); 45 System.out.println(employeeName); 46 47 OnglExpression.setValue("#manager.name", ctx, e, "孙经理"); 48 managerName = (String) OnglExpression.getValue("#manager.name", ctx, e); 49 System.out.println(managerName); 50 51 OnglExpression.setValue("#employee.name", ctx, e, "小芳"); 52 employeeName = (String) OnglExpression.getValue("name", ctx, e); 53 System.out.println(employeeName); 54 } 55 56 }
OGNL向ValueStack压栈
后台定义属性和实现modelDriver接口,提供get和set方法
1 private HttpServletRequest req; 2 private Cal cal1=new Cal(); 3 private Cal cal2; 4 private String sex; 5 private String num1; 6 7 8 public String getNum1() { 9 return num1; 10 } 11 12 13 public void setNum1(String num1) { 14 this.num1 = num1; 15 } 16 17 18 public Cal getCal2() { 19 return cal2; 20 } 21 22 23 public void setCal2(Cal cal2) { 24 this.cal2 = cal2; 25 } 26 27 28 public String getSex() { 29 return sex; 30 } 31 32 33 public void setSex(String sex) { 34 this.sex = sex; 35 } 36 37 /** 38 * implements ModelDriven 39 * @return 40 */ 41 public String accept1() { 42 System.out.println("cal1:"+cal1); 43 System.out.println("num1:"+num1); 44 return "rs"; 45 }
运行显示cal1.num1有值,而num1却取不到值
这就和ValueStack的压栈有关系了,压栈的结构是先进后出,而ValueStack的取值是取到了值就会返回,不会往下取了。
而ValueStack对取值的压栈是先把xxxAction也就是我们通过set和get方法取值的方式先压入栈底,然后再把ModelDriver压入,所有会先取到通过ModelDriver来获取值的,而获取到了就返回了,导致后面的值不会获取了。
标签:stack person 关系数据库 request method ext array 组成 mamicode
原文地址:https://www.cnblogs.com/AluoKa/p/11104625.html