SpringMVC - 移动访问时更改视图

时间:2010-09-01 16:26:53

标签: java spring spring-mvc mobile-website

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

我知道在Controller实现中有一个简单的 if 可以解决问题,但我正在寻找更灵活/更优雅的东西(特定的ViewResolver实现,或者拦截器)。

帮助将非常感谢...一如既往=)


这是一个非常古老的问题。您需要做的是使用Spring-Mobile以标准的优雅方式实现这一目标

4 个答案:

答案 0 :(得分:9)

更新:查看spring-mobile

原始答案:

创建基于ViewResolver标头解析视图的自定义User-Agent非常简单。

  • here是移动用户代理列表(从维基百科中删除的页面)。检查标题,然后解析移动视图。
  • 如果用户代理不是移动设备,则返回null,从而让其他解析器解析视图。
  • 确保您的解析器以正确的顺序定义(在spring xml中),以便首先咨询移动解析器。

答案 1 :(得分:2)

就像@Bohzo一样,你自己已经说过spring-mobile是要走的路。

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

设备感知视图管理

http://static.springsource.org/spring-mobile/docs/current/reference/html/device.html#device-aware-view-management

  

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

     

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

答案 2 :(得分:1)

好的,我找到了一个更具体的答案。 Bozho提出的解决方案存在问题。 ViewResolvers 无法再访问 HttpServletRequest 这一事实。有一个way to access the request,但它有点肮脏的恕我直言。

所以说,这是一个非常优雅且易于实现的solution。基本上它涉及一个自定义的ViewResolver(如Bozho建议的那样),但它添加了一个handlerInterceptor,它将User-Agent添加到模型中,因此您不必再手动添加它。

答案 3 :(得分:0)

<块引用>

在 ViewResolvers 中访问当前请求。

HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
            .getRequest();