GNL有一个上下文概念,说白了上下文就是一个MAP结构,他实现了java.Uits.Map接口,在Struts2上下文的实现为ActionContext。
Struts2中的OGNL Context实现着为ActionContext:
当Struts2接受一个请求时,会创建ActionContext,ValueStack,action。然后把action存放进ValueStack,所以action的实例变量可以被OGNL访问。
在root变量中处于第一位的对象叫做栈对象,通常我们在OGNL表达式里直接写上属性的名称即可访问root变量里对象的属性,搜索顺序从栈顶对象开始寻找,如果站定对象不存在该属性,就会从第二个对象寻找,如过没有找到就从第三个对象寻找,依次往下访问,直到找到为止。
大家注意:struts2中,OGNL表达式需要配合Struts标签才可以使用。如<s:property value=”name”/>
由于ValueStack(值栈)是Struts2中OGNL的根对象,如果用户需要访问值栈中的对象,JSP页面可以直接通过下面的EL表达式访问ValueStack(值栈)中对象的属性:
$(foo)//获取值栈某个对象的foo属性
如果访问其他Context中的对象,由于他们不是根对象,所以在访问时,需要添加#前缀。
Application对象:用于访问ServletContext,例如#application.userName或者#application[‘userName’],相当于调用ServletContext的getAttibute(“usernmae”)。
Session对象:用来访问HttpSession,例如#session.ueserName或者#session[‘userName’],相当于调用session.getAttribute(“userName”);
Requsert对象:用来访问HttpServletRequset属性(attibute)的Map,例如#requset.userName或者#requset[‘userName’],相当于调用request.getParameter
(“username”).
Parpameters对象:用于访问HTTP的请求参数,例如#Parameters.userName或者#parameters[‘userName’],相当于调用requset. getParameter(“username”).
Attr对象:用于按page->request->session->applicaton顺序访问其属性