struts2第2节课:ongl和ValueStack

struts2第2节课:ongl和ValueStack

一、OGNL
1、简介: OGNL的全称是Object Graph Navigation Language(对象图导航语言),它是一种强大的表达式语言
2、优势:
①支持对象方法调用
②支持类静态的方法调用和值访问,表达式的格式为@[类全名(包括包路径)]@[方法名 | 值名]
③支持赋值操作和表达式串联
④访问OGNL上下文(OGNL context)和ActionContext
⑤操作集合对象
⑥可以直接new一个对象
3、功能:
①可以存取对象的任意属性
②调用对象的方法
③便历整个对象的结果图
④实现字段类型转化
4、用途:
①访问OGNL上下文和Action上下文,#相当于ActionContext.getContext();
②用于过滤和投影(projecting)集合
③构造Map
5、表达式:
①基本对象树的访问(通过使用点号将对象的引用串联起来进行)
②对容器变量的访问(通过#符号加上表达式进行)
③使用操作符号(使用的操作符基本跟Java里的操作符一样,除了能使用 +, -, *, /, ++, --, ==, !=, = 等操作符之外,还能使用 mod, in, not in等)
④容器、数组、对象OGNL支持对数组和ArrayList等容器的顺序访问
例如:group.users[0]
同时,OGNL支持对Map的按键值查找
例如:#session[‘mySessionPropKey’]
不仅如此,OGNL还支持容器的构造的表达式:
例如:{“green”, “red”, “blue”}构造一个List,#{“key1” :“value1”, “key2” : “value2”, “key3” : “value3”}构造一个Map
你也可以通过任意类对象的构造函数进行对象新建:
例如:new Java.net.URL(“xxxxxx/”)
⑤对静态方法或变量的访问要引用类的静态方法和字段,他们的表达方式是一样的@class@member或者@class@method(args)
⑥方法调用(直接通过类似Java的方法调用方式进行,你甚至可以传递参数:)
例如:user.getName(),group.users.size(),group.containsUser(#requestUser)
⑦投影和选择(OGNL支持类似数据库中的投影(projection) 和选择(selection))
说明:
(1)投影就是选出集合中每个元素的相同属性组成新的集合,类似于关系数据库的字段操作。投影操作语法为 collection.{XXX},其中XXX 是这个集合中每个元素的公共属性。
(2)选择就是过滤满足selection 条件的集合元素,类似于关系数据库的纪录操作。选择操作的语法为:collection.{X YYY},其中X 是一个选择操作符,后面则是选择用的逻辑表达式。而选择操 (3)作符有三种:
《1》? 选择满足条件的所有元素
《2》^ 选择满足条件的第一个元素
《3》$ 选择满足条件的最后一个元素
6、关键:OgnlContext(ongl上下文) ==Map (教室、老师、学生)
说明:① OgnlContext=根对象(1)+非根对象(N)
非根对象要通过"#key"访问,根对象可以省略"#key"
②context:英文原意上下文,环境/容器
③【根对象有且只有一个 非根对象可有多个】

7、重点1:
	①一个上下文中只有一个根对象

	②取跟对象的值,只需要直接通过根对象属性即可

	③非根对象取值必须通过指定的上下文容器中的#key.属性去取。

8、重点2:
	①ActionContext一次请求创建一次

	②值栈取值从上往下,取到为止,如果已经拿到,不再往下找。

二、 ValueStack
1、 值栈
先进后出的数据结构,弹夹 push/pop
2、为什么要使用ValueStack作为根对象
放到值栈中的对象都可视为根对象

三、补充

1、四大作用域:(从小到大)

	page -> request -> session -> application

2、伪代码:(*.action)
	①ActionContext

	  《1》保证同一请求中只创建一个上下文

		ActionContext ac = ActionContext.getContext();

	  《2》向ValueStack压栈
			
			说明:栈:表示一个先进后出的数据结构

		 push(XxxAction)//helloAction

 			 push(ModelDirver.getModel())//model不为null user

	  《3》压action代码详解(参数名==OGNL表达式)

		 Map<String,String[]> map = request.getParamterMap();

		 {"userName":"aaa","uname":"bbb","upwd":"ccc","age":"22"} 

3、struts2中传递数据: 可以使用作用域,但更多的是利用ValueStack或ActionContext

猜你喜欢

转载自blog.csdn.net/weixin_43163062/article/details/83001378