Jsp 理解Struts2中的OGNL表达式

Jsp 理解Struts2中的OGNL表达式,jsp,struts2,ognl,valuestack,Jsp,Struts2,Ognl,Valuestack,下面的代码使用Struts的显示从1到10的链接 <s:set var="currentPage" value="2"/> <s:set var="begin" value="1"/> <s:set var="end" value="10"/> <s:iterator begin="%{begin}" end="%{end}" step="1" var="row" status="loop"> <s:if test="%{#curr

下面的代码使用Struts的
显示从1到10的链接

<s:set var="currentPage" value="2"/>
<s:set var="begin" value="1"/>
<s:set var="end" value="10"/>

<s:iterator begin="%{begin}" end="%{end}" step="1" var="row" status="loop">
    <s:if test="%{#currentPage eq #row}">    <!--???-->
        <span><s:property value="%{#row}"/></span>
    </s:if>

    <s:else>
        <s:url id="pageURL" action="someAction" escapeAmp="false">
            <s:param name="currentPage" value="%{row}"/>
        </s:url>

        <s:a href="%{pageURL}" name="btnPage" cssClass="paging">
            <s:property value="%{#row}"/>
        </s:a>
    </s:else>
</s:iterator>
在这种情况下,
currentPage
(以及所有其他)是action类中类型为
Long
的属性。这里,关于前一种情况的条件测试
test=“%{currentPage eq#row}”
被评估为false

它要求在
当前页面
之前省略
#
。因此,表达式变为
test=“%{currentPage eq#row}”
(否则,它的计算结果始终为false)

我不明白为什么第一种情况需要
test=“%{currentPage eq#row}”
,而第二种情况需要
test=“%{currentPage eq#row}”
?有什么我可能遗漏的吗?

当您
一个值时,它不在值堆栈上,而是在“值堆栈上下文”中

使用bare
currentPage
引用仅搜索实际堆栈,而不是上下文

使用
#currentPage
不会检查堆栈本身,而是引用堆栈上下文

请参见以下其他答案:


  • 是否所有动作对象/变量都存储在
    ActionContext
    下的值堆栈中?@Tiny一旦点击视图层,动作本身(通常)位于堆栈顶部,尽管您可以将自己的值放在堆栈顶部,例如。,使用
    等。
    使用bare currentPage引用仅搜索实际堆栈,而不是堆栈上下文的值
    不正确。
    <s:iterator begin="%{begin}" end="%{end}" step="1" var="row" status="loop">
        <s:if test="%{currentPage eq #row}">   <!--???-->
            <span class="current"><s:property value="%{#row}"/></span>
        </s:if>
    
        <s:else>
            <s:url id="pageURL" action="someAction" escapeAmp="false">
                <s:param name="currentPage" value="%{row}"/>
            </s:url>
    
            <s:a href="%{pageURL}" name="btnPage" cssClass="paging">
                <s:property value="%{#row}"/>
            </s:a>
        </s:else>
    </s:iterator>