Jsp 理解Struts2中的OGNL表达式
下面的代码使用Struts的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
显示从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}”
?有什么我可能遗漏的吗?当您
一个值时,它不在值堆栈上,而是在“值堆栈上下文”中
使用barecurrentPage
引用仅搜索实际堆栈,而不是上下文
使用#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>