弹簧3 MVC弹簧控制器的默认视图

时间:2014-01-06 12:35:00

标签: java spring spring-mvc

我有一个简单的问题,但我无法在任何地方找到解决方案。

对于一个项目,我有一个控制器,它根据一些业务规则提取列表。我有多个RequestMappings和多个方法,但它们都应返回相同的视图。有没有办法为控制器指定默认视图? 目前我的代码如下所示:

@Controller
public class OverviewController {

    @RequestMapping("/{name}-games")
    public String getOverview(@PathVariable("name") String name) {
        // Code
        return "view";
    }

    @RequestMapping("/{category}")
    public String getCategory(@PathVariable("category") String category) {
        // Code
        return "view";
    }

    @RequestMapping("/special-{promo}-games")
    public String getSpecialPromo(@PathVariable("promo") String namepromo) {
        // Code
        return "view";
    }

}

我可以用return "view";替换return view();,但我希望找到更像注释的内容:

@DefaultView()
public String view() {
    return "view";
}

我无法在spring文档中找到任何此类内容。这是可能的还是整个设置错误开始?

3 个答案:

答案 0 :(得分:0)

根据Sping Reference

  

当没有显式提供此类逻辑视图名称时,RequestToViewNameTranslator接口确定逻辑视图名称。

(那时你的控制器方法返回ModelMapvoid。)

您可以实现此接口,但我认为在您的示例中,您可以做的最好的事情是定义CodeChimp建议的常量。

答案 1 :(得分:0)

你能否采用使用命令的多个视图解析器的方法?

让beanNameViewResolver的顺序为0,它会尝试将匹配的bean映射到您返回的modelAndView(在您的情况下为控制器通用)。

如果它不匹配,则可以将其默认为internalResourceViewResolver(order = 1)以提供默认行为。

答案 2 :(得分:0)

您的默认视图页面需要一些应通过Model Attribute发送的属性。假设,这些必需的模型属性在不同Business逻辑的所有方法中都是相同的。您可以将它们添加到Flash属性中并重定向到默认方法。

假设X1,X2属性在所有Handler方法中都是相同的,与Logic

无关
@Controller
@SessionAttribute({"X1","X2"})
public class OverviewController {

    @RequestMapping("/{name}-games")
    public String getOverview(@PathVariable("name") String name,final RedirectAttributes redirectAttributes) {
        // Code

        //add attributes requires for view in Flash attribute
         redirectAttributes.addFlashAttribute("X1", "X1");
         redirectAttributes.addFlashAttribute("X2", "X2");
        return "redirect:defaultview";
    }

    @RequestMapping("/{category}")
    public String getCategory(@PathVariable("category") String category,final RedirectAttributes redirectAttributes) {
        // Code
        //add attributes requires for view in Flash attribute
         redirectAttributes.addFlashAttribute("X1", "X1");
         redirectAttributes.addFlashAttribute("X2", "X2");
        return "redirect:defaultview";
    }

    @RequestMapping("/special-{promo}-games")
    public String getSpecialPromo(@PathVariable("promo") String namepromo,final RedirectAttributes redirectAttributes) {
        // Code
        //add attributes requires for view in Flash attribute
         redirectAttributes.addFlashAttribute("X1", "X1");
         redirectAttributes.addFlashAttribute("X2", "X2");
        return "redirect:defaultview";
    }

    @RequestMapping("defaultview")
    public String default(Model model) {

        //here you can access all attributes in Flash Map via Model Attribute
        // Code
        model.addAttribute("X1","X1");
        model.addAttribute("X1","X1");
        return "view";
    }

}

警告:您还必须在Session中添加requires属性,因为如果刷新页面,这可以避免众所周知的异常。

谢谢