76

我正在使用 Struts 2,当我访问ValueStack变量时,我不知道是否使用%or#$. 我尝试所有这些,直到找到正确的。

任何人都可以解释它们之间有什么区别吗?

4

3 回答 3

113

# 的使用(井号)

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>

于 2012-07-23T21:31:34.983 回答
10

该框架使用标准命名上下文来评估 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基础

基本上 struts2 将对象值 Stack 作为最顶层对象,并使用 OGNL 来引用它们。根对象可以在没有任何特殊“标记”的情况下被引用,或者用%井号 (#) 标记对其他对象的引用。# 基本上用于引用来自 Application/Session 等的对象/值。

于 2011-11-04T10:37:40.657 回答
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 中的混淆

带有 OGNL 的 Struts 2 动态消息

于 2015-09-08T04:25:03.817 回答