Struts 标记中的 # 、% 和 $符号有什么区别?

我正在使用 Struts 2,当我访问 ValueStack变量时,我不知道是否要使用 %#$。我都试过了,直到找到正确的。

他们之间的区别是什么?

48220 次浏览

框架使用标准的命名上下文来计算 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)

refer this for more details

以 OGNL 为基础

基本上,struts2把对象值堆栈作为最上面的对象,OGNL 用来引用 them.root 对象可以不用任何特殊的“标记”或者用 %来引用,而对其他对象的引用则用磅号(#)来标记。# 主要用于引用 Application/Session 等中的对象/值。

使用 # (磅号)

OGNL 用于以下方式引用 ActionContext 中的对象:

  • objectName: ValueStack 中的对象(OGNL 上下文中的默认/根对象) ,例如 Action 属性
  • #objectName: ActionContext 中但在 ValueStack 之外的对象,特别是..。
    • #objectName: ActionContext object that has been created using the Struts2 data tags with the default action scope (e.g., <s:set name="foo" value="'Testing'" />, referenced by <s:property value="#foo" />)
    • 请求参数
    • #request.objectName: 请求范围的属性
    • #session.objectName: 会话范围的属性
    • #application.objectName: 应用程序范围的属性
    • #attr.objectName: 页面、请求、会话或应用程序范围中的属性(按该顺序搜索)

上面的作用域映射引用(参数、请求、会话和应用程序)可以通过以下两种方式之一实现:

  • #scopeName.objectName
  • #scopeName['objectName']

Use of % (percent sign)

%{ OGNL expression }用于强制 OGNL 计算通常被解释为 String 文本的属性。

例子: <s:property value="myProperty" default="%{myDynamicDefaultValue}" />

使用@(at 标志)

@ 符号用于引用静态属性和方法。请注意,您可能需要在您的 Struts2属性 struts.ognl.allowStaticMethodAccess=true中启用此选项

例子:

@my.package.ClassName@MY_STATIC_PROPERTY
@my.package.ClassName@myStaticMethod

使用 $(美元符号)

Struts2OGNL 没有特别使用美元符号。但是,它可以用来计算普通的 JSTL 表达式。例如:

支柱2: <h1><s:property value="#pageTitle" /></h1>
(相当于...)
<h1>${pageTitle}</h1>

只是为了完成“ 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动态消息