한프로젝트에 모바일과 일반 그리고 테블릿을 분류하기위해 Request 의 Header Agent 값을 분석하여 분기 하여 사용할수 있다.
뭔가 좋은게 더 없을까? 생각하고 찾아보니 Spring Mobile Project가 언젠지 모르게 생겨나있다.
http://projects.spring.io/spring-mobile/ , https://spring.io/guides/gs/serving-mobile-web-content/
아니나 다를까 중간 prefix 를 알아서 만들어준다.
1. 첫번째 방법 Spring Boot 의 properties spring.mobile.devicedelegatingviewresolver.enabled 을 활성화
수동으로 하고자한다면 @RequestMapplig method 인자값에 Device를 넣어 수동으로 체크도 가능.
...
private String mainPage1 (HttpServletRequest request , Device device ,ModelMap modelMap) throws Exception {
logger.debug("WELCOME !!! ");
device.getDevicePlatform();
...
우리의 주목적은 자동이기때문에 자동분기된 녀석을 이용하기 위해 아래와 같이 셋팅한다.
*pom.xml
<dependency>
<groupId>org.springframework.mobile</groupId>
<artifactId>spring-mobile-device</artifactId>
</dependency>
*application-dev.properties
....
#use jsp
spring.mobile.devicedelegatingviewresolver.enabled=true
spring.mobile.devicedelegatingviewresolver.mobile-suffix=.mobile
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
devicedelegatingviewresolver 를 활성화 하여 준다. 기본 mobile , teblet 이 prefix로 붙어 나온다. 프로퍼티를 추가하여 수정이 된다.
*프로퍼티 설명 참고
http://jjaekjjaek.tistory.com/entry/spring-boot-applcationproperties%ED%8C%8C%EC%9D%BC-%EC%84%A4%EB%AA%85
*TilesConfig.java
@Configuration
public class TilesConfig {
@Bean
public TilesConfigurer tilesConfigurer() {
final TilesConfigurer configurer = new TilesConfigurer();
configurer.setDefinitions(new String[] {"WEB-INF/tiles/tiles.xml"
,"WEB-INF/tiles/tilesAdmin.xml"
,"WEB-INF/tiles/tilesUser.xml"});
configurer.setCheckRefresh(true);
return configurer;
}
@Bean
public TilesViewResolver tilesViewResolver() {
final TilesViewResolver tilesViewResolver = new TilesViewResolver();
Properties props = new Properties();
props.setProperty("mobilePrefix", "mobile/");
tilesViewResolver.setOrder(0);
tilesViewResolver.setAttributes(props);
tilesViewResolver.setViewClass(TilesView.class);
return tilesViewResolver;
}
}
tilesViewResolver의 Order 값을 최상위로 높여 주지 않으면 앞서 프로퍼티에서 생성한
LiteDeviceDelegatingViewResolver에의해 ContentNegotiatingViewResolver 에서 org.springframework.web.servlet.view.JstlView 이 실행되어 Tiles가 동작하지 않게 된다. 최상위로 높여주면 org.springframework.web.servlet.view.tiles3.TilesView 이 동작되어 원하는 구조를 얻을수 있다.
WEB-INF
|--jsp
|-- mobile
|--- files...
|-- teblet
|--- files..
Tiles의 WILDCARD: 그리고 Tiles Tag Expression 을 사용해보는것도 좋을것 같다.(http://j2eetution.blogspot.kr/2014/08/blog-post.html)
2. 번째 방법 LiteDeviceDelegatingViewResolver 빈 직접 설정
위에 LiteDeviceDelegatingViewResolver 와 TilesViewResolver 가 충돌나는것으로 보인다. 동작이 애매하게 되어 내용수정
application.properties 의 mobile 내용을 주석으로 처리
#spring.mobile.devicedelegatingviewresolver.enabled=true
#spring.mobile.devicedelegatingviewresolver.mobile-suffix=.mobile
* TilesConfig.java
TilesViewResolver를 빈에서 제거하고 LiteDeviceDelegationViewResolver의 생성자 Argument 값으로 셋팅.
...
public TilesViewResolver tilesViewResolver() {
final TilesViewResolver tilesViewResolver = new TilesViewResolver();
Properties props = new Properties();
tilesViewResolver.setAttributes(props);
tilesViewResolver.setViewClass(TilesView.class);
return tilesViewResolver;
}
@Bean
public LiteDeviceDelegatingViewResolver liteDeviceDelegatingViewResolver() {
LiteDeviceDelegatingViewResolver resolver = new LiteDeviceDelegatingViewResolver(this.tilesViewResolver());
//resolver.setMobilePrefix("mobile");
resolver.setMobileSuffix(".mobile");
resolver.setEnableFallback(true);
return resolver;
}
* tiles.xml
<definition name="layout.mobile" template="/WEB-INF/tiles/mobile/layout/mobilebasic.jsp">
<put-attribute name="title" value="KNK RMS System" />
<put-attribute name="header" value="/WEB-INF/tiles/mobile/view/mobileheader.jsp" />
<put-attribute name="sidebar" value="/WEB-INF/tiles/mobile/view/mobilesidebar.jsp" />
<put-attribute name="body" value="" />
<put-attribute name="footer" value="/WEB-INF/tiles/mobile/view/mobilefooter.jsp" />
</definition>
<!-- pc welcome page -->
<definition name="rms.main" extends="layout.administration">
<put-attribute name="body" value="/WEB-INF/jsp/rms/main.jsp" />
</definition>
<!-- mobile welcome page -->
<definition name="rms.main.mobile" extends="layout.administration">
<put-attribute name="body" value="/WEB-INF/jsp/mobile/rms/main.jsp" />
</definition>
* Controller.java
@RequestMapping(value="/")
private String mainPage1 (HttpServletRequest request , Device device ,ModelMap modelMap) throws Exception {
logger.debug("WELCOME !!! ");
device.getDevicePlatform();
logger.debug("device.isNormal() = {}" , device.isNormal());
logger.debug("device.isTablet() = {}" , device.isTablet());
logger.debug("device.isMobile() = {}" , device.isMobile());
logger.debug("device.getDevicePlatform() = {}" , device.getDevicePlatform());
return "rms.main";
}
return 되는 viewResolver에 subfix로 .mobile이 붙어 가는것을 확인할수 있다.
2017-02-06 14:58:09.415 DEBUG 820 --- [p-nio-80-exec-9] o.s.w.servlet.view.BeanNameViewResolver : No matching bean found for view name 'rms.main'
2017-02-06 14:58:09.415 DEBUG 820 --- [p-nio-80-exec-9] o.s.w.s.v.ContentNegotiatingViewResolver : Returning [org.springframework.web.servlet.view.tiles3.TilesView: name 'rms.main.mobile'; URL [rms.main.mobile]] based on requested media type 'text/html'
2017-02-06 14:58:09.415 DEBUG 820 --- [p-nio-80-exec-9] o.s.web.servlet.DispatcherServlet : Rendering view [org.springframework.web.servlet.view.tiles3.TilesView: name 'rms.main.mobile'; URL [rms.main.mobile]] in DispatcherServlet with name 'dispatcherServlet'
2017-02-06 14:58:09.438 DEBUG 820 --- [p-nio-80-exec-9] o.s.web.servlet.DispatcherServlet : Successfully completed request
'Spring > Spring Boot' 카테고리의 다른 글
Spring Cloud Config (0) | 2020.06.22 |
---|---|
Spring devtools restart 파일 감지 (0) | 2018.08.31 |
Springboot jpa & Hibernate Naming Strategy(네이밍 전략) (2) | 2018.08.31 |
Spring boot Swagger (0) | 2017.08.31 |
Spring boot (0) | 2016.07.08 |