1. 页面转发(Forward)
页面转发是服务器端的一种行为,用户发起的请求会在服务器内部传递,服务器将请求转发到另一个视图(如 JSP 页面)或另一个处理方法。转发的过程中,浏览器的 URL 不会发生变化,用户不会感知到 URL 跳转。
主要特点:
- URL 不变:请求在服务器内部转发,浏览器不会改变当前 URL。
- 请求和响应对象共享:原始请求和响应对象会在转发的过程中传递到新的页面或处理方法。
- 适用于请求内操作:适合用于处理需要在一次请求中完成的任务,例如从一个控制器转发到 JSP 页面以显示数据。
实现方式:
在 Spring MVC 中可以通过返回视图名称的方式来实现页面转发,视图解析器(ViewResolver)会将视图名称解析为实际的页面路径。
例如:
@RequestMapping("/showPage")
public String showPage(Model model) {
model.addAttribute("message", "Hello, Spring MVC!");
return "page"; // 转发到视图名称为 "page" 的 JSP 页面
}
如果需要手动实现页面转发,也可以使用 RequestDispatcher.forward():
@RequestMapping("/forwardExample")
public void forwardExample(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.getRequestDispatcher("/forwardedPage").forward(request, response);
}
2. 页面重定向(Redirect)
页面重定向是浏览器端的行为。服务器收到请求后,发送一个重定向响应给客户端,客户端收到重定向的响应后,重新发起新的请求,URL 会发生变化。
主要特点:
- URL 改变:浏览器的地址栏会显示新的 URL。
- 请求对象不共享 :因为是新的请求,原始请求对象的数据不会传递到新页面,需要将数据存储在
Session或使用 URL 参数传递。 - 适用于跨请求的跳转:重定向常用于处理需要重新生成请求的场景,例如表单提交后重定向到成功页面,避免重复提交。
实现方式:
在 Spring MVC 中,通过在返回视图名称时使用 redirect: 前缀来实现页面重定向。
例如:
@RequestMapping("/redirectExample")
public String redirectExample() {
return "redirect:/newPage"; // 重定向到 "/newPage"
}
如果需要在重定向时传递参数,可以直接通过 URL 传递:
@RequestMapping("/redirectWithParam")
public String redirectWithParam() {
return "redirect:/newPage?param=value";
}
3. 转发与重定向的区别
| 特性 | 转发(Forward) | 重定向(Redirect) |
|————|————–|———————-|
| URL 改变 | 不改变,浏览器地址栏不变 | 改变,浏览器地址栏显示新 URL |
| 请求数量 | 只有一次请求 | 两次请求(原请求+重定向请求) |
| 数据传递 | 请求和响应对象可以共享 | 需要手动传递数据,如通过 Session |
| 场景适用 | 页面渲染、数据展示等 | 表单提交成功后避免重复提交,登录后跳转等 |
总结来说,页面转发适合用于同一个请求内的数据展示和处理,页面重定向更适合在处理完某个请求后引导用户到另一个页面,尤其是需要跨请求传递的场景。
原文链接: https://blog.csdn.net/m0_73837751/article/details/142220041