1. ognl是什么?有何作用?
OGNL(Object-Graph Navigation Language)叫做对象导航图语言,是一种强大的表达式语言,比EL表达式功能更加强大。struts2将ognl表达式语言,集成当struts2框架中,作为它的默认表达式语言。
2. OGNL的功能有哪些?
<1>支持对象方法调用,如xxx.dosomeSpecial();
<2>支持类静态的方法调用和值访问
<3>访问OGNL上下文(OGNL context)和ActionContext; (重点 操作ValueStack值栈 )
<4>支持赋值操作和表达式串联
<5>操作集合对象。
//在struts2中应用演示ognl表达式
//需要结合struts2的标签使用<s:property value="ognl表达式">
<s:property value="'abc'.length()"/> 演示对象调用方法
<s:property value="@java.lang.Math@max(10,20)"/> 演示静态成员访问
注意:在struts2中使用静态成员访问,必须设置一个常量:struts.ognl.allowStaticMethodAccess=false
3. valueStack是什么?有什么用?
valueStack是值栈。
从技术角度来讲,valueStack就是一个接口com.opensymphony.xwork2.util.ValueStack。
从使用角度来讲,valueStack就是一个容器。
我们使用valueStack最大的作用就是将action相关的数据以及web相关对象,携带到页面上。简单讲,我们在使用struts2框架就是通过valueStack将action中的数据携带到jsp页面上进行展示。
我们来看下valueStack的一些特点:
<1>valueStack有一个实现类叫OgnlValueStack。
<2>每一个action都有一个valueStack。(一个请求,一个request,一个action,一个valueStack)valueStack的生命周期就是request的生命周期。
<3>valueStack中存储了当前action对象以及其他常用web对象(request、session、application、parameters)。
<4>struts2框架将valueStack以“struts.valueStack”为名存储到request域中。
4. valueStack的结构
//valueStack中存在 存在root属性 (CompoundRoot) 、 context 属性 (OgnlContext )
* CompoundRoot 就是ArrayList
* OgnlContext 就是 Map
list集合中存储的是action相关信息
map集合中存储的是相关映射信息,包含paramters,request,session,application attr等。
我们想要从list中获取数据,可以不使用#号.(暗指它就是ognl的root)
如果从map中获取数据,需要使用#. (其实在struts2中的map--context其实就是ognlContext)
结论:
ValueStack它有两部分 List Map
在struts2中List就是root Map就是ognlContext.
默认情况下,在struts2中从valueStack获取数据从root中获取。
5. 值栈对象的创建,valueStack和ActionContext是什么关系?
ActionContext ctx = ActionContext.getContext();
if (ctx != null) {
stack = ctx.getValueStack();
}
valueStack是每一次请求时,都会创建.
在ActionContext中持有了valueStack的引用。
6. 如何获取值栈对象?
对于valueStack获取有两种方式:
<1>通过 request获取
ValueStack vs=(ValueStack) ServletActionContext.getRequest().getAttribute(
ServletActionContext.STRUTS_VALUESTACK_KEY);
<2>通过ActionContext获取.
ValueStack vs=ActionContext.getContext().getValueStack();
7. 针对于root,怎样向值栈中保存数据?
主要有两个方法:
<1>push(Object obj)——->底层就是 root.add(0,obj) 将数据存储到栈顶。
<2>set(String name,Object obj);—–>底层是将数据封装到HashMap中,在将这个HashMap通过push存储。
在JS[页面中可以通过<s:debug>来查看值栈的内容。
8. 如何在JSP页面中获取值栈的内容?
root中数据不需要#,而context中数据需要#
<1>.如果栈顶是一个Map集合,获取时,可以直接通过Map集合的key来获取value
<s:property value="username"/>
<2>如果栈顶数据不是一个Map,没有key值,可以使用序号来获取。
<s:property value="[0]"> 从0的位置向下查找所有。
<s:property value="[0].top"> 只查找0位置上数据。
如果获取OgnlContext中数据:
1.request数据 request.setAttribute()
2.session数据 session.setAttribute()
3.application数据 application.setAttribute()
4.attr 依次从request,session.application中查找
5.parameters 获取请求参数