2

我有这个 JSP EL 表达式,它使用 >= 比较器。在我的开发环境中,我得到了您期望的结果,即 2 >= 188 是错误的。但是,在我的登台和生产服务器上,显然 2 >= 188 是正确的。

这是代码:

</ul>
<p>curPage: ${param.curPage}<br/>
totalPages: ${param.totalPages}<br/>
totalPages - curPage: ${param.totalPages - param.curPage}<br/>
curPage gt totalPages: ${param.curPage >= param.totalPages}<br/>
<p>

在我的开发环境中,我得到如下输出:

curPage: 2
totalPages: 68
totalPages - curPage: 66
curPage gt totalPages: false

在舞台上:

curPage: 2
totalPages: 181
totalPages - curPage: 179
curPage gt totalPages: true

我的开发环境运行的是 Tomcat 7.0.29,staging 运行的是 7.0.30。代码库是相同的。

上面的代码在一个文件“pagination.jsp”中(我知道,它应该是一个.tag),它包含在另一个jsp中,如下所示:

<jsp:include page="/widgets/pagination.jsp">
    <jsp:param name="totalPages" value="${actionBean.jbp.totalPages}" />
    <jsp:param name="baseUrl" value="${baseUrl}" />
    <jsp:param name="curPage" value="${not empty param.page?param.page:0}" />
</jsp:include>

“jbp.totalPages”定义为:

私人最终 int 总页数;

而“param.page”显然是一个页面参数。

我想这里可能存在类型转换问题,在参数和 int 之间,但这并不能解释为什么它在一台机器上工作而不是在另一台机器上工作。

另外,我认为 JSP EL 进行了自动类型转换。

任何想法将不胜感激。

4

2 回答 2

4

这些参数被评估为String而不是Number(因为这基本上是HttpServletRequest#getParameter()返回的)。的字符串值在"2"字典上比任何以 开头的字符串值“更大” "1"

您需要将它们解析为Number. 您可以为此使用JSTL 。 <fmt:parseNumber>

<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
...
<fmt:parseNumber var="curPage" value="${param.curPage}" integerOnly="true" />
<fmt:parseNumber var="totalPages" value="${param.totalPages}" integerOnly="true" />
... 
<p>
  curPage: ${curPage}<br/>
  totalPages: ${totalPages}<br/>
  totalPages - curPage: ${totalPages - curPage}<br/>
  curPage gt totalPages: ${curPage >= totalPages}<br/>
</p>

至于开发环境与生产环境的差异,这很可能是由于测试不好(不使用相同的测试数据甚至可能不使用相同的测试代码)造成的。在上述版本中,Tomcat 的 EL 实现没有任何类似的变化。只有当比较中的一手真的是 aNumber而另一手是 aString时,EL 才会强制Stringto Long。这可能是真实代码中正在发生的事情。

于 2012-12-18T19:04:43.850 回答
3

2 >= 188如果比较的项目是数字,则为 false。

2 >= 188如果比较的项目是字符串,则为真。

您的两个部署中有些不同。

查看 jstl.jar 和 standard.jar 的版本以及所有的 jar,也许在您的tomcat/lib目录中。也许您的代码是相同的,但依赖库中还有其他差异?不知何故,类型不同。JSP 中的差异影响类型推断的可能性不大,但也不超出可能性范围。

编辑

当问题对两个代码示例都使用 188(实际上是 181)时,这个问题得到了回答。在其中一个示例中,它已更改为 69 。现在一切都说得通了。

于 2012-12-18T19:01:45.990 回答