一尘不染

了解Struts2中的OGNL表达式

jsp

以下代码显示<s:a>从1到10的Struts 链接。

<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(为2)与条件表达式匹配时`test=”%{#currentPage eq

row}”,它仅使用inside 显示文本,`而不显示链接。没关系。


当我使用这些相同的标签但在其相应的动作类中使用适当的属性时,

<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>

在这种情况下,currentPage(以及所有其他)是Long操作类中的type属性。这里,关于先前情况的条件测试test="%{#currentPage eq #row}"被评估为 false

它需要#之前的遗漏currentPage。因此,表达式变为test="%{currentPage eq #row}"(否则,它 始终
计算为false)。

我不明白为什么第一种情况要求test="%{#currentPage eq #row}"第二种情况要求`test=”%{currentPage eq

row}”`?我有什么想念的吗?


阅读 298

收藏
2020-06-10

共1个答案

一尘不染

<s:set>它不是一个值 值栈,而是 “价值栈语境”。

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

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

2020-06-10