OGNL概述:
OGNL是一种表达式,Struts2默认的表达式语言就是OGNL,该表达式功能更加强大。它具有一下特点:
》支持对象方法调用。例:obj.methodName();
》支持类静态方法调用和值访问,表达式的格式:@[类全名(包括包路径)]@[方法名|值名] 例:@java.lang.String@format("foo%","bar");
》支持赋值操作和表达式串联。
》访问OGNL上下文(OGNL context)和ActionContext 。
》操作集合对象。
OGNL的主要用途:
》在Struts2中操作值栈数据。
》一般把OGNL放在Struts2中操作:和Struts2标签一起使用来操作值栈。OGNL不是Struts2的一部分。它是一个单独的项目,只是经常和Struts2一起使用。
使用OGNL时,首先导入jar包,该jar包在Struts2中提供。
OGNL入门案例:使用ognl+struts2标签计算字符串长度
<%@taglib prefix="s" uri="/struts-tags"%> <body> <s:property value="'计算的字符串'.length()"> </body>
什么时值栈:
在Struts2中提供本身的一种存储机制,该机制类似于域对象就是值栈,可以存值和取值。在action中把数据放到值栈中,在页面中获取值栈数据。
servlet和action的区别:
servlet:默认在第一次访问时创建,创建一次。单实例对象。
action:访问时创建,每次访问action时都会创建action对象,创建多次。多实例对象。
值栈存储位置:
》每次访问action时,都会创建action对象。
》在每个action对象中都会有一个值栈对象。
如何获取值栈对象:
获取值栈对象,使用ActionContext类中的方法获取值栈对象。ValueStack stack = ActionContext.getContext().getValueStack();每个action对象中只有一个值栈对象。
值栈内部结构:
所谓栈,就是数据结构中的一种结构。先进后出。值栈分为俩部分:root、context
root:结构是list集合。一般操作都是root中的数据。
context:结构是Map集合。存储的是对象引用。存储的key的值都是固定的,value是对应的对象引用。key值有:
request:对应的value值是request对应引用。
session:HttpSession对象引用。
application:ServletContext对象引用。
parameters:传递相关的参数。
attr:三个域对象,向三个域对象放值,名称都相同。setAttribute("name",value);使用attr操作,获取域对象中的值,获取的是域范围最小中的值。
向值栈放数据:结构时Map集合。
s:debug标签:使用该标签可以查看值栈结构和存储值。
》访问action,执行action中的方法有返回值,配置返回值到jsp页面中。
》在action没有做任何操作时,栈顶元素时action引用。
》action对象中有值栈对象,值栈对象中有action引用。
向值栈放数据:
ActionContext context=ActionContext.getContext();
ValueStack stack=context.getValueStack();
》获取值栈对象,调用值栈对象中的set方法。
stack.set("key",value);//放进去的数据是一个HashMap
》获取值栈对象,调用值栈对象中的push方法。
stack.push(value);//放进去的数据是一个String
》在action定义变量,生成变量的get方法。该方式存放的值的位置在action中,不需要重新分配内存空间。比较节约资源。
从值栈获取数据:
使用struts2标签+ognl表达式获取值栈数据。
<s:property value="ognl表达式" />
s:iterator标签使用:遍历值栈的list集合。
<s:iterator value="list"> <a:property value="属性名称"/> <s:iterator> <!-- 或
遍历值栈list集合,得到每个user对象。
机制:把每次遍历出来的user对象放到context对象中。
获取context中的数据:需要在ognl表达式前加#号。
--> <s:iterator value="list" var="user"> <a:property value="#user.属性名称"/> <s:iterator>
其他操作:
使用set方法向值栈放数据。获取:
<a:property value="set的key" />
使用push方法向值栈放数据。获取:
》使用push方法设置值,没有名称,只有设置的值。
》向值栈放数据,把向值栈放的数据存到数组中,数组名称为:top,根据数组来获取值。
<s:property value="[0].top">
EL表达式获取值栈数据:
1、EL表达式获取域对象的值。
2、向域对象中放值需要使用setAttribute方法,获取值需要使用getAttribute方法。
3、底层增强request对象中的方法getAttribute方法。增强过程:
》首先从request域中获取值,如果获取到,直接返回。
》如果从request域获取不到值,到值栈中把值获取出来,把值放到域对象中。
OGNL表达式#、%的使用:
#:使用#+ognl表达式获取context中的数据。
%:在struts2标签中的表单标签中使用。在struts2标签中使用ognl表达式,若直接在struts2表单标签中使用ognl表达式,则不能识别。只有使用%之后才会识别。
%{ognl表达式}