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

系统 1716 0

本文出处: http://blog.csdn.net/chaijunkun/article/details/9097229 ,转载请注明。由于本人不定期会整理相关博文,会对相应内容作出完善。因此强烈建议在原始出处查看此文。

今天在做数据分页显示的时候遇到了一个问题,经过测试,证实是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。

示例代码下载地址: http://download.csdn.net/detail/chaijunkun/5581883

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

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

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

 

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


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论