在Spring Controller中重定向的最佳实践

时间:2014-07-18 06:49:25

标签: java spring spring-mvc

这里我需要控制器方法,例如,

(案例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错误。

1 个答案:

答案 0 :(得分:3)

根据Spring Documentation:

重定向:前缀

虽然RedirectView的使用工作正常,但如果控制器本身创建RedirectView,则无法避免控制器意识到重定向正在发生的事实。这实际上并不是最理想的,而是将事情过于紧密。控制器不应该真正关心如何处理响应。一般来说,它应该只根据注入的视图名称进行操作。

特殊重定向:前缀允许您完成此操作。如果返回的视图名称具有前缀redirect:,则UrlBasedViewResolver(以及所有子类)会将此识别为需要重定向的特殊指示。视图名称的其余部分将被视为重定向URL。

净效果与控制器返回RedirectView的效果相同,但现在控制器本身可以简单地按逻辑视图名称操作。逻辑视图名称(例如redirect:/ myapp / some / resource)将相对于当前Servlet上下文重定向,而重定向:http://myhost.com/some/arbitrary/path等名称将重定向到绝对URL。

大多数实时企业项目更喜欢在他们使用的所有控制器中使用案例2,这样不同控制器之间的内部调用就可以了。