转发重定向的区别-(不废话直接看)

本文讨论了在Servlet中使用转发和重定向的区别,强调了它们在设计上的优势,如分离业务逻辑和页面展示,以及各自的适用场景。转发在服务器内部进行,一次请求中可以传递数据;而重定向涉及两次客户端请求,数据传递需通过URI拼接。
摘要由CSDN通过智能技术生成

转发重定向的区别

当我们将调用业务逻辑与显示结果页面都编写在同一个Servlet里,会产生设计问题。

  • 不符合单一职能原则、各司其职的思想
  • 不利于后续的维护

使用转发和重定向将业务逻辑和现实结果分离开,更符合以上设计思想

转发

页面跳转

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

数据传递

forward表示一次请求,是在服务器内部跳转,可以共享同一次request作用域中的数据

  • request作用域:拥有存储数据的空间,作用范围是一次请求有效(一次请求可以经过多次转发)

    • 可以将数据存入request后,在一次请求过程中的任何位置进行获取
    • 可传递任何数据(基本数据类型、对象、数组、集合等)
  • 存数据:request.setAttribute(key,value);

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

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

转发特点

  • 转发是服务器行为

  • 转发是浏览器只做了一次访问请求

  • 转发浏览器地址不变

  • 转发两次跳转之间传输的信息不会丢失,所以可以通过request进行数据的传递、

  • 转发只能将请求转发给同一个Web应用中的组件

重定向

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

页面跳转

response.sendRedirect("目标URI");

数据传递

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

  • response没有作用域,两次request请求中的数据无法共享
  • 传递数据:通过URI的拼接进行数据传递(“/WebProject/b?username=tom”);
  • 获取数据:request.getParameter(“username”);

重定向特点

  • 重定向是客户端行为。

  • 重定向是浏览器做了至少两次的访问请求。

  • 重定向浏览器地址改变。

  • 重定向两次跳转之间传输的信息会丢失(request范围)。

  • 重定向可以指向任何的资源,包括当前应用程序中的其他资源、同一个站点上的其他应用程序中的资源、其他站点的资源。

转发、重定向总结

服务端跳转:

  • 一共只发送了一次请求
  • 不可以跳转到站外,只能在当前网站跳转
  • 跳转路径不需要包含 context-path
  • 实现方案:
    • req.getRequestDispatcher(“跳转路径,不需要 context-path”).forward(req,resp);

当两个Servlet需要传递数据时,选择forward转发。不建议使用sendRedirect进行传递

客户端跳转(重定向):

  • 一共发送了两次请求
  • 可以跳转到站外
  • 跳转路径需要包含 context-path
  • 实现方案:
    • resp.setStatus(302);resp.addHeader(“Location”,“客户端路径,需要包含context-path”);
    • resp.sendRedirect(“客户端路径,需要包含context-path”);

关于重定向的更多案例可以看我这篇文章:网页定时刷新并跳转—resp.setHeader()与resp.sendRedirect()的区别

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值