struts2之ognl简介、ValueStack、ActionContext、以及struts中的数据传递
一、OGNL
1.1 什么是OGNL?
OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言。
1.2 OGNL上下文
1)OgnlContext(OGNL上下文)其实就是Map集合
2)OgnlContext由根对象(1)+非根对象(N)组成 root
非根对象要通过"#key"访问,根对象可以省略"#key"
二、ValueStack
2.1 什么是值栈?
先进后出的数据结构,弹夹 push/pop
类似于作用域的方式用来存值和取值,在页面和后台之间进行数据传递。在Action中将数据存入值栈,然后在页面中通过EL表达式或OGNL表达式取值。
2.2 值栈的存储位置
值栈存储在Action对象中,每创建一个Action对象(ActionContext),就是创建一个ValueStack值栈对象,同一个Action对象中只会有一个ValueStack
2.3 在Action中值栈对象存取值
2.4 为什么要使用ValueStack作为根对象
ValueStack是一个容器,放入值栈中的对象都可视为根对象
三、ActionContext
3.1 ActionContext ac=ActionContext.getContext();
3.2 向ValueStack压栈
push(XxxAction) //HelloAction //1
push(ModelDriven.getModel()) //model不为null user //0
3.2.1 为什么ModelDriven返回实体和Action中属性重名,ModelDriven中优先级更高?
EL表达式由小到大:page->request->session->application
OGNL表达式由上往下:(值栈,先进后出的数据结构)
四、Struts2中数据传递
1)可以使用作用域,在页面上使用EL表达式获取作用域中key对应的value值
2)但更多的是利用ValueStack或ActionContext,在JSP页面通过OGNL表达式语言获取数据
流程与原理:
1.发送*.action请求(postman或浏览器)
2.由Struts2的核心过滤器接收*.action请求
3.strut是根据请求路径名找到对应的struts配置文件中的action配置
4.如果配置成功,则根据action标签中的name对应class属性反射机制实例化对象
注:Action对象是多例模式,每一次请求都会创建Action servlet是单例模式
5.创建Action的同时会创建一个ActionContext上下文对象
6.往ActionContext上线文对象中注入五个常用对象,并将ValueStack设置为根对象
request/session/application/valuestack/parameters
注:每一次请求都会创建ActionContext上下文,就是创建一个ValueStack值栈对象,同一个Action对象中只会有一个ValueStack。同义词请求只会创建一个ActionContext