캠핑과 개발


tiles2는 Spring MVC와 연동시 그 뷰 네임을 definition 네임으로 하기 때문에 각각의 뷰마다 각각의 definition이 있어야 하므로 번거롭기 짝이없다. tiles2기반으로 프로젝트를 하는 사람들이 이를 간과할리 없다. 찾아보니 Dynamic-tiles2라는 간단한 라이브러리가 그것을 도와준다.

Dynamic-tiles2는 David Winterfeldt라는 사람이 http://www.springbyexample.org/ 운영하면서 만든 라이브러리이다. Spring의 2개의 클래스를 확장하고 1개의 클래스로 처리하는 비교적 초간단 라이브러리이다.(소스코드를 보면 어렵지 않게 이해할수 있다.) 사이트는 이외에도 간단한 예제들이 많이 있어 Spring을 처음 접하는 사람에게 유용하리라 생각된다.

기본에 이어서 설명한다ViewResolver를 아래와 같이 변경한다.

[기존]

 <bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
  <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView" />
 </bean>

[신규]

<bean id="tilesViewResolver" class="org.springbyexample.web.servlet.view.tiles2.TilesUrlBasedViewResolver">
        <property name="viewClass" value="org.springbyexample.web.servlet.view.tiles2.DynamicTilesView" />
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
        <property name="tilesDefinitionName" value="default" />
     <property name="tilesBodyAttributeName" value="body" />
     <property name="tilesDefinitionDelimiter" value="." />
    </bean>

tilesDefinitionName 은 기본 tiles의 Definition 이름이고, tilesBodyAttributeName 은 해당 바뀔 속성의 이름이다. tilesDefinitionDelimiter 상속시 구분자이다. 본 라이브러리를 보면 알겠지만 각각의 Spring UrlBasedViewResolver 와 TilesView를 확장하여 간단히 확장한 소스이다.(이게 spring의 장점중에 하나이다.)

어쨌든 이와 같이 ViewResolver를 설정하고 tiles2 설정을 아래와 같이 변경한다..

[기존]

 <definition name=".default" template="/WEB-INF/templates/main.jsp">
  <put-attribute name="title" value="Simple Tiles 2 Example" type="string" />
  <put-attribute name="header" value="/WEB-INF/templates/header.jsp" />
  <put-attribute name="footer" value="/WEB-INF/templates/footer.jsp" />
  <put-attribute name="menu" value="/WEB-INF/templates/menu.jsp" />
  <put-attribute name="body" value="/WEB-INF/templates/blank.jsp" />
 </definition>
 <definition name="index" extends="default">
  <put-attribute name="body" value="/WEB-INF/jsp/index.jsp" />
 </definition>
 <definition name="member/list" extends="default">
  <put-attribute name="body" value="/WEB-INF/jsp/member/list.jsp" />
 </definition>

 [신규]

 <definition name=".default" template="/WEB-INF/templates/main.jsp">
  <put-attribute name="title" value="Simple Tiles 2 Example" type="string" />
  <put-attribute name="header" value="/WEB-INF/templates/header.jsp" />
  <put-attribute name="footer" value="/WEB-INF/templates/footer.jsp" />
  <put-attribute name="menu" value="/WEB-INF/templates/menu.jsp" />
  <put-attribute name="body" value="/WEB-INF/templates/blank.jsp" />
 </definition>

IndexController는 변함이 없다.

 @Autowired
 private SampleService sampleService;
 
 @Autowired
 private TilesUrlBasedViewResolver tilesViewResolver;
 
 
 /**
  * Tiles를 이용한 일반적인 요청입니다.
  */
 @RequestMapping("/sample/index.do")
 public ModelAndView index1(HttpServletRequest request, HttpServletResponse response){
  
  //ModelMap modelMap = new ModelMap();
  //modelMap.addAttribute("documentList", sampleService.index());
  //service call
  sampleService.index();
  request.setAttribute("name", "name");
  return new ModelAndView("sample/index");
 }
 
 /**
  * Tiles의 Default layout가 아닌 body layout를 요청한 예입니다.
  */
 @RequestMapping("/index.do")
 public void index2(){
  System.out.println("/index.do");
  //다른 페이지로 이동하려고 하면 이렇게 합니다.
  tilesViewResolver.setTilesDefinitionName("body");
 }
 
 /**
  * Tiles를 거치지 않고 redirect로 페이지를 이동합니다.
  * @param request
  * @param response
  * @return
  */
 @RequestMapping("/sample/redirect.do")
 public String redirect(HttpServletRequest request, HttpServletResponse response){
  tilesViewResolver.setRedirectContextRelative(true);
  return "redirect:/jsp/sample/redirect.jsp";
 }
 /**
  * Tiles를 거치지 않고 forward로 페이지를 이동합니다.
  * @param request
  * @param response
  * @return
  */
 @RequestMapping("/sample/forward.do")
 public String forward(HttpServletRequest request, HttpServletResponse response){  
  tilesViewResolver.setRedirectContextRelative(true);
  request.setAttribute("name", "name!!!");
  return "sample/forward";
 } 
 
 /**
  * Tiles를 거치지 않고 void 처리합니다.
  * @param request
  * @param response
  * @return
  */
 @RequestMapping("/sample/voidcall.do")
 public void voidcall(HttpServletRequest request, HttpServletResponse response) throws Exception{  
  tilesViewResolver.setRedirectContextRelative(true);
  response.getWriter().print("voidcall!!!");
 }

요약하면, 기존의 tiles2 설정에서 viewresolver를 Dynamic-tiles2 라이브러리 함수로 바꾸고 tiles 설정파일을 기존의 각각의 definition 네임를 제거하면 된다.


출처 : http://yunsunghan.tistory.com/259