<dependency>
<groupId>org.springframework.mobile</groupId>
<artifactId>spring-mobile-device</artifactId>
<version>1.0.0.M3</version>
</dependency>
기존에 3.0.6을 사용하고 있었는데 이거 하는김에 3.1.1로 버전업을 했다. 아..ㅅㅂ 여기저기서 환경 설정 오류..
- 그동안 쓰던 google annotation cache 의 의존성이 3.0.6 contexts .. 해서 제거.(어짜피 3.1 에서는 추상화된 캐시를 제공한다.
spring-servlet.xml
<mvc:annotation-driven>
<mvc:argument-resolvers>
<beans:bean class="org.springframework.mobile.device.DeviceWebArgumentResolver" />
</mvc:argument-resolvers>
</mvc:annotation-driven>
<mvc:interceptors>
<beans:bean class="org.springframework.mobile.device.DeviceResolverHandlerInterceptor" />
</mvc:interceptors>
Device 정보에 대한 처리를 해준데. 레퍼런스를 보면 interceptors 에 아래의 bean을 지정해주면 Device가 모바일의 경우 m.mydomain.com 으로 전환시켜준단다. 이건 필요없으니 Pass
<beans:bean class="org.springframework.mobile.device.switcher.SiteSwitcherHandlerInterceptor" factory-method="mDot">
<beans:constructor-arg value="mylocal.com" />
</beans:bean>
뭐 예제에서는 Controller 메소드 마다 Device 파라메터나 SitePreference 를 받는데 상위 클래스 하나 만들어서 처리하자.
DeviceSwitcherController.java
abstract public class DeviceSwitcherController {
protected String forward(String viewName) {
Device device = DeviceUtils.getCurrentDevice(RequestContextHolder.currentRequestAttributes());
if (device.isMobile()) {
return viewName + ".mobile";
}
return viewName;
}
protected String redirect(String redirectPath) {
return "redirect:" + redirectPath;
}
}
실제 컨트롤러.
@Controller
public class HomeController extends DeviceSwitcherController {
@RequestMapping(value = { "/", "/index", "/home" }, method = RequestMethod.GET)
public String home(Model model) throws Exception {
return forward("index");
}
}
forward(viewName)으로 주면 된다. redirect의 경우 형평성을 위해 만들어 주었다. ㅡㅡ;
그럼 jsp는 이렇게 두개를 만들어 주면 된다.
index.jsp index.mobile.jsp
그리고 일반 브라우저에서 local.mydomain.com 을 실행하면 index.jsp가..
브라우저의 Agent를 모바일 계열로 변경 후, 실행하면 index.mobile.jsp 가 실행될 것이다.
---- 2차업뎃 ----
재성이형(javajigi)과 꼭 상속을 통해서 해야 하냐를 논하면서 형이 아이디어를 멋지게 내주셨다. 해서 수정된 코드는 Resolver를 커스텀으로 돌려 버리는 것.
MobileInternalResourceViewResolver.java
package com.tistory.eclipse4j.controller;
import java.util.Locale;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.mobile.device.Device;
import org.springframework.mobile.device.DeviceUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.servlet.view.AbstractUrlBasedView;
import org.springframework.web.servlet.view.InternalResourceView;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
public class MobileInternalResourceViewResolver extends InternalResourceViewResolver {
private Logger logger = LoggerFactory.getLogger(MobileInternalResourceViewResolver.class);
@Override
protected AbstractUrlBasedView buildView(String viewName) throws Exception {
Device device = DeviceUtils.getCurrentDevice(RequestContextHolder.currentRequestAttributes());
if (device.isMobile()) {
viewName = getMobileViewName(viewName);
}
logger.debug("ViewName : {}", viewName);
return (InternalResourceView) super.buildView(viewName);
}
private String getMobileViewName(String viewName) {
return viewName + ".mobile";
}
@Override
protected Object getCacheKey(String viewName, Locale locale) {
Device device = DeviceUtils.getCurrentDevice(RequestContextHolder.currentRequestAttributes());
if (device.isMobile()) {
return super.getCacheKey(getMobileViewName(viewName), locale);
} else {
return super.getCacheKey(viewName, locale);
}
}
}
spring-controllers.xml
<bean id="jspViewResolver" class="com.tistory.eclipse4j.controller.MobileInternalResourceViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>