以下代码显示<s:a>从1到10的Struts 链接。
<s:a>
<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
currentPage
,它仅使用
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 。
Long
test="%{#currentPage eq #row}"
它需要#之前的遗漏currentPage。因此,表达式变为test="%{currentPage eq #row}"(否则,它 始终 计算为false)。
#
test="%{currentPage eq #row}"
我不明白为什么第一种情况要求test="%{#currentPage eq #row}"第二种情况要求`test=”%{currentPage eq
当<s:set>它不是一个值 就 值栈,而是 在 “价值栈语境”。
<s:set>
使用裸currentPage引用仅搜索实际 堆栈 ,而不搜索上下文。
使用#currentPage不会检查堆栈本身,而是引用堆栈 上下文 。
#currentPage