Spring MVC中重定向和视图呈现的区别

时间:2015-04-10 11:45:40

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

在学习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:/作为返回类型发布?

3 个答案:

答案 0 :(得分:7)

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

@RequestMapping(method = RequestMethod.POST)
public String add(@Valid AppointmentForm appointment, BindingResult result) {
    if (result.hasErrors()) {

此处,当结果出错时,会呈现视图appointments/new,以便用户可以输入正确的详细信息并再次添加应用程序。 网址不会在浏览器中更改

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

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

    return "redirect:/appointments";
}

关于forward: vs redirect:

引用此Satckoverflow回答Why do we use redirect in Spring MVC

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

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

答案 1 :(得分:2)

返回视图名称,例如:

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

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

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

答案 2 :(得分:-1)

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