EL表达式中使用三目运算符在Tomcat不同版本中的表现

2010-9-10 11:50:42 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet authentication threw exception
org.apache.jasper.JasperException: /WEB-INF/pages/hr/tabfieldconfig/newField.jsp(91,74) "${param.ftablename==null?examField.ftabblename:param.ftablename}" contains invalid expression(s): javax.el.ELException: Error Parsing: ${param.ftablename==null?examField.ftabblename:param.ftablename}
	at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:40)
	at org.apache.jasper.compiler.ErrorDispatcher.dispatch(ErrorDispatcher.java:407)
	at org.apache.jasper.compiler.ErrorDispatcher.jspError(ErrorDispatcher.java:198)
	at org.apache.jasper.compiler.Validator$ValidateVisitor.checkXmlAttributes(Validator.java:1149)
	at org.apache.jasper.compiler.Validator$ValidateVisitor.visit(Validator.java:819)
	at org.apache.jasper.compiler.Node$CustomTag.accept(Node.java:1507)
	at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2336)
	at org.apache.jasper.compiler.Node$Visitor.visitBody(Node.java:2386)
	at org.apache.jasper.compiler.Node$Visitor.visit(Node.java:2392)
	at org.apache.jasper.compiler.Node$Root.accept(Node.java:489)
	at org.apache.jasper.compiler.Node$Nodes.visit(Node.java:2336)
	at org.apache.jasper.compiler.Validator.validate(Validator.java:1737)
	at org.apache.jasper.compiler.Compiler.generateJava(Compiler.java:178)
	at org.apache.jasper.compiler.Compiler.compile(Compiler.java:306)
	at org.apache.jasper.compiler.Compiler.compile(Compiler.java:286)
	at org.apache.jasper.compiler.Compiler.compile(Compiler.java:273)
	at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:566)
	at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:317)
	at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:320)
	at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:266)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	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:654)
	at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:445)
	at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:379)
	at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:292)
	at org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:236)
	at org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:257)
	at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1183)
	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:902)
	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:807)
	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:571)
	at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:501)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:96)
	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
	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:230)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:261)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844)
	at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:581)
	at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
	at java.lang.Thread.run(Unknown Source)


    我在JSP页面中使用了EL表达式${param.ftablename==nullexamField.ftabblename:param.ftablename},自己测试没有错误,放到同事机器上就报错(上面的错误),说我的写的不对,没见过EL表达式里使用三目运算符的,非得让我换成其他的判断形式,换就换,反正程序咋写都一样,有时间了自己查原因。
    问题不好查,一样的代码只是放到不同的机器上了,后来发现我用的Tomcat5.5版本,同事的是Tomcat6.0版本,开始以为是Tomcat6.0的一个bug或是不再支持那样的写法,后来通过规范代码,在运算符与表达式之间加空格,改为<c:out value="${param.ftableid==null ? examField.ftableid : param.ftableid}"></c:out>,就不报错了,正常运行。

    看来不是Tomcat6.0的bug,还是自己代码写的不规范,标准的三位运算表达式Expression1 ? Expression2 :Expression3,每个表达式和运算符之间,都有一个空格,否则Tomcat6.0是无法识别的。有点像Python的行为强制程序员写规范代码。

你可能感兴趣的:(java,apache,tomcat,Web,servlet)