【问题标题】:Why does EL >= sometimes give wrong results?为什么 EL >= 有时会给出错误的结果?
【发布时间】:2012-12-06 01:13:59
【问题描述】:

我有这个 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”定义为:

private final int totalPages;

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

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

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

任何想法都将不胜感激。

【问题讨论】:

  • curPagetotalPages是什么类型?
  • 你的问题完成了吗?您的倒数第二句以“除外”结尾。除了什么?你让我们悬而未决。除了Tomcat的版本,你的意思是一样的?
  • 对不起,除了,我不确定我在想什么,我删除了它。
  • @Dancrumb,我仔细检查过,两者都是整数,我会更详细地扩展这个问题
  • ${param} 值绝对不会返回 int。它指的是Map&lt;String, String&gt;

标签: java jsp tomcat el


【解决方案1】:

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

您需要将它们解析为Number。您可以为此使用JSTL&lt;fmt:parseNumber&gt;

<%@ 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 实现没有任何类似的变化。只有当比较中的一手牌真的Number 而另一手是String 时,EL 才会将String 强制转换为Long。这可能是真实代码中正在发生的事情。

【讨论】:

  • 这是有道理的,唯一令人困惑的是,如果它们是字符串,如何计算 totalPages - curPage: 179。 EL 中是否有任何东西可以解析为整数,因为使用了 - 运算符。
  • 这可能是正确的答案。我只是仔细检查了我的登台和开发环境,开发有 69 页,而登台有 182 页。所以按字典顺序,3 > 69,但 3
  • 请注意,您不需要将其应用于已经返回 Number 的 bean 属性(例如 IntegerLong 等或等效原语)。仅限${param}
  • @BalusC,是的,这是有道理的。我已经确认这是问题所在,并将您的答案标记为正确。再次感谢。
【解决方案2】:

如果比较的项目是数字,2 &gt;= 188 为 false。

如果比较的项目是字符串,2 &gt;= 188 为真。

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

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

编辑

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

【讨论】:

  • 抱歉误导了,你的回答还是准确的,所以我投了赞成票。
猜你喜欢
  • 2018-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多