转发和重定向
问题来了?
何时出现了,转发?
最早接触我们是再学习 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 中可以输出响应体。
请求包含:由两个Servlet共同完成响应体,同样用上面的例子,AServlet 请求包含到 BServlet,那么 AServlet 也可以完成响应体,所以 AServlet 的响应中包含了BServle t的响应,最后返给客户端的响应是两者之和。
数据传递
forward 表示一次请求,是在服务器内部跳转,一个请求会创建一个 request 对象,作用范围是一次请求有效(一次请求可以经过多次转发),可以共享一次 request 作用域中的内容。
我们可以通过 Request 作用域 做 数据的传递,通过 forward 方法实现转发跳转。
- request 作用域:拥有存储数据的空间。 可以将数据存入 request 后,在一次请求中的任何位置获取。 可传递任何数据(基本数据类型,对象,数组,集合)
-
存数据:
request.setAttribute(key,value);
- 以键值对形式存储在 request 作用域中。key 为String 类型,value 为 Object 类型。
-
取数据:
request.getAttribute(key,value);
- 通过 String 类型的 key 访问 Object 类型的 value。
-
转发特点:
- 转发是服务器行为
- 转发是浏览器只做了一次访问请求
- 转发浏览器地址不变
- 转发两次跳转之间传输的信息不会丢失,所以可以通过 request 进行数据的传递。
- 转发只能将请求转发给同一个 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 进行传递,哪怕传递的是字符串也不要使用 ,因为明文传递,不安全。
本文来自博客园,作者:走马!,转载请注明原文链接:https://www.cnblogs.com/zou-ma/p/16295757.html