【问题标题】:What's the difference between # , % and $ signs in Struts tags?Struts 标签中的 # 、 % 和 $ 符号有什么区别?
【发布时间】:2011-12-21 21:54:44
【问题描述】:

我正在使用 Struts 2,当我访问 ValueStack 变量时,我不知道是使用 % 还是 # 还是 $。我尝试了所有方法,直到找到正确的方法。

谁能解释一下它们之间有什么区别?

【问题讨论】:

    标签: java jsp struts2 expression ognl


    【解决方案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>

    【讨论】:

    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 2021-12-22
      相关资源
      最近更新 更多