Java SpringMVC-移动设备访问时更改视图

Java SpringMVC-移动设备访问时更改视图,java,spring,spring-mvc,mobile-website,Java,Spring,Spring Mvc,Mobile Website,我想知道是否有人已经解决了这个问题。我有一个SpringMVC应用程序,我们正在为WebKit类型的手机(基本上是iPhone和Android)添加支持,所以我想知道有人找到了一种优雅的方法,根据发送请求的客户端定义特定视图 我知道控制器实现中的一个简单if可以实现这一点,但我正在寻找更灵活/优雅的东西(一个特定的viewsolver实现,或者一个拦截器) 非常感谢您的帮助。。。一如既往=) 这是一个很老的问题。您需要做的是以标准优雅的方式实现这一点更新:查看 原始答复: 创建一个自定义的vi

我想知道是否有人已经解决了这个问题。我有一个SpringMVC应用程序,我们正在为WebKit类型的手机(基本上是iPhone和Android)添加支持,所以我想知道有人找到了一种优雅的方法,根据发送请求的客户端定义特定视图

我知道控制器实现中的一个简单if可以实现这一点,但我正在寻找更灵活/优雅的东西(一个特定的viewsolver实现,或者一个拦截器)

非常感谢您的帮助。。。一如既往=)


这是一个很老的问题。您需要做的是以标准优雅的方式实现这一点更新:查看

原始答复:

创建一个自定义的
viewsolver
将非常简单,它基于
User-Agent
头解析视图

  • 是移动用户代理的列表(从wikipedia中删除的页面)。对照标题检查标题,并解析移动视图
  • 如果用户代理不是移动的,则返回
    null
    ,从而让其他解析程序解析视图
  • 确保以正确的顺序定义了解析程序(在SpringXML中),以便首先查询移动解析程序

    • 好的,我找到了一个更具体的答案。波佐提出的解决方案存在问题。视图解析程序不再有权访问HttpServletRequest。这里有一个但有点脏的IMHO


      这就是说,这是一个非常优雅且易于实现的方法。基本上,它包括一个定制的ViewResolver(正如Bozho所建议的那样),但它添加了一个handlerInterceptor,将用户代理添加到模型中,这样您就不必再手动添加它了。

      就像@Bohzo和您自己已经说过的,spring mobile是一个不错的选择

      从1.1版开始,您可以使用配置所描述的行为类型

      设备感知视图管理

      Spring Mobile包括AbstractDeviceDelegatingViewResolver,这是一个抽象的ViewResolver包装,它委托给另一个视图解析器实现,允许解析特定于设备的视图名称,而无需为每个视图定义专用映射。提供了一种轻量级实现,它支持根据呼叫设备是普通设备、移动设备还是基于平板电脑来调整视图名称

      在应用程序中,您可以为普通、移动或平板电脑设备创建备用视图,如果配置正确,Spring mobile将调整视图名称以解析为正确的视图。这在内部发生,无需通过控制器添加条件逻辑

      访问ViewResolver中的当前请求


      好吧,就一个问题。。。我是否仍然可以访问ViewResolver上的HTTP请求,如果是,我如何访问它而不将其专门传递给每个控制器?您可以从
      requestatributesholder
      (将属性转换为
      ServletRequestAttributes
      )获取请求是的,但这只能在控制器级别完成,除非您在模型中传递HTTPServletRequest,否则ViewResolver将不再获取HTTPServletRequest,这可能是不可取的。@Chepech所以您说ViewResolver中的
      RequestAttributeHold
      中没有任何内容?这是令人惊讶的。它不是:)RequestAttributeHolder是一个完全有效的Classic。我认为这是一个好主意。我为此而创作。
      HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
                  .getRequest();