Spring MVC 中重定向和视图渲染的区别
Difference between redirect and view rendering in Spring MVC
在学习SpringMVC知识的过程中,有一些关于Springreturn类型的东西让我很困惑。
在本文档中: Mapping Requests With @RequestMapping 他们 return appointments/new
和 redirect:/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";
}
这两种 return 类型之间的主要区别是什么?据我了解,第一种类型 returns 作为前向动作,但如果我是对的,为什么他们也将 forward:/
发布为 return 类型?
第一个 returns 视图,而后者重定向到另一个控制器请求映射操作。让我们看看代码本身。
@RequestMapping(method = RequestMethod.POST)
public String add(@Valid AppointmentForm appointment, BindingResult result) {
if (result.hasErrors()) {
return "appointments/new";
}
这里当结果有错误时,它会呈现视图 appointments/new
以便用户可以输入正确的详细信息并再次添加预约。 URL在浏览器中不会改变
appointmentBook.addAppointment(appointment);
return "redirect:/appointments";
}
但是在这里,当结果没有错误时,此控制器操作将网站重定向到 URL /appointments。检查网页浏览器 URL 已更改为重定向的 URL
关于 forward:
与 redirect:
引自这个 Satckoverflow 回答 Why do we use redirect in Spring MVC
在您的控制器中使用重定向前缀将生成带有 302 状态代码和指向重定向 URL 的位置 header 的 HTTP 响应。然后浏览器将重定向到 URL(第一个请求中公开的模型将丢失, 浏览器 URL 将是第二个 )。
使用转发前缀,转发将由servlet在内部完成,因此不需要第二次请求(URL将保持不变)。转发前缀只应用于浏览器可以安全重复的请求。当您发送更改数据库状态的表单时情况并非如此(重新加载浏览器将导致重复提交)。在这些情况下,您应该使用重定向并应用 POST-redirect-GET 模式。
硒thislink。
它解释了重定向和转发之间的区别
做一个return的视图名,如:
return new ModelAndView(<viewpath>/<viewname>);
不执行转发或重定向,而是实际抓取文件服务器端并将其作为浏览器输出进行处理。
当您 return 一个 "redirect:/somePath"
它实际上是向浏览器发送重定向(而不是转发)。重定向导致页面刷新并发生在浏览器中,转发发生在服务器端并且不会更改您的 URL.
在学习SpringMVC知识的过程中,有一些关于Springreturn类型的东西让我很困惑。
在本文档中: Mapping Requests With @RequestMapping 他们 return appointments/new
和 redirect:/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";
}
这两种 return 类型之间的主要区别是什么?据我了解,第一种类型 returns 作为前向动作,但如果我是对的,为什么他们也将 forward:/
发布为 return 类型?
第一个 returns 视图,而后者重定向到另一个控制器请求映射操作。让我们看看代码本身。
@RequestMapping(method = RequestMethod.POST)
public String add(@Valid AppointmentForm appointment, BindingResult result) {
if (result.hasErrors()) {
return "appointments/new";
}
这里当结果有错误时,它会呈现视图 appointments/new
以便用户可以输入正确的详细信息并再次添加预约。 URL在浏览器中不会改变
appointmentBook.addAppointment(appointment);
return "redirect:/appointments";
}
但是在这里,当结果没有错误时,此控制器操作将网站重定向到 URL /appointments。检查网页浏览器 URL 已更改为重定向的 URL
关于 forward:
与 redirect:
引自这个 Satckoverflow 回答 Why do we use redirect in Spring MVC
在您的控制器中使用重定向前缀将生成带有 302 状态代码和指向重定向 URL 的位置 header 的 HTTP 响应。然后浏览器将重定向到 URL(第一个请求中公开的模型将丢失, 浏览器 URL 将是第二个 )。
使用转发前缀,转发将由servlet在内部完成,因此不需要第二次请求(URL将保持不变)。转发前缀只应用于浏览器可以安全重复的请求。当您发送更改数据库状态的表单时情况并非如此(重新加载浏览器将导致重复提交)。在这些情况下,您应该使用重定向并应用 POST-redirect-GET 模式。
硒thislink。 它解释了重定向和转发之间的区别
做一个return的视图名,如:
return new ModelAndView(<viewpath>/<viewname>);
不执行转发或重定向,而是实际抓取文件服务器端并将其作为浏览器输出进行处理。
当您 return 一个 "redirect:/somePath"
它实际上是向浏览器发送重定向(而不是转发)。重定向导致页面刷新并发生在浏览器中,转发发生在服务器端并且不会更改您的 URL.