1.概要
转发与重定向都是在Web中进行资源跳转的方式。具体来说就是我们从也页面中跳转至另一个服务器资源,这个资源可以是html文件,也可以是一个Servlet对象。
在讲解之前我们先说明一下原理图中的大概内容
-
左边的框框是我们的浏览器(Browser)
-
右边的内容是我们的Web服务器
-
oa是我们Web服务器中的一个项目名称
-
AServlet与BServlet分别是项目中的两个Servlet,下面是他们在web.xml文件中的配置信息
-
<servlet> <servlet-name>a</servlet-name> <servlet-class>com.bjpowernode.javaweb.servlet.AServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>a</servlet-name> <url-pattern>/a</url-pattern> </servlet-mapping> <servlet> <servlet-name>b</servlet-name> <servlet-class>com.bjpowernode.javaweb.servlet.BServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>b</servlet-name> <url-pattern>/b</url-pattern>
-
2.转发
为了更好的理解转发的作用,我们用例子来说明。
- 现在我们在AServlet中编写一段代码用来获取当前的系统时间,并且我们想让BServlet得到这个时间数据。
思考:如果直接向HttpServletRequest对象(请求域对象)中绑定数据,然后我们再让BServlet访问请求域域中的数据,这样看起来貌似可以,但是实际上是行不通的,因为一次请求只对应一个ServletRequest对象,而我们自己通过URL分别访问AServlet和BServlet,这实际上是两次请求,所以即使AServlet向它的请求域对象中存放了数据,BServlet也无法从它自己的请求域对象中获得AServlet绑定的数据。
说到这里你可能就知道了转发共享数据的大概思路了:通过某个方法将AServlet对象的HttpServletRequest对象传递给BServlet对象,这样就可以实现转发的共享。
2.1 代码演示
// 第一步:获取请求转发器对象
// 相当于把"/b"这个路径包装到请求转发器当中,实际上是把下一个跳转的资源的路径告知给Tomcat服务器了。
RequestDispatcher dispatcher = request.getRequestDispatcher("/b");
// 第二步:调用请求转发器RequestDispatcher的forward方法。进行转发。
// 转发的时候:这两个参数很重要。request和response都是要传递给下一个资源的。
dispatcher.forward(request, response);
// 一行代码搞定转发。
request.getRequestDispatcher("/b").forward(request, response);
// 转发到一个Servlet,也可以转发到一个HTML,只要是WEB容器当中的合法资源即可。
不过要注意的是,我们通过request对象的getRequestDispatcher()方法进行资源跳转的路径是不需要添加项目名的,就像web.xml文件中的Servlet关联路径一样,不需要以项目名开头。
2.2 原理图
- 这里我们可以看到浏览器向服务器发出请求
- 服务器通过web.xml文件找到对应的Servlet资源以后,看到了AServlet需要转发请求
- 于是Tomcat服务器进行调度,将需要转发的AServlet的ServletRequest和ServletResponse传递给BServlet。
- 最后拿着BServlet会被作为资源返回给我们的浏览器
3.重定向
3.1 代码演示
response.sendRedirect("/oa/a");
冲定向的代码很简单,不过要注意的是,跳转资源的地址是需要写项目名的。
3.2 原理图
- 我们的浏览器向服务器发送请求
- 服务器找到AServlet以后通过重定向将跳转资源路径作为资源返回给浏览器
- 浏览器再通过服务器返回的资源路径再次向服务器发出请求
- 最后服务器通过路径找到对应的BServlet作为资源返回给服务器
4.转发与重定向的区别
4.1 从表层来看
- 转发(一次请求)
- 在浏览器地址栏上发送的请求是:http://localhost:8080/servlet10/a ,最终请求结束之后,浏览器地址栏上的地址还是这个。没变。
- 重定向(两次请求)
- 在浏览器地址栏上发送的请求是:http://localhost:8080/servlet10/a ,最终在浏览器地址栏上显示的地址是:http://localhost:8080/servlet10/b
4.2 从里层来看
- 转发:是由WEB服务器来控制的。A资源跳转到B资源,这个跳转动作是Tomcat服务器内部完成的。
- 重定向:是浏览器完成的。具体跳转到哪个资源,是浏览器说了算。
5.资源跳转方式的选择
- 如果在上一个Servlet当中向request域当中绑定了数据,你希望从下一个Servlet当中把request域里面的数据取出来,那么就使用转发机制。
- 除了上面所说的共享数据的情况下,剩下所有的请求均使用重定向。(重定向使用较多。)