Tomcat部署JSP报core:choose下存在非法displaytag:column子标签问题咨询
报错根本原因
Tomcat的JSP解析器与JSTL实现严格遵循JSTL规范要求,<core:choose>标签的直接子节点仅允许为<core:when>和<core:otherwise>,不允许出现其他标签、文本节点甚至多余空白字符;而Weblogic的JSP容器对规范实现更宽松,兼容部分非严格合规的写法。
另外代码中EL表达式内嵌套JSP脚本的写法会干扰Tomcat的标签结构解析,导致解析器错误识别标签层级,误判<displaytag:column>为<core:choose>的直接子节点,触发验证错误。
解决方案
修复EL表达式混写JSP脚本的问题
将表达式中${... eq '<%=MyConstants.ADMIN_RULE_NUM%>'}的脚本嵌入写法替换为标准EL写法:
首先在JSP顶部导入常量类:<%@ page import="com.xxx.MyConstants" %>再将EL表达式修改为(EL 3.0及以上版本支持直接访问类常量):
${!command.logInTest || (command.logInTest && detailsBean.childRuleTest eq MyConstants.ADMIN_RULE_NUM)}彻底消除脚本嵌入导致的解析错乱问题。
清理JSTL依赖冲突
检查项目WEB-INF/lib目录,删除多版本共存的JSTL相关jar包,统一使用同一份JSTL实现,避免不同版本实现的校验逻辑冲突。关闭Tomcat严格标签校验(可选)
若业务需要保留原有写法,可在项目WEB-INF/web.xml中添加JSP配置关闭严格校验:<servlet> <servlet-name>jsp</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> <init-param> <param-name>strictTagLibraryValidation</param-name> <param-value>false</param-value> </init-param> </servlet>也可直接修改Tomcat全局
conf/web.xml中的JspServlet配置,添加上述参数。清理标签间多余空白
移除<core:choose>与<core:when>、<core:otherwise>之间的换行与多余空格,避免解析器将空白节点识别为非法子节点。
内容的提问来源于stack exchange,提问作者Azharoid

