java - Spring MVC : Resolving the view based on Us

Spring 版:2.5.6

我想根据 User-Agent header 的值将 View 解析为特定的速度文件。

我目前的思路是一个类似于 UrlBasedViewResolver 的实现,这样用户代理值根据匹配的正则表达式(键)映射(通过上下文)到特定目录(值)。

我几乎可以肯定有更简单的方法。

之前发布了一个类似的问题,关于基于 User-Agent 的主题确定。但是,我的理解是,主题更多地与静态(css、js)内容相关,而不是哪个文件处理实际的响应构造(HTML、XML 等)。

最佳答案

建议使用其他选项here

但是我解决了扩展 ContentNegotiatingViewResolver并覆盖 resolveViewName 方法,我调用了我的 ViewResolver HttpHeaderParamViewResolver。扩展方法如下所示:

@Override
public View resolveViewName(String viewName, Locale locale) throws Exception {
    //Get the HTTP Header param "User-Agent"
    String headerParamValue = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest().getHeader(headerParam);

    viewName = setViewName(viewName, headerParamValue);

    return super.resolveViewName(viewName, locale);
}

headerParam="User-Agent" (或您喜欢的任何其他 HTTp Header 参数,这是在 bean xml 中定义的),然后评估它并确定 viewName。在我的情况下,HttpHeaderParamViewResolver 可以配置一个 Map,其中键是要附加到实际 viewName 的前缀,值是用于评估 header 参数值的 RegExp。它在 App Context XML 中看起来像这样:

<bean id="HttpHeaderViewResolver" class="com.application.viewresolver.HttpHeaderParamViewResolver">
    <property name="viewResolvers">
        <list>
            <ref bean="tilesViewResolver"/>
        </list>
    </property>
    <property name="headerParam" value="User-Agent"/>
    <property name="viewPrefixPattern">
        <map>
            <entry>
                <key>
                    <value>mobile-webkit</value>
                </key>
                <value>iPhone.*Apple.*Mobile.*Safari</value>
            </entry>
            <entry>
                <key>
                    <value>mobile-bb</value>
                </key>
                <value>BlackBerry([0-9]{0,4})([a-zA-Z])?</value>
            </entry>
        </map>
    </property>
</bean>

这样,如果我的 Controller 调用一个名为 userDetails 的 View 并使用 iPhone 访问应用程序,第一个模式会捕获它并附加 mobile-webkit 后缀,因此 View 现在是 mobile-webkit-userDetails,然后将其传递给生成实际 View 的 tilesViewResolver

我探索了很多可能性,我认为这是我能想到的最简单、最灵活的方法。在这种情况下,选择完全不同的 View 的能力至关重要,因为我们支持各种各样的用户代理,从 WAP 到 iPhone 4 和支持 WebKit 的手机,因此 View 从用户代理到用户代理的变化很大。另一个优点是您不再需要在 View 上处理此问题,因为您可以拥有任意专业的 View 。另一个好的方面是,您可以很容易地实现这一点,而无需删除或更改您可能已经拥有的 View 解析器,因为 ContentNegotiatingViewResolver 能够按照您的特定顺序将 View 调用委托(delegate)给其他 View 解析器定义。

不利的一面是,您可能会倾向于过度专门化 View 并最终得到大量 View 文件,从而使应用程序成为可维护的噩梦。

希望对你有帮助。

关于java - Spring MVC : Resolving the view based on User-Agent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1868732/

相关文章:

spring - java 9模块从A和B读取包X

spring - Spring Boot 2 中的 EmbeddedServletContainer

spring - java.lang.ClassNotFoundException : org. a

java - STS Spring 与 Roo 和 Maven - 太慢了?

java - Spring REST Controller 返回带有空数据的 JSON

java - 使用 spring-hateoas 反序列化包含(_links 和 _embedded

spring - Spring 和 Java EE 中的 @PersistenceContext E

java - 如何将 bean 注入(inject)作用域实现?

spring - 如何在 apache 基准测试工具中限制每秒请求

java - 如何使用spring websocket向自定义用户发送自定义消息?