主要解决两个问题:
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、测试
@RequestMapping("multiview")
public String multiview(ModelMap model){
model.addAttribute("hello","world");
return "multiView";
}
或者返回modelAndView也可以
请求/multiview.json,返回json格式
请求/multiview返回页面(mobile端的走mobile目录下的同名模板)