Struts 标签中的 # 、 % 和 $ 符号有啥区别?
Posted
技术标签:
【中文标题】Struts 标签中的 # 、 % 和 $ 符号有啥区别?【英文标题】:What's the difference between # , % and $ signs in Struts tags?Struts 标签中的 # 、 % 和 $ 符号有什么区别? 【发布时间】:2011-12-21 21:54:44 【问题描述】:我正在使用 Struts 2,当我访问 ValueStack
变量时,我不知道是使用 %
还是 #
还是 $
。我尝试了所有方法,直到找到正确的方法。
谁能解释一下它们之间有什么区别?
【问题讨论】:
【参考方案1】:#(井号)的使用
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" />
@(at 符号)的使用
@ 符号用于引用静态属性和方法。请注意,您可能需要在 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>
【讨论】:
关于 $ 请注意<s:property>
是 xss 黑客安全的,而 $
不是。小心使用$
!
没错,as we discussed in your Q&A,我正在链接,因为它可能对未来的读者有用
不要指望allowStaticMethodAccess
它很快就会从struts框架中删除***.com/questions/28018861/…【参考方案2】:
框架使用标准命名上下文来评估 OGNL 表达式。处理 OGNL 的***对象是 Map(通常称为上下文映射或上下文)。 OGNL 有一个概念,即在上下文中有一个根(或默认)对象。在表达式中,可以引用根对象的属性而无需任何特殊的“标记”概念。对其他对象的引用用井号 (#) 标记。
框架将 OGNL 上下文设置为我们的 ActionContext,并将值堆栈设置为 OGNL 根对象。 (值栈是几个对象的集合,但对 OGNL 来说,它似乎是一个对象。)除了值栈,框架还将其他对象放在 ActionContext 中,包括表示应用程序、会话和请求上下文的 Maps。这些对象与值堆栈(我们的 OGNL 根)共存于 ActionContext 中。
|
|--application
|
|--session
context map---|
|--value stack(root)
|
|--request
|
|--parameters
|
|--attr (searches page, request, session, then application scopes)
更多详情请参考这里
OGNL basis
基本上struts2将对象值堆栈作为最顶层的对象,并使用OGNL来引用它们。根对象可以在没有任何特殊“标记”或%
的情况下引用,而对其他对象的引用用井号标记(# )。 # 主要用于引用 Application/Session 等中的对象/值。
【讨论】:
只是为了完成@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 中的$
混淆
Struts 2 Dynamic message with OGNL
【讨论】:
以上是关于Struts 标签中的 # 、 % 和 $ 符号有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章