JSP引入公共头部后<a>标签路径跳转404问题求助
<a>标签路径跳转404的最简方案 我完全懂你遇到的这个坑——因为topHeader.jsp会被不同目录的页面引入,用相对路径的话,浏览器会基于当前页面的URL去解析,结果就丢了项目上下文路径,导致404。下面给你几个最省心的解决办法,不管头部被哪里引入都能正常跳转:
1. 直接写项目根绝对路径(最直接)
如果你的项目名固定是project,直接把路径写成从服务器根开始的绝对路径:
<div class="pull-left"> Hello! <a href="/project/accounts/signin.jsp">Sign in</a>. </div>
优点是简单好上手,缺点是如果后期项目名改了,所有用到这个路径的地方都得手动改一遍。
2. 用EL表达式动态获取上下文路径(首推)
利用JSP内置的pageContext对象自动获取项目的上下文路径,这样不管项目名怎么变,或者头部被哪个目录的页面引入,路径都会自动适配:
<div class="pull-left"> Hello! <a href="${pageContext.request.contextPath}/accounts/signin.jsp">Sign in</a>. </div>
这个方法是最灵活的,完全不用纠结相对路径的层级问题,完美适配多页面复用头部的场景,我自己做JSP项目时也常用这个。
3. 全局设置<base>标签(一劳永逸)
在每个页面的<head>标签里添加一个<base>标签,指定所有相对路径的基准URL:
先在index.jsp(以及所有会引入头部的页面)的<head>里加:
<base href="${pageContext.request.contextPath}/">
然后topHeader.jsp里的链接就可以直接写简洁的相对路径了:
<div class="pull-left"> Hello! <a href="accounts/signin.jsp">Sign in</a>. </div>
这个方法的好处是一次配置,整个项目里的所有相对路径都能基于项目根来解析,不用再给每个链接加上下文路径。
最后补充一句:不管你用<jsp:include>还是<%@ include %>,头部内容最终都是嵌入到当前页面里的,浏览器只会认当前页面的URL来解析相对路径,这就是你之前用../accounts会出错的原因——在根目录的index.jsp里,../就直接跳到服务器根了,自然少了project这个项目名。上面三个方法都能解决这个问题,优先选第2种,省心又灵活。
内容的提问来源于stack exchange,提问作者Roshana Pitigala

