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


74

我正在使用Struts2,当我访问值堆栈变量时,我不知道是否使用%#$。我尝试所有这些,直到找到正确的。

谁能解释一下两者之间的区别是什么?

Answers:


111

使用#(井号)

OGNL用于在ActionContext中引用对象,如下所示:

  • objectName:ValueStack中的对象(OGNL上下文中的默认/根对象),例如Action属性
  • #objectName:对象在ActionContext中,但在ValueStack之外,特别是...
    • #objectName:已使用Struts2数据标签以及默认操作范围(例如,<s:set name="foo" value="'Testing'" />由引用的<s:property value="#foo" />)创建的ActionContext对象
    • #parameters.objectName:请求参数
    • #request.objectName:请求范围的属性
    • #session.objectName:会话范围的属性
    • #application.objectName:应用程序范围的属性
    • #attr.objectName:页面,请求,会话或应用程序范围中的属性(按此顺序搜索)

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

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

使用%(百分号)

%{ OGNL expression } 用于强制对通常会解释为String文字的属性进行OGNL评估。

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

@的使用(在符号处)

@符号用于引用静态属性和方法。请注意,您可能需要在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>


7
关于$请注意,<s:property>xss hack是安全的,而${}不是。${}小心使用!
Alireza Fattahi 2014年

确实,正如我们在您的问答中所讨论的,我之所以联系是因为它可能对将来的读者有用
Andrea Ligios 2015年

做不能指望allowStaticMethodAccess它会从Struts框架中移除很快stackoverflow.com/questions/28018861/...
阿里Fattahi

10

该框架使用标准命名上下文来评估OGNL表达式。处理OGNL的顶级对象是一个Map(通常称为上下文映射或上下文)。OGNL的概念是上下文中存在根(或默认)对象。在表达式中,无需任何特殊的“标记”概念即可引用根对象的属性。对其他对象的引用用井号(#)标记。

该框架将OGNL上下文设置为我们的ActionContext,并将值堆栈设置为OGNL根对象。(值堆栈是一组多个对象,但对OGNL来说,它似乎是一个对象。)与值堆栈一起,框架还将其他对象放在ActionContext中,包括表示应用程序,会话和请求上下文的Map。这些对象与值堆栈(我们的OGNL根目录)一起并存于ActionContext中。

                 |
                 |--application
                 |
                 |--session
   context map---|
                 |--value stack(root)
                 |
                 |--request
                 |
                 |--parameters
                 |
                 |--attr (searches page, request, session, then application scopes)

详情请参阅

OGNL基础

基本上struts2将对象值Stack作为最主要的对象,并使用OGNL来引用它们。可以在没有任何特殊“标记”的情况下引用root对象,%而对其他对象的引用则用井号(#)进行标记。#基本上用于引用Application / Session等中的对象/值。


<s:iterator value =“ places” status =“ portStatus2”> <tr> <td> <s:a href =“#” onclick =“ javascript:window.open('%{link}');”> < s:property value =“ name” /> </ s:a> </ td> </ tr> </ s:iterator>
Khashayar 2011年

什么链接在这里,因为我看不到,所以相应地它应该是值堆栈中最上面的元素,或者如果您正在使用迭代器并引用其值,则意味着当迭代器遍历值e = it时放置每个单独的元素一次位于价值堆栈顶部,%{link}表示该顶部堆栈值
Umesh Awasthi 2011年

抱歉,我是本网站的新手,我的意思是在我的程序中我有一个名为“地方”的列表,我正在这样做!<s:迭代器value =“ l” status =“ portStatus”> <s:if test =“%{#portStatus.count == page + 1}”> <tr> <td rowspan =“ 11” width =“ 50 %“ align =” right“> <img src =” $ {imagePath}“ alt =”徽标“ /> </ td> </ tr> <tr> <td> <s:a href =”#“ onclick = “ javascript:window.open('%{link}');”> <s:属性值=“ name” /> </ s:a> </ td> </ tr> </ s:iterator>工作,但我不知道为什么我要把这些东西放在那里!我只是尝试他们所有人来获得答案!
Khashayar

首先,您可以更好地了解struts2基本知识,即请求处理如何进入值堆栈以及OGNL在其中的工作方式,这将有助于您更好地理解。
Umesh Awasthi,2011年

很好,因为要了解您需要首先了解Struts2框架如何将对象推入值堆栈中以及我们如何访问该对象
Umesh Awasthi 2011年

0

只是为了完成@Devon Biere ...

$的使用(美元符号)

您也可以${}在资源文件中使用。支撑杆将自动使用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动态消息

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.