前言
在学习的过程中,遇到一个问题——在html,jsp前端页面中的链接加不加"/"。因为这,可是吃了不少苦头,404,还有其他各种错误。之前遇到错误时,一直也不知道错在哪里,在网上各种找贴,也没有解决,今天,特意来了此心结。
首先明确的是:在jsp,html中使用的地址,即前端页面中的地址,都是相对地址
地址分类
1.绝对地址,带有协议名称的是绝对地址,http://www.baidu.com , ftp://202.122.23.1
2.相对地址,没有协议开头的,例如:test/some.do, /test/some.do
不能独立使用,必须有一个参考地址,通过参考地址,+相对地址本身才能指定资源
张三同学,1班有张三,2班有张三,你要找哪个张三呢,一样的道理
不加“/”情况
在你的页面中,访问地址不加"/"
如访问的是,http://localhost:8080/ch06_path/index.jsp
路径:http://localhost:8080/ch06_path/
资源:index.jsp
在index.jsp发起 test/some.do 请求,访问地址变为 http://localhost:8080/ch06_path/test/some.do
当你的地址没有 / 开头,test/some.do 当你点击链接时,访问地址是当前页面的地址 + 链接的地址
http://localhost:8080/ch06_path/ + test/some.do
加“/”情况
在你的页面中,访问地址加"/"
访问的是,http://localhost:8080/ch06_path/index.jsp
路径:http://localhost:8080/ch06_path/
资源:index.jsp
当你的地址有 / 开头,/test/some.do 当你点击链接时,访问地址变为 http://localhost:8080/test/some.do
参考地址是 你的服务器地址,也就是 http://localhost:8080
一种方法是加入${pageContext.request.contextPath} (当前页面的路径)
<a href=/test/some.do> 发起test/some.do请求 </a>
变为
<a href="${pageContext.request.contextPath}/test/some.do"> 发起test/some.do请求 </a>
特殊情况(链接又跳转到当前页面)
index.jsp 访问 test/some.do ,返回后现在的地址 http://localhost:8080/ch06_path/test/some.do
路径:http://localhost:8080/ch06_path/test
资源:some.do
如果在后端设置返回视图为 setViewName("/index.jsp") 当前页面 再次点击
就变为了 http://localhost:8080/ch06_path/test/test/some.do 访问失败
此时是以当前页面路径 http://localhost:8080/ch06_path/test/ 为相对路径 加上 test/some.do
解决方案总结
1..加入EL表达式 ${pageContext.request.contextPath} (如果地址较多,需要每个地址都加,比较繁琐,没有base效果好)
<a href="${pageContext.request.contextPath}/test/some.do"> 发起test/some.do请求 </a>
2.加入一个base标签,html中的标签,表示当前页面中访问地址的基地址
你的页面中所有没有 / 开头的地址,都是以base中地址 为参考地址,如使用base中的地址+user/some.do,组成访问地址,进行资源访问
需要的页面 在页面添加下面的标签
<base href:"http://localhost:8080/ch06_path/">
存在问题:有时候该地址也会变,动态获取
<%
String basePath = request.getScheme() + "://" +
request.getServerName() + ":" + request.getServerPort() +
request.getContextPath() + "/";
%>
<base href="<%=basePath%>">
写在最后
以上方法,本人都有亲自实现可行。文章内容如有错误之处,还请大家多多指正,本人然后进行改正。