You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Tomcat 9.0.67中<%@ include部分场景失效问题求助

Tomcat 9 新版多层JSP静态Include路径报错问题分析及修复

问题根源

这不是Tomcat的Bug,而是Tomcat 9.0.65及后续版本对JSP静态include(<%@ include %>)的路径解析逻辑做了严格规范。在9.0.64及更早版本中,多层嵌套静态include的路径会基于当前JSP的物理路径解析;而新版改为基于编译时顶层JSP的路径计算相对路径,导致多层嵌套场景下路径匹配错误,出现文件找不到的异常。

修复方案

  • 改用绝对路径:将静态include的相对路径替换为基于Web应用根目录的绝对路径。例如把<%@ include file="include/content.jsp"%>修改为<%@ include file="/WEB-INF/views/manager/content/include/content.jsp"%>,彻底避免路径解析歧义。
  • 调整嵌套层级或文件位置:如果多层嵌套无法避免,确保每一层的include路径都严格对应当前JSP的相对位置;或者将被include的公共文件移到上层目录,减少嵌套层级,简化路径计算。
  • 临时回退版本:若暂时无法修改代码,可先回退到Tomcat 9.0.64版本,保证系统正常运行,待完成代码调整后再升级。
  • 修改配置恢复旧逻辑(不推荐):在Tomcat的conf/web.xml中找到jsp Servlet的配置,添加初始化参数:
    <init-param>
        <param-name>org.apache.jasper.Constants.USE_RELATIVE_PATH_FOR_INCLUDE</param-name>
        <param-value>true</param-value>
    </init-param>
    
    该配置会恢复旧的路径解析逻辑,但可能引入路径安全风险,需谨慎使用。

关于jsp:include的说明

<jsp:include>属于动态include,路径解析基于运行时的请求路径,因此不会出现文件找不到的问题,但它是在运行时加载目标页面,目标页面无法直接访问当前JSP的模型数据(静态include是编译时合并代码,模型数据天然共享)。如果需要共享模型数据,仍需使用静态include并修正路径。

内容的提问来源于stack exchange,提问作者A.G.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 09:45:36