上图为OGNL Context的当struts2接受一个请求时,会迅速创建ActionContext,ValueStack,action。然后把action压入到栈中。所以action的实例变量可以被ognl访问。所以利用ognl表达式可以访问action。ActionContext
从上面的代码中可以看出来,struts2中的ActionContext的作用是提供了对ognl数
据的操作。并且可以通过ActionContext获取到经过struts2封装了的session等参数。
ServletActionContext
可以通过ServletActionContext得到servlet中的一些类,比如HttpServletRequest,ServletContext等可以通过ServletActionContext返回ActionContextOgnl表达式
1.#号用法
访问OGNL上下文和action上下文,#相当于ActionContext.getContext();如果访问的是map中的而不是对象栈中的,由于map中的数据不是根对象,所以在访问时需要添加#前缀。
名称
作用
例子
parameters
包含当前HTTP请求的Map
#parameters.id[0]=request.getParameter(“id”)
request
包含当前HttpServletRequest属性的Map
#request.username=request.getAttribute(“username”);
session
包含当前HttpSession属性的Map
#session.username=session.getAttribute(“username”);
application
包含当前ServletContext属性的Map
#application.username=application.getAttribute(“username”);
attr
用于按照request>session>application顺序访问其属性
#attr.username相当于按照顺序在以上三个范围内读取username的属性,直到找到为止。
注:也可以写为#request[‘username’] #sesssion[‘username’] #application[‘username’]
主要步骤:
在action中
在页面中
2.用法2
OGNL会设定一个对象(root对象),在struts2中根对象就是CompoundRoot,或者为OgnlValueStack中的root,通常被叫做ValueStack(栈或者对象栈),如果要访问根对象的属性,则可以省略去#,直接访问对象的属性即可。ognl表达式
在action中
在页面中
3.用法3(深入理解对象栈)
有三个类:Person.java,Student.java,OgnlAction.java
Person类Student类OgnlAction类把Person类和Student类创建出对象,然后放入到对象栈中,代码为:
从以前学过的OGNLContext结构可以看出,对象栈中的分布如图所示:
但是大家注意一个现象:在student对象中有comment属性,在person对象中
也有comment属性,在OgnlAction中还有comment属性,如果页面输出
Comment属性应该选择哪种呢?
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-32635-2.html
期待烊烊
也就是看是否属于无害通过