嘚儿驾...

转发和重定向

问题来了?

何时出现了,转发?

​     最早接触我们是再学习 Servlet 时,碰到这两个词。

​     在 刚开始的时候,我们调用业务逻辑,和显示结果都在同一个页面 Servlet 里面,就会产生设计问题。

  • 不符合单一职能原则,各司其职的思想。

  • 不利于后续的维护

​     应该将业务逻辑和显示结果分离开来。像这样一样,XXXController 负责调用业务逻辑,XxxJSP 负责页面结果显示。

但是这样的话问题来了.....

  • 业务逻辑和显示结果分离后,如何跳转到显示结果的 Servlet ,并且把自己得到的数据结果传递给 显示结果 的 Servlet ?

要解决这两个问题,我们就要了解了解转发了 !!!


转发:

​     转发的作用在服务器端,将客户端发送给我的请求,发送给服务器上的其他资源,以共同完成一次请求的处理。

页面跳转:

​     getRequestDispatcher() 包含两个重要方法,分别是请求转发请求包含。一个请求跨多个 Servlet 时,需要使用请求转发和请求包含。

​     在调用业务逻辑的 Servlet 中,获取一个RequestDispatcher 对象(请求转发器):

    RequestDispatcher rd = = request.getRequestDispatcher("/目标URL-pattern")

请求转发:

rd.forward(request,reponse);

请求包含:

rd.include(request,reponse)

上述代码可以简写为:

request.getRequestDispatcher("/目标URL-pattern").forward(request,reponse);

request.getRequestDispatcher("/目标URL-pattern").include(request,reponse);

URL-pattern : 资源名称

注意: 在使用 forward ,include 跳转时,是在服务器 内部跳转,地址栏不发生变化,属于同一次请求。

请求转发和请求包含的区别:

请求转发:由下一个Servlet完成响应体,举个例子,AServlet 请求转发到BServlet,那么 AServlet 不能够设置响应体,而在 BServlet 中可以输出响应体。
image-20220518195513491

请求包含:由两个Servlet共同完成响应体,同样用上面的例子,AServlet 请求包含到 BServlet,那么 AServlet 也可以完成响应体,所以 AServlet 的响应中包含了BServle t的响应,最后返给客户端的响应是两者之和。

image-20220518212807586

数据传递

​     forward 表示一次请求,是在服务器内部跳转,一个请求会创建一个 request 对象,作用范围是一次请求有效(一次请求可以经过多次转发),可以共享一次 request 作用域中的内容。

​     我们可以通过 Request 作用域 做 数据的传递,通过 forward 方法实现转发跳转。

  • request 作用域:拥有存储数据的空间。 可以将数据存入 request 后,在一次请求中的任何位置获取。 可传递任何数据(基本数据类型,对象,数组,集合)
    • 存数据:request.setAttribute(key,value);

      • 键值对形式存储在 request 作用域中。key 为String 类型,value 为 Object 类型。
    • 取数据:request.getAttribute(key,value);

      • 通过 String 类型的 key 访问 Object 类型的 value。

转发特点:

  1. 转发是服务器行为
  2. 转发是浏览器只做了一次访问请求
  3. 转发浏览器地址不变
  4. 转发两次跳转之间传输的信息不会丢失,所以可以通过 request 进行数据的传递。
  5. 转发只能将请求转发给同一个 Web 应用中的组件

重定向:

​     重定向作用在客户端,客户端将请求发送给服务器后,服务器响应给客户端,一个新的请求地址,客户端重新发送新的请求。

页面跳转:

在调用业务逻辑的Servlet 中,编写一下代码

  • response.sendRedirect("目标 URI")

URI:统一资源标识符,用来表示服务器中定位一个资源,资源在 web 项目中的路径(/project/soutce)

使用 Redirect 跳转时,是在客户端跳转,地址栏发生变化,属于多次请求。

数据传递:

​      sendRedirect 跳转时,地址栏改变,代表客户端重新发送请求,属于两次请求。

​     response 没有作用域,两次 request 请求中的数据无法共享。(一次请求创建一个 request)

那如何传递数据?

传递数据:可以通过 URI 明文拼接进行数据传递("/Webproject/b?username=jack");

获取数据:因为是在地址栏中获取数据,所以不能使用,request.getAttribute获取了,要使用request.getParameter("username");获取

重定向的特点:

  • 重定向是客户端行为。
  • 重定向是浏览器做了至少两次访问请求。
  • 重定向浏览器地址栏改变。
  • 两次跳转之间传输的信息丢失(request 范围,因为一次请求创建一个 request)
  • 重定向 可以指向任何资源,包括当前应用程序中的其它资源,同一个站点上其它应用程序中的资源。

总结:

​     当两个 Servlet 需要传递数据时,选择 forward 转发,不建议使用 sendRedirect 进行传递,哪怕传递的是字符串也不要使用 ,因为明文传递,不安全。

posted @ 2022-05-21 19:04  走马!  阅读(45)  评论(0编辑  收藏  举报