知識庫 / Spring RSS 訂閱

Spring Mobile 指南

Spring
HongKong
3
02:41 PM · Dec 06 ,2025

1. 概述

Spring Mobile 是一個現代化的擴展,用於流行的 Spring Web MVC 框架,它能幫助簡化對需要與跨設備平台完全或部分兼容的 Web 應用程序的開發工作,並儘可能減少開發工作量和樣板代碼。

在本文中,我們將學習 Spring Mobile 項目,並構建一個示例項目,以突出展示 Spring Mobile 的使用。

2. Spring Mobile 的特性

  • 自動設備檢測: Spring Mobile 內置了服務器端設備解析抽象層。它分析所有傳入的請求,檢測發送者的設備信息,例如設備類型、操作系統等。
  • 站點偏好管理: 通過站點偏好管理,Spring Mobile 允許用户選擇網站的移動/平板/正常視圖。由於使用 DeviceDelegatingViewresolver,我們可以根據設備類型持久化視圖層,而無需從用户端獲取任何輸入,因此該技術已相對過時。
  • 站點切換器: 站點切換器能夠根據用户的設備類型(即移動設備、桌面設備等)自動將用户切換到最合適的視圖。
  • 設備感知視圖管理器: 通常,我們根據設備類型將用户請求轉發到專門處理特定設備站點。Spring Mobile 的 View Manager 允許開發者將所有視圖放入預定義的格式中,Spring Mobile 將根據設備類型自動管理不同視圖。

3. 構建應用程序

現在,讓我們使用 Spring Mobile、Spring Boot 和 Freemarker 模板引擎 構建一個演示應用程序,並嘗試用最少的編碼量捕獲設備信息。

3.1. Maven 依賴

在開始之前,我們需要在 `pom.xml</em/> 中添加以下 Spring Mobile 依賴:

<dependency>
    <groupId>org.springframework.mobile</groupId>
    <artifactId>spring-mobile-device</artifactId>
    <version>1.1.5.RELEASE</version>
</dependency>

3.2. 創建 Freemarker 模板

首先,讓我們使用 Freemarker 創建我們的索引頁面。請務必添加必要的依賴項以啓用 Freemarker 的自動配置。

由於我們試圖檢測發送者的設備並相應地路由請求,因此我們需要創建三個單獨的 Freemarker 文件來解決這個問題:一個用於處理移動請求,另一個用於處理平板電腦請求,最後一個(默認)用於處理普通瀏覽器請求。

我們需要在 src/main/resources/templates 目錄下創建兩個名為 <em >mobile</em ><em >tablet</em > 的文件夾,並將 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
<div>
 <p>站點偏好功能默認情況下在您包含 Spring Mobile starter 時啓用。但是,可以通過將以下屬性設置為 false 來禁用它:</p>
</div>
spring.mobile.sitepreference.enabled: true
<div>
  <h1>Introduction</h1>
  <p>This document provides an overview of the new API. It covers the key features, usage examples, and troubleshooting tips.</p>
  <h2>Key Features</h2>
  <ul>
    <li><strong>Authentication:</strong> Supports OAuth 2.0</li>
    <li><strong>Data Storage:</strong> Uses a NoSQL database</li>
    <li><strong>API Versioning:</strong> Implements semantic versioning</li>
  </ul>
  <pre>
    <code>
      function calculateSum(a, b) {
        return a + b;
      }
    </code>
  </pre>
  <p>To use the API, you'll need to obtain an API key.  Please refer to the <a href="https://example.com/docs/api-key">API Key Documentation</a> for more details.</p>
  <h2>Troubleshooting</h2>
  <h3>Common Issues</h3>
  <ol>
    <li><strong>Connection Errors:</strong> Check your network connection.</li>
    <li><strong>Authentication Errors:</strong> Verify your API key is valid.</li>
  </ol>
</div>

3.4. 添加 Freemarker 屬性

為了使 Spring Boot 能夠找到並渲染我們的模板,我們需要將以下內容添加到我們的 <em >application.properties</em >> 中:

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;
    }
}

以下是一些需要注意的事項:

  • 在handler mapping方法中,我們傳遞了 org.springframework.mobile.device.Device。這是與每個請求關聯的注入設備信息。這由 DeviceDelegatingViewresolver 負責,該配置已在 apllication.properties 中啓用。
  • 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 並刷新頁面。 內容將更改,並且應該被視為平板電腦視圖:

現在,我們將檢查 Site Preference 功能是否按預期工作。

要模擬用户以移動友好方式查看網站的實時場景,請在默認 URL 的末尾添加以下 URL 參數:

?site_preference=mobile

刷新後,視圖應自動切換到移動視圖,即“您正在使用移動版本”的文本將被顯示。

同樣,為了模擬平板設備偏好,只需在默認 URL 的末尾添加以下 URL 參數:

?site_preference=tablet

與上次類似,視圖應自動刷新為平板視圖。

請注意,默認 URL 將保持不變,如果用户再次通過默認 URL 訪問,則用户將被重定向到根據設備類型對應的視圖。

5. 結論

我們已經創建了一個Web應用程序並實現了跨平台功能。從生產力角度來看,它具有顯著的性能提升。<strong>Spring Mobile 通過消除大量的前端腳本來處理跨瀏覽器行為,從而減少了開發時間。</strong>

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.