这里我们在webapp下创建一个a文件夹,在a文件夹里创建一个b文件夹,然后在b文件夹里创建一个c.html
Title
这是a下的b下的c.html页面
跳回首页
这时候在webapp下创建一个index.html首页
首页
这是Web下的index.html
a/b/c.html
请求转发:a/b/c.html
这时候写一个Servlet
package com.servlet.one;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class ForwardC extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("经过了ForwardC程序");
request.getRequestDispatcher("/a/b/c.html").forward(request,response);
}
}
我们进入首页进行正常的a标签跳转,是可以从首页跳转到c.html,还可以从c.html跳转回来。
接下来,在index.html点击转发到c.html下,这时候经过了ForwardC程序跳到c.html,但是我们跳不回去index.html了。
当我们点击a标签进行正常的跳转的时候,浏览器中的地址是这个:http://localhost:8080/servlet-01/a/b/c.html 跳转回去的a标签路径是:../../index.html,这是相对路径。 所有相对路径在工作的时候都会参照当前浏览器地址栏中的地址来进行跳转。 也就是说../../index.html是参照http://localhost:8080/servlet-01/a/b/c.html这个地址来跳转的。 我们把他们放在一起http://localhost:8080/servlet-01/a/b/c.html../../index.html 这个..就是去掉一层目录,c.html不是目录,直接去掉,b是目录,那么去掉一层目录,去掉一层点点,然后后面还有一层点点,再跳到上一层目录,那么就会把a也去掉。 那么参照后得到的地址是:http://localhost:8080/servlet-01/index.html。这个是正确的跳转路径。 以上是a标签跳转是正常的。
那么为什么请求转发会出现问题? 当我们使用请求转发来进行跳转的时候,浏览器地址栏中的地址是:http://localhost:8080/servlet-01/forwardC 这时候就开始不同了 所有相对路径在工作的时候都会参照当前浏览器地址栏中的地址来进行跳转。 我们把他们放在一起:http://localhost:8080/servlet-01/forwardC../../index.html 那么点点,去掉一层目录,forwardC不是目录,直接pass掉,servlet-01是目录,去掉,那么去掉后,还有一个点点,可是localhost:8080是端口,不是目录,去无可取,最终得到的路径是:http://localhost:8080/index.html。 这是错误的路径,找不到了,这就是请求转发之后,回不去了,我们的参照地址发生了变化。
解决办法: 如果我们可以让它参照的地址永远不变,而不关心浏览器地址栏的地址,那就可以跳过去,这时候base标签就可以,base标签可以设置当前页面中所有相对路径工作时,参照哪个路径来进行跳转。
base标签放在head里,
Title
这是a下的b下的c.html页面
跳回首页
这时候就可以进行正常的跳转了!



