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

猜你喜欢

转载自blog.csdn.net/qq_47906421/article/details/107554983