반응형
<Tiles 기본>
  1.  tiles 란?
-  반복적으로 사용되는 header, footer와 같은 정보를 한곳에 모아둔 프레임 워크

  1.   tiles3로 오면서 설정이 더욱 간단해 졌다. tiles3는 spring3.2 버전 이상부터 쓰일 수 있으니 참고바람.

  1.     pom.xml에 3가지 dependency를 추가한다.

pom.xml

<dependency>
    <groupId>org.apache.tiles</groupId>
    <artifactId>tiles-extras</artifactId>
    <version>3.0.0</version>
</dependency>
<dependency>
    <groupId>org.apache.tiles</groupId>
    <artifactId>tiles-jsp</artifactId>
    <version>3.0.0</version>
</dependency>
<dependency>
    <groupId>org.apache.tiles</groupId>
    <artifactId>tiles-servlet</artifactId>
    <version>3.0.0</version>
</dependency></p>


  1.    tiles를 유동적으로 사용하고 싶다면 다음과 같이 설정한다.  우선 모든 view들은 tiles를 정의한 tiles 설정 파일의  definition들에서
binding될 jsp 등의 view 파일들을 찾게됩니다. 만약 각 views.xml에서 view 파일을 못찾게 되면 우선순위가 2인 InternalResourceViewResolver 에서 해당 view 파일을 찾게 됩니다.

참고 >> 
view resolver
- View Resolver는 Spring의 DispatcherServlet이 Controller의 응답 결과를 가져올 때, 어떤 방식으로 view 객체를 가져올지 정하고 해당 객체를 생성한다.
- View Resolver를 구현한 클래스는 InternalResourceViewResolver, BeanNameViewResolver, XmlViewResolver, UrlBasedViewResolver 등이 있다.
- DispatcherServlet은 여러개의 ViewResolver를 가질 수 있는데, 'order' property에 따라 어떤 ViewResolver를 결정할지 우선순위를 정할 수 있다. 우선순위를 명시하지 않으면 가장 낮은 우선순위를 가진다.
- 우선순위가 높은 ViewResolver에게 View 객체를 요청하는데, 만약 null을 리턴한다면 그 다음 우선순위의 ViewResolver에게 객체를 요청하게 된다.
- InternalResourceViewResolver는 항상 mapping되는 view 객체를 리턴하고, 없다고 null을 반환하지 않으므로 항상 가장 낮은 우선순위로 두어야한다.



dispatcher-servlet.xml

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

// tiles의 우선순위를 1로 설정해둔다.

 <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
  <property name="prefix" value="/WEB-INF/views/"/>
  <property name="suffix" value=".jsp"/>
  <property name="order" value="2"></property>
 </bean>

//기존에 써있던 view resolver 에서 우선순위만 바꿔줬다.


<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
  <property name="definitions">
  <list>
  <value>/WEB-INF/tiles/tiles.xml</value>
  </list>
  </property>
</bean>

//tiles관련 설정파일 
//만약 여러개 하고 싶다면 list의 value를 추가해주면 된다.


  1. 다음은 tiles 설정파일 tills.xml

<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN" "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">

<tiles-definitions>
  <definition name="default" template="/WEB-INF/views/layout/layout.jsp">
  <put-attribute name="header" value="/WEB-INF/views/layout/header.jsp" />
  <put-attribute name="body" value=""/>
  <put-attribute name="footer" value="/WEB-INF/views/layout/footer.jsp" />
  </definition>

//기본적인 defiinition 태그를 하나 만들어둔다.

  <definition name="tiles" extends="default">
<put-attribute name="body" value="/WEB-INF/views/layout/mainTest.jsp" />
</definition>

//  defiinition 을 상속받아 여러 타일즈를 만들수 있다.

</tiles-definitions>


빨간색으로 표시한 definition name="tiles" <- 이부분이 중요하다.  이부분때문에 오류가 많이난다.

  1. layout.jsp

<%@ page language="java" contentType="text/html; charset=EUC-KR"
  pageEncoding="EUC-KR"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=EUC-KR">
</head>

<body>
  <div id="wrap">
  <div >
  <div>
  <div>
  <tiles:insertAttribute name="header" />
  </div>
  </div>
  <div>
  <div>
  <tiles:insertAttribute name="body" />
  </div>
  </div>
  <div>
  <div>
  <tiles:insertAttribute name="footer" />
  </div>
  </div>
  </div>
  </div>
</body>
</html>



기본적으로 만들고 싶은 틀을 html 형식으로 만들어 준다.    <tiles:insertAttribute name="footer" /> 의 name은 tiles.xml에서 설정한 name과 같아야 한다. 

  1. Controller mapping 추가

@RequestMapping(value = "/test", method = RequestMethod.GET)
  public String hello(Locale locale, Model model) {

  Date date = new Date();
  DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);

  String formattedDate = dateFormat.format(date);

  model.addAttribute("serverTime", formattedDate );
  return "tiles";
  }


return 값과 definition에서 정의한 name이 반드시 일치하게 해야 404 에러가 안난다. 기본적인 설정은 완료하였다. 
응용버전은 추후 추가하도록 하겠다.

  1. 기본적인 부분 완성!  - header.jsp , footer.jsp, mainTest.jsp 는 커밋해놓았으니 각자 코드를 확인해보기 바란다!



<Tiles 응용>
앞서 소개한 tiles 를 우리 프로젝트에 응용할 수 있도록 해보겠다.





우리가 앞서 소개한 부분은 defulat이다. 근데 나는 left 메뉴가 있는화면도 필요하다면 tiles.xml에 <definition>을 추가할 수 있다.


<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 3.0//EN" "http://tiles.apache.org/dtds/tiles-config_3_0.dtd">

<tiles-definitions>
  <definition name="default" template="/WEB-INF/views/layout/layout.jsp">
<put-attribute name="header" value="/WEB-INF/views/layout/header.jsp" />
<put-attribute name="body" value=""/>
<put-attribute name="footer" value="/WEB-INF/views/layout/footer.jsp" />
  </definition>

<1>
  <definition name="withLeft" template="/WEB-INF/views/layout/layout_left.jsp">
<put-attribute name="header" value="/WEB-INF/views/layout/header.jsp" />
<put-attribute name="left" value=""/>
<put-attribute name="body" value=""/>
<put-attribute name="footer" value="/WEB-INF/views/layout/footer.jsp" />
  </definition>  

  <definition name="tiles" extends="default">
<put-attribute name="body" value="/WEB-INF/views/layout/mainTest.jsp" />
</definition>

<2>
<definition name="user/*/*" extends="withLeft">
<put-attribute name="left" value="/WEB-INF/views/layout/left.jsp"/>
<put-attribute name="body" value="/WEB-INF/views/{1}/{2}.jsp" />
</definition>



</tiles-definitions>


<1>  template을 다르게 해서  definition을 추가했다. 이를 상속받아 <2>를 추가했다.

여기서 중요한것은 <2>번이다. 다들 이를 응용하여 개발하면 된다.
definition name="/" -- > controller mapping 형태를 말한다. 

참고>>>
definition name 형식 -
- ? : 한 글자, * : 아무글자나, [abc] : abc로 시작

IssueController.java
@RequestMapping(value={"/issue/list"} , method=RequestMethod.GET)
public String showIssueList(HttpServletRequest request) {
return "issue/issueList";
}
}


/issue/list를 매핑하여  issue/issueList를 return 한다.
그러면  issue가 {1}  issueList가 {2}가 된다.
즉 issue 폴더 아래에 있는 issueList에 적용한다는 것이다.


http://localhost:8081/toyProject/issue/list  를 호출하면 다음과 같은 화면이 나온다. 




layout_left.jsp 가 적용된 화면이니 이를 응용하여 프로젝트에 활용하면 된다 . 끝!







출처: http://creator1022.tistory.com/176 [무한도전]







반응형

'개발공부 > Spring' 카테고리의 다른 글

예외처리(1)  (0) 2020.10.01
Spring에서 Bean을 주입하는 방식  (0) 2020.03.16
SPRING AOP  (0) 2018.07.02
SLF4J와 Logback  (1) 2018.06.26

+ Recent posts