관리 메뉴

IT.FARMER

Spring Boot mobile project 에 tiles 적용 본문

Spring/Spring Boot

Spring Boot mobile project 에 tiles 적용

아이티.파머 2017. 2. 3. 17:51
반응형


한프로젝트에 모바일과 일반 그리고 테블릿을 분류하기위해 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

 

<!-- mobile page  -->
 <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.s.v.ContentNegotiatingViewResolver : Requested media types are [text/html, application/xhtml+xml, image/jxr, */*] based on Accept header types and producible media types [*/*])
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(네이밍 전략)  (1) 2018.08.31
Spring boot Swagger  (0) 2017.08.31
Spring boot  (0) 2016.07.08