使用Tiles布局时JS文件无法加载的问题排查
Tiles配置未生效导致弹窗页面未加载公共资源的排查方案
核心排查方向:确认弹窗模板是否正确引用header属性
最常见的原因是popupTemplate.jsp未正确调用Tiles的header属性,导致header.jsp根本没有被渲染到页面中:
- 打开
/WEB-INF/views/template/popupTemplate.jsp,检查是否包含Tiles标签库声明:<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %> - 确认模板中是否在合适位置(比如
<head>标签内)插入header属性:<head> <tiles:insertAttribute name="header" /> <!-- 其他弹窗专属资源 --> </head>
如果缺少以上任意一步,header.jsp的内容不会被注入到弹窗页面,自然不会发起资源请求。
检查Tiles定义的匹配优先级
你的tiles.xml中同时存在三级路径通配符定义*/*/*和弹窗页面的精确路径定义svManager/registPj/svProjectList:
- Tiles的规则是精确匹配优先于通配符匹配,但如果精确定义写在通配符定义之后,部分版本可能出现匹配异常。
- 建议将弹窗的精确定义移到
*/*/*通配符定义的前面,确保优先匹配:<!-- 先放精确匹配的弹窗定义 --> <definition name="svManager/registPj/svProjectList" extends="popBase"> <put-attribute name="body" value="/WEB-INF/views/svManager/registPj/svProjectList.jsp" /> </definition> <!-- 再放通配符定义 --> <definition name="*/*/*" extends="base"> <put-attribute name="body" value="/WEB-INF/views/{1}/{2}/{3}.jsp" /> </definition>
验证控制器返回的视图名称
确认Spring MVC控制器返回的视图名称是否为svManager/registPj/svProjectList:
- 如果控制器返回的是其他名称(比如带后缀或前缀的别名),则不会匹配到对应的popBase模板,可能会使用base模板或其他不包含header的模板。
排查弹窗的加载方式
如果弹窗是通过AJAX动态加载JSP片段(而非直接跳转页面):
- 这种场景下Tiles的模板组装逻辑不会触发,AJAX只会请求body部分的JSP内容,不会加载模板中的header。
- 解决方案:要么在父页面提前加载弹窗所需的JS/CSS,要么在弹窗的JSP片段中单独引入资源。
内容的提问来源于stack exchange,提问作者Seonwoo Choi
相关产品推荐
相关产品推荐

