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 等中的对象/值。

【讨论】:

这里有什么链接,因为我看不到这一点,但因此它应该是值堆栈中最顶层的元素,或者如果您正在使用迭代器并引用它的值,这意味着当迭代器通过value e=it 一次将每个单独的元素放在值堆栈的顶部,并且 %link 正在裁判该顶部堆栈值 对不起,我是这个网站的新手 我的意思是在我的程序中,我有一个名为地点的列表,我正在这样做! 这是工作,但我不知道为什么我要把这些东西放在那里!!我只是尝试他们都得到答案! 首先让你更好地了解 struts2 基本的请求处理是如何进入其中的,什么是值堆栈以及 OGNL 是如何在其中工作的,这将有助于你更好地理解。 这很好,因为为了理解你需要首先了解 Struts2 框架如何将对象推送到值堆栈中以及我们如何访问它【参考方案3】:

只是为了完成@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 标签中的 # 、 % 和 $ 符号有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

struts2标签中在jsp页面如何给值栈中的list和map赋值

ssh框架-Struts2

Struts2 FTL 标签和地图

struts 2中的Struts 1动作标签输入替换

二十Struts2中的UI标签

用struts2标签在jsp页面中取得list的第一个元素