本章节将介绍转发和重定向的区别,在了解它们之前,我们需要知道一句话:转发是由服务器内部实现的,而重定向的工作则是由浏览器去执行,它们之间的区别也都是围绕这这句话进行,它们之间的区别主要有三点。
一、URL地址是否变化
由于转发是在服务器内部执行的,浏览器并不知道请求的内容转发到其他地方进行处理,所以浏览器上面的地址栏是不变的。而重定向是由浏览器执行的,所以URL会发生变化。
结论:
转发:URL不变
重定向:URL变化
二、请求信息是否保留
请求信息包括parameter、attribute等,由于转发是在服务器内部执行的,所以这些请求信息都会保留传递到目的servlet的HttpServletRequest中,而重定向则相当于重新发起一个新的请求,不会保留请求信息。
结论:
转发:保留请求信息
重定向:不保留请求信息
三、根目录(/)
转发是在内部的,所以根目录对应的就是web应用的目录,而浏览器是针对web服务器发起的请求,所以重定向的根目录为web服务器目录。例如我们将helloweb.war包放到tomcal/webapps目录下,启动tomcat。那么http://localhost:8080/helloweb/
就是我们web应用的根目录,http://localhost:8080/
就是我们web服务器的根目录。
总结:
转发:web应用目录
重定向:web服务器目录
说完不同点,下面结合共同点来讲一下相对路径、绝对路径在转发和重定向的具体变现是怎样的。
- 首先我们先建立两个类MyServlet、MyServlet_02,分别设置url-mapping为 /a/*、/b/*
<servlet-mapping>
<servlet-name>MyServlet</servlet-name>
<url-pattern>/a/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>MyServlet2</servlet-name>
<url-pattern>/b/*</url-pattern>
</servlet-mapping>
2.在两个servlet的service方法分别插入以下代码
System.out.println("===MyServlet===");
try {
System.out.println(request.getRequestURL());
Thread.sleep(1000);//防止转发/重定向到当前servlet一下子打印过多信息。
String url="";//
//request.getRequestDispatcher(url).forward(request, response);//转发
//response.sendRedirect(url);//重定向
} catch (InterruptedException e) {
e.printStackTrace