我想知道是否有人已经解决了这个问题。我有一个 用SpringMVC 应用程序,我们正在添加支持 WebKit的 类型移动(基本上是iPhone和Android)所以我想知道有人找到了一种优雅的方式来定义特定的视图,具体取决于发送请求的客户端。
我知道这很简单 如果 在Controller实现中可以做到这一点,但我正在寻找更灵活/更优雅的东西(特定的ViewResolver实现,或者拦截器)。
将非常感谢帮助......一如既往=)
这是一个非常古老的问题。你需要做的是使用 弹簧手机 以标准的优雅方式实现这一目标
更新:看看 弹簧移动
原始答案:
创建自定义将非常简单 ViewResolver
基于的解析视图 User-Agent
头。
- 这里 是一个移动用户代理列表(从维基百科中删除页面)。检查标题,并解决移动视图。
- 如果用户代理不是移动设备,则返回
null
,从而让其他解析器解析视图。
- 确保你的解析器以正确的顺序定义(在spring xml中),以便首先查询移动解析器。
就像@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将调整视图名称以解析为正确的视图。这在内部发生,无需通过控制器添加条件逻辑。
好的,我找到了一个更具体的答案。 Bozho提出的解决方案存在问题。这个事实 ViewResolvers 再也无法访问了 HttpServletRequest的。有一个 访问请求的方式 但它有点肮脏的恕我直言。
所以说,这是一个非常优雅和易于实现 解。基本上它涉及一个自定义ViewResolver(如Bozho建议的那样),但它添加了一个handlerInterceptor,它将User-Agent添加到模型中,因此您不必再手动添加它。