Spring Mobile指南

2023/05/12

1. 概述

Spring Mobile是对流行的Spring Web MVC框架的现代扩展,有助于简化需要与跨设备平台完全或部分兼容的Web应用程序的开发,工作量最小,样板代码更少。

在本文中,我们将了解Spring Mobile项目,并将构建一个示例项目来突出Spring Mobile的用途。

2. Spring Mobile的特点

  • 自动设备检测:Spring Mobile具有内置的服务器端设备解析器抽象层。这会分析所有传入的请求并检测发送方设备信息,例如设备类型、操作系统等
  • 站点偏好管理:使用站点偏好管理,Spring Mobile允许用户选择网站的手机/平板电脑/普通视图。这是一种相对不推荐使用的技术,因为通过使用DeviceDelegatingViewresolver我们可以根据设备类型保留视图层,而不需要用户端的任何输入
  • 站点切换器:站点切换器能够根据用户的设备类型(即移动设备、桌面设备等)自动将用户切换到最合适的视图
  • 设备感知视图管理器:通常,根据设备类型,我们将用户请求转发到旨在处理特定设备的特定站点。Spring Mobile的视图管理器使开发人员可以灵活地将所有视图置于预定义格式中,并且Spring Mobile将根据设备类型自动管理不同的视图

3. 构建应用程序

现在让我们使用带有Spring Boot和Freemarker模板引擎的Spring Mobile创建一个演示应用程序,并尝试使用最少的编码来捕获设备详细信息。

3.1 Maven依赖项

在开始之前,我们需要在pom.xml中添加以下Spring Mobile依赖项:

<dependency>
    <groupId>org.springframework.mobile</groupId>
    <artifactId>spring-mobile-device</artifactId>
    <version>2.0.0.M3</version>
</dependency>

请注意,最新的依赖项在Spring Milestones仓库中可用,因此我们也将其添加到我们的pom.xml中:

<repositories>
    <repository>
        <id>spring-milestones</id>
        <name>Spring Milestones</name>
        <url>https://repo.spring.io/libs-milestone</url>
        <snapshots>
            <enabled>false</enabled>
        </snapshots>
    </repository>
</repositories>

3.2 创建Freemarker模板

首先,让我们使用Freemarker创建我们的index页面。不要忘记添加必要的依赖项以启用Freemarker的自动配置。

由于我们正在尝试检测发送方设备并相应地路由请求,因此我们需要创建三个单独的Freemarker文件来解决这个问题;一个处理移动请求,另一个处理平板电脑,最后一个(默认)处理普通浏览器请求。

我们需要在src/main/resources/templates下创建两个名为“mobile”和“tablet”的文件夹,并相应地放置Freemarker文件。最终的结构应该是这样的:

└── src
    └── main
        └── resources
            └── templates
                └── index.ftl
                └── mobile
                    └── index.ftl
                └── tablet
                    └── index.ftl

现在,让我们将以下HTML放入index.ftl文件中:

<h1>You are into browser version</h1>

根据设备类型,我们将更改<h1>标签内的内容,

3.3 启用DeviceDelegatingViewresolver

要启用Spring Mobile DeviceDelegatingViewresolver服务,我们需要将以下属性放入application.properties中:

spring.mobile.devicedelegatingviewresolver.enabled=true

当你包含Spring Mobile Starter时,在Spring Boot中默认启用站点首选项功能。但是,可以通过将以下属性设置为false来禁用它:

spring.mobile.sitepreference.enabled=true

3.4 添加Freemarker属性

为了让Spring Boot能够找到并呈现我们的模板,我们需要将以下内容添加到我们的application.properties中:

spring.freemarker.template-loader-path=classpath:/templates
spring.freemarker.suffix=.ftl

3.5 创建控制器

现在我们需要创建一个Controller类来处理传入的请求。我们将使用简单的@GetMapping注解来处理请求:

@Controller
public class IndexController {

    @GetMapping("/")
    public String greeting(Device device) {
        String deviceType = "browser";
        String platform = "browser";
        String viewName = "index";

        if (device.isNormal()) {
            deviceType = "browser";
        } else if (device.isMobile()) {
            deviceType = "mobile";
            viewName = "mobile/index";
        } else if (device.isTablet()) {
            deviceType = "tablet";
            viewName = "tablet/index";
        }

        platform = device.getDevicePlatform().name();

        if (platform.equalsIgnoreCase("UNKNOWN")) {
            platform = "browser";
        }

        return viewName;
    }
}

这里有几点需要注意:

  • 在处理程序映射方法中,我们传递org.springframework.mobile.device.Device。这是每个请求中注入的设备信息。这是由我们在application.properties中启用的DeviceDelegatingViewresolver完成的
  • org.springframework.mobile.device.Device有几个内置方法,如isMobile()、isTablet()、getDevicePlatform()等。使用这些我们可以捕获我们需要的所有设备信息并使用它

3.6 Java配置

要在Spring Web应用程序中启用设备检测,我们还需要添加一些配置:

@Configuration
public class AppConfig implements WebMvcConfigurer {

    @Bean
    public DeviceResolverHandlerInterceptor deviceResolverHandlerInterceptor() {
        return new DeviceResolverHandlerInterceptor();
    }

    @Bean
    public DeviceHandlerMethodArgumentResolver deviceHandlerMethodArgumentResolver() {
        return new DeviceHandlerMethodArgumentResolver();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(deviceResolverHandlerInterceptor());
    }

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(deviceHandlerMethodArgumentResolver());
    }
}

我们快完成了。最后要做的一件事是构建一个Spring Boot配置类来启动应用程序:

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

4. 测试应用程序

一旦我们启动应用程序,它将在http://localhost:8080上运行。

我们将使用Google Chrome的开发者控制台来模拟不同类型的设备。我们可以通过按Ctrl + Shift + I或按F12来启用它。

默认情况下,如果我们打开主页,我们可以看到Spring Web正在将设备检测为桌面浏览器。我们应该看到以下结果:

现在,在控制台面板上,我们单击左上角的第二个图标。它将启用浏览器的移动视图。

我们可以在浏览器的左上角看到一个下拉菜单。在下拉菜单中,我们可以选择不同种类的设备类型。要模拟移动设备,让我们选择Nexus 6P并刷新页面。

刷新页面后,我们会注意到页面的内容发生了变化,因为DeviceDelegatingViewresolver已经检测到最后一个请求来自移动设备。因此,它传递在模板的mobile文件夹中的index.ftl文件。

结果如下:

同样,我们将模拟平板电脑版本。让我们像上次一样从下拉列表中选择iPad并刷新页面。内容会被改变,它应该被渲染为平板电脑视图:

现在,我们将查看站点首选项功能是否按预期工作。

要模拟用户希望以移动友好的方式查看网站的实时场景,只需在默认URL的末尾添加以下URL参数:

?site_preference=mobile

刷新后,视图应自动移动到移动视图,即会显示以下文本“You are into mobile version”。

以同样的方式模拟平板电脑首选项,只需在默认URL末尾添加以下URL参数:

?site_preference=tablet

就像上次一样,视图应该会自动刷新为平板电脑视图。

请注意,默认URL将保持不变,如果用户再次使用默认URL,用户将被重定向到基于设备类型的相应视图。

5. 总结

我们刚刚创建了一个Web应用程序并实现了跨平台功能。从生产力的角度来看,这是一个巨大的性能提升。Spring Mobile消除了许多前端脚本来处理跨浏览器行为,从而减少了开发时间

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章