【问题标题】:Difference between redirect and view rendering in Spring MVCSpring MVC 中重定向和视图渲染的区别
【发布时间】:2015-06-16 03:00:36
【问题描述】:

在学习Spring MVC知识的过程中,有一些关于Spring返回类型的东西让我很困惑。

在本文档中: Mapping Requests With @RequestMapping 他们返回 appointments/newredirect:/appointments

代码

@RequestMapping(method = RequestMethod.POST)
public String add(@Valid AppointmentForm appointment, BindingResult result) {
    if (result.hasErrors()) {
        return "appointments/new";
    }
    appointmentBook.addAppointment(appointment);
    return "redirect:/appointments";
}

这两种返回类型的主要区别是什么?据我了解,第一种类型作为前向操作返回,但如果我是对的,为什么他们还将forward:/ 作为返回类型发布?

【问题讨论】:

    标签: java spring spring-mvc model-view-controller


    【解决方案1】:

    第一个返回视图,而后者重定向到另一个控制器请求映射操作。让我们从代码本身来看。

    @RequestMapping(method = RequestMethod.POST)
    public String add(@Valid AppointmentForm appointment, BindingResult result) {
        if (result.hasErrors()) {
            return "appointments/new";
        }
    

    当结果有错误时,它会渲染视图appointments/new,以便用户可以输入正确的详细信息并再次添加应用程序。 网址在浏览器中不会改变

        appointmentBook.addAppointment(appointment);
        return "redirect:/appointments";
    }
    

    但是在这里,当结果没有错误时,此控制器操作会将网站重定向到 URL /appointments。检查网页浏览器改成重定向网址的网址

    关于forward:redirect:

    引自这个 Satckoverflow 答案Why do we use redirect in Spring MVC

    在控制器中使用重定向前缀将生成带有 302 状态代码和指向重定向 URL 的位置标头的 HTTP 响应。然后浏览器将重定向到该 URL(第一个请求中暴露的模型将丢失,浏览器 URL 将是第二个)。

    使用转发前缀,转发将由 servlet 在内部完成,因此不需要第二次请求(URL 将保持不变)。前向前缀应该只用在浏览器可以安全重复的请求中。当您发送更改数据库状态的表单时,情况并非如此(重新加载浏览器将导致重复提交)。在这些情况下,您应该使用重定向并应用 POST-redirect-GET 模式。

    【讨论】:

    • 谢谢你帮我扫除障碍
    【解决方案2】:

    做一个视图名的返回,如:

    return new ModelAndView(<viewpath>/<viewname>);
    

    不进行转发或重定向,而是实际抓取文件服务器端并将其作为浏览器输出处理。

    当您返回 "redirect:/somePath" 时,它实际上是在向浏览器发送重定向(而不是转发)。重定向会导致页面刷新并发生在浏览器中,而转发发生在服务器端并且不会更改您的 URL。

    【讨论】:

      【解决方案3】:

      Se this 链接。 它解释了重定向和转发之间的区别

      【讨论】:

      • 仅链接的答案无效。 最好包含帖子中的一些相关部分并提供链接以获取更多信息。
      猜你喜欢
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-21
      • 1970-01-01
      • 1970-01-01
      • 2015-05-09
      相关资源
      最近更新 更多