-
OGNL
1.1 OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言
1.2 OgnlContext(ongl上下文)其实就是MapOgnlContext=根对象(1)+非根对象(N)
非根对象要通过"#key"访问,根对象可以省略"#key"注1:context:英文原意上下文,环境/容器
1.3 把根对象和非根对象说出来
- ValueStack
ValueStack实际上就是一个容器。它由Struts框架创建.
2.1 值栈
先进后出的数据结构,弹夹 push/pop
2.2 为什么要使用ValueStack作为根对象
放到值栈中的对象都可视为根对象
EL表达式 从小到大
page -> request -> session -> application
OGNL表达式 从上至下
A
B
C
D
//伪代码
*.action
3. ActionContext
每次发出请求时都会创建一个ActionContext,也就是说,ActionContext的生命周期是和request相同的,
3.1 ActionContext ac = ActionContext.getContext();//保证同一请求中只创建一个上下文
request
session
application
parameters
ValueStack(root)
3.2 向ValueStack压栈
push(XxxAction)//helloAction
push(ModelDirver.getModel())//model不为null user
3.3 Map<String,String[]> map = request.getParamterMap();
//参数名==OGNL表达式
{“userName”:“aaa”,“uname”:“bbb”,“upwd”:“ccc”,“age”:“22”}
setValue("userName", ac, vs, "aaa");
setValue("uname", ac, vs, "bbb");
setValue("upwd", ac, vs, "ccc");
setValue("age", ac, vs, "22");
总结一下:
一:ActionContext生命周期是一次请求,每次发出请求都会创建一个新的ActionContext,就和 request一样,每次创建新的ActionContext时会重新引用那些对象。
二:而且不只生命周期一样,它本身也具备了request域的功能,可以从后台携带数据到前台,也和request一样
三:通过ActionContext可以直接获得session和application各自的域对象,操作时更方便
四:最重要一点是:ActionContext本身是一个Map,它存储了很多的对象例如request,response.
- struts2中传递数据
可以使用作用域,但更多的是利用ValueStack或ActionContext
4.1.ValueStack的特点(值栈):
1).把一个对象放到vs里面之后,我们从这个vs中是拿不到这个对象的,但是我们可以直接拿到这个对象里面的属性以及属性值.
2).从vs中拿值的时候,是从vs中的property name这一个列来拿的,拿到的是property value这一列的值.所以如果我们通过vs把一个值传到页面,我们不能直接把这个值放到vs里,因为这样拿不到,我们应该把这个值放到一个对象的属性里面,然后再把这个对象放vs中,这个时候就可以通过vs拿到这个对象的属性了,也就是我们要传的值.
3).每次浏览器发送一个新的请求,都会生成一个新的ValueStack对象,上一次的ValueStack对象就没了,找不到了.(类似之前学习的request对象的特点)
4).每次创建一个新的ValueStack对象后,会把这个对象放到ActionContext里面.
4.2.ActionContext的特点
1).向ac里面放值的时候是通过key-value的形式存放的,key是String类型,value是Object类型,取值的是同样通过key拿到value.
2).struts框架默认向这个对象里面存放的对象(数据)很多,包括request、session、application、ValueStack、parameters等
3.每次请求都会创建一个新的ActionContext对象(每次请求打印出ac的地址值可以看出来)