与EL表达式类似,之所以能取到值,是因为OGNL把内置对象存在了值栈里。
#号
#号相当于ActionContext.getContext()
因为context中的对象不是root对象,所以访问前面要加#
对象 | 内容 | 案例 |
parameters | 包含封装了请求参数的Map | #parameters[0]相当于request.getParameter("id") |
request | 包含HttpServletRequest属性的Map | #request.name相当于request.getAttribute("name") |
session | 包含HttpSession属性的Map | #session.name相当于session.getAttribute("name") |
application | 包含ServletContext属性的Map | #application.name相当于application.getAttribute("name") |
attr | 按request>session>application顺序访问attribute | #attr.name相当于从几个域中按顺序获取name值 |
也可以写成 #request["name"] 其他同理可推
访问root对象中的值的方法:
Action中的代码:
ValueStack vs = ServletActionContext.getContext().getValueStack();
vs.set("name","张三");
JSP页面中的代码:
姓名:<s:property value="name"/>
第二种方法存在一定问题,如多个实体类中有相同属性,如Person中有name,Employee中也有name,如果使用<s:property value=”name”/>这个方法,它就会从对象栈中从上往下搜索第一个name的值
%号
这里有两种情况:
%{ognl表达式} 表示这里面是ognl表达式,这样环境就不会认为它是字符串
%{'字符串'} 这里括号里的字符串有引号引起来,就表示是字符串,不是表达式
如:
<s:textfield name="name" label="%{#request.name}"/>
$号
主要有两个作用:
在国际化文件中引用OGNL表达式
在Struts2配置文件中使用OGNL表达式
比如:
Action中的代码:
ServletActionContext.getRequest.setAttribute("name","Jack");
struts.xml文件中的代码:
<package name="ognl" namespace="/ognl" extends="struts-default">
<action name="userAction" class="edu.nustti.UserAction" method="{1}">
<result name="ognl">/ognl/ognl.jsp?name=${#request.name}</result>
</action>
</package>