我想知道是否有人已经解决了这个问题。我有一个 SpringMVC 应用程序,我们正在添加对 WebKit 类型手机(基本上是iPhone和Android)的支持,所以我想知道有人找到了一种优雅的方式来定义特定的视图取决于发送请求的客户端。
我知道在Controller实现中有一个简单的 if 可以解决问题,但我正在寻找更灵活/更优雅的东西(特定的ViewResolver实现,或者拦截器)。
帮助将非常感谢...一如既往=)
这是一个非常古老的问题。您需要做的是使用Spring-Mobile以标准的优雅方式实现这一目标
答案 0 :(得分:9)
更新:查看spring-mobile
原始答案:
创建基于ViewResolver
标头解析视图的自定义User-Agent
非常简单。
null
,从而让其他解析器解析视图。答案 1 :(得分:2)
就像@Bohzo一样,你自己已经说过spring-mobile是要走的路。
从版本1.1开始,您可以使用LiteDeviceDelegatingViewResolver配置您所描述的行为类型。
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();