折磨人的EL表达式

最近被一个小小的问题折磨了将近一周。
事情是这样的,我用jstl标签库写了一个构建楼盘表的页面。(目前在做北京建委的房屋全生命周期平台)
在页面中我定义了这样两个变量:
<fmt:formatNumber type="number" var="uc" value="${(upColumnCount-1)/2}" maxFractionDigits="0" />
<fmt:formatNumber type="number" var="dc" value="${(downColumnCount-1)/2}" maxFractionDigits="0" />

以下变量说明:upColumnCount为地上楼盘表的总列数
             downColumnCount为地下楼盘表的总列数
总列数又包括这样的信息,第一列为楼层数,然后接下来成对出现的为该楼层的所以户信息,成对信息中的第一列为户ID,第二列为户名称,所以除了楼层数,地上楼盘表的列数我定义了一个变量uc,其值为:(upColumnCount-1)/2,同理地下楼盘表其列数dc为:(downColumnCount-1)/2

定义好这两个变量好,我在页面中要做以下处理:

如果地上楼盘表的列数大于地下楼盘表的列数,则直接在地上楼盘表下面循环输出地下楼盘表,然后偱环输出完之后还要判断uc>dc的话,地下楼盘表剩下的列表中填充空格。问题出就出在这儿,我在页面这样写:
         <c:if test="${uc>dc}">
             <c:forEach var="j" begin="1" end="${uc-dc}" step="1">
              <td align="center">
               &nbsp;           
              </td>
             </c:forEach>
         </c:if>
页面还有多处这样的判断处理。
结果导致我的页面前台有时候正常输出,有时候不能正常输出,打印出来的源码中总是代码不全,而后台则报:
    严重: Servlet.service() for servlet jsp threw exception
javax.servlet.jsp.JspTagException: 'end' < 0
 at javax.servlet.jsp.jstl.core.LoopTagSupport.validateEnd(LoopTagSupport.java:487)
 at org.apache.taglibs.standard.tag.rt.core.ForEachTag.setEnd(ForEachTag.java:62)
 at org.apache.jsp.extend.houseA.page.modul.bof.bof_005flpew_005freport_jsp._jspx_meth_c_005fforEach_005f4(bof_005flpew_005freport_jsp.java:1575)
 at org.apache.jsp.extend.houseA.page.modul.bof.bof_005flpew_005freport_jsp._jspx_meth_c_005fif_005f3(bof_005flpew_005freport_jsp.java:1545)
 at org.apache.jsp.extend.houseA.page.modul.bof.bof_005flpew_005freport_jsp._jspx_meth_c_005fwhen_005f4(bof_005flpew_005freport_jsp.java:1334)
 at org.apache.jsp.extend.houseA.page.modul.bof.bof_005flpew_005freport_jsp._jspx_meth_c_005fchoose_005f4(bof_005flpew_005freport_jsp.java:1281)
 at org.apache.jsp.extend.houseA.page.modul.bof.bof_005flpew_005freport_jsp._jspService(bof_005flpew_005freport_jsp.java:321)
 at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
 at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
 at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
 at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:630)
 at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
 at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
 at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
 at org.apache.struts.action.RequestProcessor.doForward(RequestProcessor.java:1085)
 at org.apache.struts.action.RequestProcessor.processForwardConfig(RequestProcessor.java:398)
 at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:241)
 at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
 at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:414)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at com.longtop.common.filter.SetEncodingFilter.doFilter(SetEncodingFilter.java:29)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
 at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
 at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
 at java.lang.Thread.run(Thread.java:619)
我仔仔细细的检查了代码,第一逻辑判断上没有错,第二代码也没有写错的地方。
可它究竟为什么会报这样的错误呢?
我在网上也疯狂的找寻答案,发现遇到相同问题的人还真不少,寻找解答的贴子也不少,可就是没有人给出答案。
没有办法还得靠自己解决。
我一点一点的调试,因为这个页面相当复杂,套用了大量的<c:choose>及嵌套的<c:if>语句。既然页面报JspTagException: 'end' < 0
这个错误,我想我就从 <c:forEach >这儿进行一步一步的调试吧,先删了一些觉得有问题的代码,然后在<c:if test="${uc>dc}">这样的判断语句中打印输出了一些内容,竟然发现当uc=79,dc=230的时候,<c:out value="${uc>dc}"></c:out>这个打印的是true!!!!
看来问题找到了,EL表达式中难道变量不能直接进行比较?
我试着把所有这样的比较改成:<c:if test="${(uc-dc)>0}">,页面终于成功了,一切OK!
就这样一个小小的问题折腾了我将近一个星期,写下日志,做为备份,下次不要再出现这样的问题,看来,简单好用的EL语句有时候并不是万能的!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值