当前位置: 移动技术网 > IT编程>开发语言>Java > 解析Tomcat 6、7在EL表达式解析时存在的一个Bug

解析Tomcat 6、7在EL表达式解析时存在的一个Bug

2019年07月22日  | 移动技术网IT编程  | 我要评论

好想好想伴奏,兰州军区参谋长,快乐大本营游戏

今天在做数据分页显示的时候遇到了一个问题,经过测试,证实是tomcat 6的一个bug,我所用的版本为:apache-tomcat-6.0.36,和7.0.30均能复现。下面详细描述一下这个bug:

该bug是在jstl<c:foreach>标签中发现的,后来分析是el表达式实现时产生的问题。jsp页面中有一个list需要遍历,这个list的类型为arraylist<string>,我在其中放置的数据为(为方便我写成数组的形式):["1","...","4","5","6","7","8","...","10"],这是一个很常见的带页码缩略的分页导航。在展示这些数据的时候我使用了下面的代码:

复制代码 代码如下:

<c:foreach var="looper" items="${pagehelper.pagelist}">
 <c:choose>
  <c:when test="${looper eq pagehelper.pagedot}">
  <p>分页游标的 点点点</p>
  </c:when>
  <c:when test="${looper eq pagehelper.pageno}">
  <p>当前页为第${looper}页面</p>
  </c:when>
  <c:otherwise>
  <p>分页游标:${looper}</p>
  </c:otherwise>
 </c:choose>
</c:foreach>

这里pagehelper就是分页组件,其中预设了pagedot为"...",pageno为当前的页码(假设为6),其他情况直接显示分页游标。在循环遍历中只不过使用了最基本的条件判断语句,由于pagelist在定义中已经明确指出是list<string>,按逻辑应该eq是按照字符串判断的,但是居然出异常了:
复制代码 代码如下:

javax.el.elexception: cannot convert ... of type class java.lang.string to class java.lang.long

为什么会出现“类型转换错误”呢?通过分析代码走向,当进入循环后,list中的第一条数据是“1”,而pagehelper.pageno为long型,此时tomcat的el表达式解析器会把looper类型转换为long型而不是把pagehelper.pageno类型转换为string进行比较,当遍历到下一元素时,looper="...",这时looper的类型已经确定,比较的时候tomcat还要试图将looper转换为long类型,于是就出错了。

为此我专门写了一个实例代码:

复制代码 代码如下:

<c:foreach var="looper" items="${pagehelper.pagelist}">
 <c:choose>
  <c:when test="${looper eq fn:trim(pagehelper.pagedot)}">
  <p>分页游标的 点点点</p>
  </c:when>
  <c:when test="${looper eq fn:trim(pagehelper.pageno)}">
  <p>当前页为第${looper}页面</p>
  </c:when>
  <c:otherwise>
  <p>分页游标:${looper}</p>
  </c:otherwise>
 </c:choose>
</c:foreach>

很简单,每次比较的时候都把后者用fn:trim方法进行去除左右非可见字符。相当于强制转换为string类型,此时tomcat又可以正常解析代码,并未报错。

同样的一套代码,我将其部署到resin中发现无论是修改前还是修改后都能正常运行,可见,应该是tomcat的bug。

示例代码:

让tomcat报错的演示地址:/bug/show.do

避免此bug的方法演示地址:/bug/avoid.do

以上地址前可能需要加上项目名称(具体取决于你如何部署该项目)

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网