我正在使用Struts2,当我访问值堆栈变量时,我不知道是使用%
还是#
还是$
。我尝试了所有这些,直到找到正确的。
任何人都可以解释这些之间的区别吗?
答案 0 :(得分:107)
使用#(井号)
OGNL用于引用ActionContext中的对象,如下所示:
objectName
:ValueStack中的对象(OGNL上下文中的默认/根对象),例如Action属性#objectName
:ActionContext中的对象,但在ValueStack之外,具体而言......
#objectName
:使用带有默认操作范围的Struts2数据标记创建的ActionContext对象(例如,<s:set name="foo" value="'Testing'" />
引用的<s:property value="#foo" />
)#parameters.objectName
:请求参数#request.objectName
:请求范围的属性#session.objectName
:会话范围属性#application.objectName
:应用程序范围的属性#attr.objectName
:页面,请求,会话或应用程序范围中的属性(按该顺序搜索)上面的作用域地图引用(参数,请求,会话和应用程序)可以采用以下两种方式之一:
#scopeName.objectName
或#scopeName['objectName']
使用%(百分号)
%{ OGNL expression }
用于强制OGNL评估通常被解释为字符串文字的属性。
示例:<s:property value="myProperty" default="%{myDynamicDefaultValue}" />
使用@(在标志处)
@符号用于引用静态属性和方法。请注意,您可能需要在Struts2属性中启用此功能:struts.ognl.allowStaticMethodAccess=true
示例:
@my.package.ClassName@MY_STATIC_PROPERTY
@my.package.ClassName@myStaticMethod
使用$(美元符号)
Struts2 OGNL没有特别使用美元符号。但是,它可用于评估正常的JSTL表达式。例如:
Struts2:<h1><s:property value="#pageTitle" /></h1>
(相当于......)
JSTL:<h1>${pageTitle}</h1>
答案 1 :(得分:9)
框架使用标准命名上下文来评估OGNL表达式。处理OGNL的顶级对象是Map(通常称为上下文映射或上下文)。 OGNL有一个概念,即在上下文中有一个根(或默认)对象。在表达式中,可以引用根对象的属性,而无需任何特殊的标记&#34;概念。对其他对象的引用标有井号(#)。
框架将OGNL上下文设置为我们的ActionContext,将值堆栈设置为OGNL根对象。 (值堆栈是一组多个对象,但对于OGNL,它似乎是单个对象。)除了值堆栈,框架还将其他对象放在ActionContext中,包括表示应用程序,会话和请求上下文的映射。这些对象在ActionContext中与值堆栈(我们的OGNL根)一起共存。
|
|--application
|
|--session
context map---|
|--value stack(root)
|
|--request
|
|--parameters
|
|--attr (searches page, request, session, then application scopes)
请参阅此内容以获取更多详情
基本上struts2把对象值Stack作为最顶层的对象,OGNL用于引用它们。引用对象可以在没有任何特殊的&#34;标记&#34;或者使用%
,而对其他对象的引用标有井号(#)。 #主要用于从Application / Session等引用对象/值。
答案 2 :(得分:0)
刚刚完成@Devon Biere ......
使用$(美元符号)
您也可以在资源文件中使用${}
。 struts将自动使用OGNL来解析${}
。例如
sample.foo.bar=This is some ${someProperty} //If the someProperty is in valueStack
sample.welcome.message=Welcome dear ${#session.CurrentUser.farsiFirstName}
请注意这里的$
符号只是一个触发器,要求struts根据OGNL评估字符串,请不要将其与JSTL中的${}
混淆