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

时间:2011-12-08 15:21:55

标签: spring spring-mvc spring-mobile

spring mobile documentation显示了如何实现单独的移动视图层,如下所示:

@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";
        }
    }
}

但是,我更喜欢在视图解析器中应用不同的视图名称(前缀为文件夹)。我该怎么做?

(编辑:没有答案,通常春季配置问题有一些回复......我问过一个特别愚蠢的问题吗?)

1 个答案:

答案 0 :(得分:1)

你的问题似乎对我有用。我能想到的最直接的答案是分割视图并使用文件夹名称中的站点首选项值:

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

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

现在在控制器中你可以:

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

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

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


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

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