在聊这标签的作用的时候,首先说一个tomcat默认的行为,其实这个行为在很多web服务器部署网站的时候都是这样一个逻辑,那就是在部署的网站的时候,默认会启动index.html ,而在javaweb中用的是index.jsp来实现这个功能,所以为了方便演示,直接将index.jsp删除缓存一个index.html.
然后启动tomcat访问:http://localhost:8080/javaweb/
然后再web下创建一个路径:html / test
然后创建一个a.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<a href="../../index.html">返回首页</a>
</body>
</html>
然后创建index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<a href="./html/test/a.html">跳转到a页面</a>
</body>
</html>
然后演示一个在html中访问一个文件资源然后返回首页的效果。
但是如果servlet进行转向呢?
而且将index.html修改:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
</head>
<body>
<a href="./html/test/a.html"> 跳转到a页面</a>
<br/>
<a href="http://localhost:8080/javaweb/test1">通过servlet跳转到a页面</a>
</body>
</html>
如下测试写一个servle
@WebServlet("/test1")
public class test1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getRequestDispatcher("/html/test/a.html").forward(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req,resp);
}
}
然后测试:
发现通过servle访问的a.html无法返回到首页的,提示404.
为什么会出现这种情况呢?
首先看聊一下同html标签进行跳跃时候网址:
第一步: 当我们访问http://localhost:8080/javaweb/index.html或 http://localhost:8080/javaweb 然后出现了首页的html。
第二步: 当我们点击跳转的时候,看网页地址为:http://localhost:8080/javaweb/html/test/a.html
第三步:然后再点击返回首页看网址为:http://localhost:8080/javaweb/index.html
可以看出这个是一种完整的网页跳转。
看一下通过servlet进行跳转的路径为:
第一步: 当我们访问http://localhost:8080/javaweb/index.html或 http://localhost:8080/javaweb 然后出现了首页的html。
第二步: 当我们点击跳转的时候,看网页地址为:http://localhost:8080/javaweb/test1 这个是通过servlet配置url然后转发到a.html
第三步:然后再点击返回首页看网址为:http://localhost:8080/index.html
然后报错了
通过这个可以看出两者区别,这个就涉及到 (…/…/index.html)
前面聊过再相对路径中的 (…) 默认是两个一目录,而这个依托于浏览器的地址:http://localhost:8080/javaweb/test1
可以如下看:
http://localhost:8080/javaweb/test1 ../../index.html
先消掉第二个 .. 等于如下
http://localhost:8080/javaweb ../index.html
先消掉第一个 .. 等于如下
http://localhost:8080 /index.html
所以得到的路径就是:http://localhost:8080/index.html
通过上面的描述,明白为什么要会报错,毕竟没有这个资源路径。
当然如果根据上面的理解可以通过相对路径满足servlet的请求跳转
<!--<a href="../../index.html">返回首页</a>-->
<a href="../index.html">返回首页</a>
但是这样的相对路径不会满足html标签跳转。
当然如果a.html中如果称绝对路径就没有这个给问题了,修改如下:
<!--<a href="../../index.html">返回首页</a>-->
<!--<a href="../index.html">返回首页</a>-->
<a href="http://localhost:8080/javaweb/index.html">返回首页</a>
但是如果非要用相对路径,而且要满足两个请求方式的话,就可以使用 base这个标签了。
base标签可以设置当前页面所有相对路径工作时,参照那个路径进行跳转,也就是说可以不通过url上的路径进行相对路径跳转。
所以可以将a.html修改为:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<!-- 因为前面聊路径了,所以这个地方只要两层文件夹就行没比如:http://localhost:8080/javaweb/test1/test1/ 为了方便直接写所在路径更方便 -->
<base href="http://localhost:8080/javaweb/html/test/">
</head>
<body>
<a href="../../index.html">返回首页</a>
</body>
</html>