jsp:include正确语法?嵌套引入REST接口路径问题求解
解决JSP嵌套include中REST接口路径问题
核心问题根源
你之前的错误在于对<jsp:include>的路径解析逻辑理解有误:
- 当
page属性以/开头时,它是相对于Web应用的根目录(即contextPath对应的路径,比如appName/),容器会自动拼接contextPath,不需要手动加${contextPath}。 - 手动添加
${contextPath}会导致重复拼接,最终生成appName/appName/rest/xxx这种错误路径。
最优解决方案
直接使用以/开头的绝对路径,不要拼接${contextPath}:
在chapters.jsp中修改为:
<jsp:include page="/rest/paragraphs?chapter=x"/>
容器会自动将其解析为http://host:port/appName/rest/paragraphs?chapter=x,完全符合预期,且不受嵌套include的层级影响。
为什么相对路径不可靠?
相对路径(比如../rest/xxx)是基于当前JSP的请求路径(而非文件系统路径),当存在多层嵌套include时,当前JSP的请求上下文可能和文件存放路径不一致,容易出现路径解析错误,所以绝对路径是更通用的方案。
额外验证方法
如果不确定contextPath的值,可以在JSP中临时输出验证:
<%-- 输出当前应用的contextPath --%> ContextPath: ${pageContext.request.contextPath}
正常情况下它的值就是/appName,而<jsp:include>的绝对路径会自动基于这个值拼接。
内容的提问来源于stack exchange,提问作者algiogia
相关产品推荐
相关产品推荐

