본문 바로가기

Programming!

Spring mobile 설정하기.

가장 기본이 되는 Spring pom.xml 에 다음을 추가 했다.

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

}

}



실제 컨트롤러.
HomeController.java

@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>