本文出处: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相关推荐

  1. spring el表达式解析_Spring之旅第一篇-初识Spring

    目录 一.概述 二.模块 三.动手创建 一.概述 只要用框架开发java,一定躲不过spring,Spring是一个轻量级的Java开源框架,存在的目的是用于构建轻量级的J2EE应用.Spring的核 ...

  2. jsp中EL表达式显示时中文乱码

    我是通过url请求将一个jsp的值传到另一个jsp,结果在另一个jsp显示时出现中文乱码. 分析问题:由于URL请求没有设置编码格式所以解析响应时会出现中文乱码 解决方法:在Tomcat的conf文件 ...

  3. 在使用.Net Reflector时发现了一个Bug:)

    在写"深入Atlas系列"文章时,估计最常用的工具就是Lutz Roeder's .Net Reflector了.自从遇见了它,它就成为了我最喜欢的.NET相关工具,是绝对的第一. ...

  4. EL表达式和JSTL标签库使用

    EL表达式 介绍: EL(Expression Language)  目的:为了使JSP写起来更加简单. 表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP ...

  5. JSP中的EL表达式详细介绍

    2019独角兽企业重金招聘Python工程师标准>>> 一.JSP EL语言定义 EL 提供了在 JSP 脚本编制元素范围外使用运行时表达式的功能.脚本编制元素是指页面中能够用于在 ...

  6. Spring EL 表达式的简单介绍和使用

    文章目录 1. 简单介绍 1.1. 什么是 Spring EL 1.2. 为什么要使用 Spring EL 1.3. 如何使用 Spring EL 2. 简单使用 3. EL 表达式解析引擎 3.1. ...

  7. 【JSP教科书】JSP知识在线指南(记录知识JSP体系、EL表达式、JSTL标签库、JSP开发模型和分页查询)

    文章目录 @[toc] 一.JSP简介 1.1 什么是JSP? 1.2 JSP的特点 1.3 JSP为什么也是Servlet 1.4 tomact服务器中的资源分析 1.4.1 tomact服务器中的 ...

  8. 『Java安全』EL表达式注入

    文章目录 前言 EL表达式解析启用/禁用 EL表达式注入 绕过方式 1. 反射 2. js引擎rce 3.String类动态生成命令字符串(ASCII) 参考引用 完 前言 EL表达式全称Expres ...

  9. JSP复习(二):EL表达式

    2019独角兽企业重金招聘Python工程师标准>>> EL表达式:从JSP2.0开始成为规范,是的原来用scriptlet和表达式完成的事情,EL都能完成 1.配置相关 ${app ...

最新文章

  1. AutoHotkey 使用笔记
  2. 【HIMI转载推荐之三】新手教程之如何向APP STORE提交应用
  3. python找出第二大值,Python程序在Dictionary中查找第二个最大值
  4. hive查看数据库里库的信息_hive 查看当前数据库
  5. linux 关中断 调度,关中断是否禁止任务调度?关中断能作为互斥吗?
  6. .NET Task揭秘(一)
  7. Python数据类型与运算符号
  8. CSS单位 px pt em和rem 之间的区别
  9. ASP.NET那点不为人知的事(二)
  10. Hue添加Spark notebook
  11. 写论文的一点经验小记
  12. MapXtreme 2005 学习心得 了解新建MapXtreme项目结构(二)
  13. CMC5601-微芯智能科技6轴运动控制器
  14. 单片机课设中期报告_毕业设计中期报告
  15. 精简win服务器系统,My Server之管理Win Server 2012精简版
  16. Labelme对图像标注、json转化png格式
  17. 【SDCC讲师专访】Swoole开源项目创始人韩天峰:PHP是最好的编程语言
  18. Python中文文本分句
  19. ios You app information could not be saved. Try again. If the problem persists, contact us
  20. 2020中科大计算机分数线,2020中国科技大学录取分数线

热门文章

  1. 一步一步SharePoint 2007之四十一:实现Search(4)——设定爬网Schedule
  2. ORACLE取周、月、季、年的開始时间和结束时间
  3. Java Web文件下载
  4. Nginx 静态服务器
  5. Linux设备管理(三)_总线设备的挂接
  6. mysql 乱码处理
  7. Office 2010 使用技巧
  8. poj1019(打表预处理+数学)
  9. Mysql中的外键分析(什么是外键,为什么要用外键,添加外键,主外键关联删除)
  10. Dnsmasq安装与配置-搭建本地DNS服务器 更干净更快无广告DNS解析