这里我需要控制器方法,例如,
(案例1)一种方法是
@Controller
@requestMapping("main")
Class ControllerClass{
@RequestMapping("first", method = RequestMethod.POST)
public String post(Model model){
//processing
return "redirect:second";
}
@RequestMapping("second", method = RequestMethod.GET)
public String post(Model model){
//processing
return "myview";
}
}
和(案例2)另一种方式是
@Controller
@requestMapping("main")
Class ControllerClass{
@RequestMapping("first", method = RequestMethod.POST)
public String post(Model model){
//processing
return "redirect:/main/second";
}
@RequestMapping("second", method = RequestMethod.GET)
public String post(Model model){
//processing
return "myview";
}
}
两种方式都能正常工作,但我想知道哪种方法可以避免将来遇到的问题,例如我最近遇到的问题:
当我将请求从另一个控制器转发到 / main / first 时,我在使用案例1的代码中出现了404错误。
答案 0 :(得分:3)
根据Spring Documentation:
重定向:前缀
虽然RedirectView的使用工作正常,但如果控制器本身创建RedirectView,则无法避免控制器意识到重定向正在发生的事实。这实际上并不是最理想的,而是将事情过于紧密。控制器不应该真正关心如何处理响应。一般来说,它应该只根据注入的视图名称进行操作。
特殊重定向:前缀允许您完成此操作。如果返回的视图名称具有前缀redirect:,则UrlBasedViewResolver(以及所有子类)会将此识别为需要重定向的特殊指示。视图名称的其余部分将被视为重定向URL。
净效果与控制器返回RedirectView的效果相同,但现在控制器本身可以简单地按逻辑视图名称操作。逻辑视图名称(例如redirect:/ myapp / some / resource)将相对于当前Servlet上下文重定向,而重定向:http://myhost.com/some/arbitrary/path等名称将重定向到绝对URL。
大多数实时企业项目更喜欢在他们使用的所有控制器中使用案例2,这样不同控制器之间的内部调用就可以了。