轉自: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文件
