struts2 3
OGNL
-
对象图导航语言
- 支持对象方法调用
- 支持静态方法调用和值访问
- 支持赋值操作和表达式串联
- 访问OGNL上下文
- 操作集合对象
-
OGNL结构三要素:表达式(expression)、根对象(root Object)、上下文环境(context)
-
在表达式中访问Context中的对象需要使用 **“#”**加上对象名称,即“#对象名称”的形式
-
访问对象的方法
object.method()
-
访问对象的静态方法:
@类的全路径@方法名称(参数列表) @类的全路径@属性名称
OnglContext context = new OnglContext(); Object obj = Ongl.getValue("表达式",context,context.getRoot()); Object obj = Ongl.getValue("'helloworld'.length()",context,context.getRoot()); Object obj = Ongl.getValue("@java.lang.Math@random()",context,context.getRoot()); //获取OnglContext中的数据 //context.put("name","张三"); String name = (String)Ongl.getValue("#name",context,context.getRoot()); //获取Root中的数据 User user= new User(); user.setName("张三"); context.setRoot(user); String name = (String)Ongl.getValue("name",context,context.getRoot());
值栈
- 值栈:是struts2的一个接口
- 客户端发起一个请求struts2架构会构建一个action实例同时创建一个OgnlValueStack值栈实例A,A贯穿整个action的生命周期,struts2中使用OGNL将请求action的参数封装为对象存储到值栈中,并通过OGNl表达式读取值栈中的对象属性值
- 值栈包括两个部分:值栈和map(即ognl上下文)
- Context:即ognlContext上下文,是一个map结构,上下文存储了一些引用,
- parameters:当前请求的请求参数
- request:当前request对象中的所有属性
- session:当前session对象中的所有属性
- application:当前application对象中的所有属性
- attr:该map按如下顺序来检索某个属性:request、session、aplication
- 上下文的root为CompoundRoot:存储action实例,是OgnlContext的root对象
- 继承ArrayList实现压栈和出栈功能,拥有栈的特点,先进后出,也称对象栈
- 读取action实例的属性值时会先从栈顶对象中找到对应的属性,如果找不到则继续找栈中的其他对象
- ActionContext和ValueStack的关系
- 创建ActionContext的时候,创建ValueStack对象,将ValueStack对象给ActionContext
- ActionContext中有一个ValueStack的引用,ValueStack中也有一个ActionContext的引用
- ActionContext获取ServletAPI的时候,依赖值栈
获取值栈堆栈
//通过ActionContext对象获取值栈
ValueStack stack1 = ActionContext.getContext().getValueStack();
//通过request域获取值栈
ValueStack stack2 =(ValueStack)ServletActionCotnext.getRequest().getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);
操作值栈
- 对action中的属性提供get方法:action本身在值栈中,action中的属性也默认在值栈中
- 手动调用push和set方法对值栈进行操作