问题 SpringMVC - 移动访问时更改视图


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

我知道这很简单 如果 在Controller实现中可以做到这一点,但我正在寻找更灵活/更优雅的东西(特定的ViewResolver实现,或者拦截器)。

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


这是一个非常古老的问题。你需要做的是使用 弹簧手机 以标准的优雅方式实现这一目标


2113
2017-09-01 16:26


起源

我认为这是一个好主意。我创建 JIRA问题 为了这。 - earldouglas


答案:


更新:看看 弹簧移动

原始答案:

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

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

9
2017-09-01 16:49



好吧,只关注一个问题......我是否仍然可以访问ViewResolver上的HTTP请求,如果是这样,我如何在没有专门传递给每个控制器的情况下访问它? - Chepech
您可以从中获取请求 RequestAtrributesHolder (将属性转换为 ServletRequestAttributes) - Bozho
是的,但是只能在Controller级别完成,ViewResolver不再获取HTTPServletRequest,除非你在模型中传递它,这可能是不可取的。 - Chepech
@Chepech所以你说什么都没有 RequestAttributeHolder 在ViewResolver?这令人惊讶。 - Bozho
不,它有效,但有点脏 - Chepech


就像@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
2017-07-03 22:37





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

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


1
2017-09-09 17:45