一尘不染

ViewResolver中的Spring-Mobile网站首选项不在每个控制器中

spring-mvc

所述弹簧移动文档示出了如何实现一个单独的移动视图层象下面这样:

@Controller
public class HomeController {

    @RequestMapping("/")
    public String home(SitePreference sitePreference, Model model) {
        if (sitePreference == SitePreference.MOBILE) {
            // prepare mobile view for rendering
            return "home-mobile";
        } else {
            // prepare normal view for rendering
            return "home";
        }
    }
}

但是,我更愿意在视图解析器中应用不同的视图名称(以文件夹开头)。我该怎么做?

(编辑:没有答案,通常spring config问题会有一些响应…我问过一个特别愚蠢的问题吗?)


阅读 211

收藏
2020-06-01

共1个答案

一尘不染

您的问题对我来说似乎有效。我能想到的最直接的答案是拆分视图并利用文件夹名称中的网站首选项值:

/views/normal/home.jsp
/views/mobile/home.jsp

(当然,视图解析器的前缀应为“ / views /”)。

现在,在控制器中,您可以拥有:

return sitePreference.name().toLowerCase() + "/home";

您不能使用两个单独的解析器,因为控制器无法决定使用哪个viewresolver,而只能决定使用哪个视图。

至于解析器的选择,只能通过“ order”属性进行控制,而此属性完全超出了此用例的范围。


编辑:我感觉到代码气味在所有控制器方法中都有相同的逻辑重复。

因此,为了使该逻辑保持在一个位置,请尝试使用一个自定义方法HandlerInterceptor,该postHandle方法将在方法的视图名称中添加前缀。您只需要根据request自己获取当前的SitePreference实例,这完全有可能。

2020-06-01