Servlet学习之转发与重定向

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域里面的数据取出来,那么就使用转发机制。
  • 除了上面所说的共享数据的情况下,剩下所有的请求均使用重定向。(重定向使用较多。)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

少不入川。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值