springmvc 實現pc端手機端適配(同一個請求根據不同客戶端展示不同界面)


轉自:https://my.oschina.net/scipio/blog/477854

主要解決兩個問題:
A、對於mobile的請求和pc端的請求,自動使用不同的模板目錄
B、對於返回json還是返回ftl,由springMVC自己判斷,controller方法只寫一個

1、maven依賴

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

2、配置多內容版本

<!-- http://www.mkyong.com/spring-mvc/spring-3-mvc-contentnegotiatingviewresolver-example/ -->
    <bean class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">

        <property name="defaultContentType" value="text/html" />

        <property name="mediaTypes">
            <map>
                <!-- 告訴視圖解析器,.json的請求返回的類型為json格式 -->
                <entry key="json" value="application/json" />
            </map>
        </property>

        <property name="viewResolvers">
            <list>
                <ref bean="liteDeviceDelegatingViewResolver" />
            </list>
        </property>

        <property name="defaultViews">
            <list>
                <!-- 規范json返回內容 -->
                <bean class="com.yami.infrastructure.jsonview.AppJsonView">
                </bean>
            </list>
        </property>
    </bean>

配置.json的請求返回json,其他返回view

3、配置viewResolver

<!-- Mobile ViewResolver -->
    <bean id="liteDeviceDelegatingViewResolver" class="org.springframework.mobile.device.view.LiteDeviceDelegatingViewResolver">
        <constructor-arg>
            <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
                <property name="contentType" value="text/html; charset=UTF-8"/>
                <property name="cache" value="true"/>
                <property name="prefix" value=""/>
                <property name="suffix" value=".ftl"/>
                <property name="exposeSpringMacroHelpers" value="true"/>
                <property name="exposeRequestAttributes" value="true"/>
                <property name="exposeSessionAttributes" value="true"/>
                <property name="requestContextAttribute" value="request"/>
            </bean>
        </constructor-arg>
        <!--mobile 的請求走這里 -->
        <property name="mobilePrefix" value="mobile/"/>
        <property name="tabletPrefix" value="tablet/"/>
        <property name="enableFallback" value="true"/>
    </bean>

配置mobile來的請求ftl的走mobile目錄下模板

4、配置device判斷

<!-- spring mobile 配置-->
    <mvc:annotation-driven>
        <mvc:argument-resolvers>
            <!-- 讓Device支持在注解的controller中使用 -->
            <bean class="org.springframework.mobile.device.DeviceWebArgumentResolver" />
            <!-- 讓SitePreference支持在注解的controller中使用 -->
            <bean class="org.springframework.mobile.device.site.SitePreferenceWebArgumentResolver" />
        </mvc:argument-resolvers>
    </mvc:annotation-driven>

    <bean id="deviceResolverHandlerInterceptor" class="org.springframework.mobile.device.DeviceResolverHandlerInterceptor" />
    <bean id="sitePreferenceHandlerInterceptor" class="org.springframework.mobile.device.site.SitePreferenceHandlerInterceptor" />
    <mvc:interceptors>
        <ref bean="deviceResolverHandlerInterceptor" />
        <ref bean="sitePreferenceHandlerInterceptor" />
    </mvc:interceptors>

5.測試

/*
 * Copyright 2008-2018 shopxx.net. All rights reserved.
 * Support: http://www.shopxx.net
 * License: http://www.shopxx.net/license
 * FileId: mFgPu27MEMKx2FdJguKD8D8/mA79BmNG
 */
package net.shopxx.controller.shop;

import javax.inject.Inject;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import net.shopxx.service.ProductCategoryService;

/**
 * Controller - 商品分類
 * 
 * @author SHOP++ Team
 * @version 6.1
 */
@Controller("shopProductCategoryController")
@RequestMapping("/product_category")
public class ProductCategoryController extends BaseController {

    @Inject
    private ProductCategoryService productCategoryService;

    /**
     * 首頁
     */
    @GetMapping
    public String index(ModelMap model) {
        model.addAttribute("rootProductCategories", productCategoryService.findRoots(5,0));
        return "shop/product_category/index";
        //手機端過來執行了 return "shop/product_category/index" 但是最后實際走的是 return "mobile/shop/product_category/index"
    }
    
    @GetMapping("pointCategory")
    public String pointCategory(ModelMap model) {
        model.addAttribute("rootProductCategories", productCategoryService.findRoots(5,1));
        return "shop/product_category/index_point";
    }
    

注意:

 //手機端過來執行了 return "shop/product_category/index" 但是最后實際走的是 return "mobile/shop/product_category/index",也就是說你的mobile目錄下要包含這樣一個目錄文件:
shop/product_category/index,index其實是一個index.ftl文件

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM