Tiles란?
Include와 비슷한 역할이라고 할 수 있다.
페이지의 상단이나 하단 메뉴(header, footer)와 같이 모든 페이지에 반복적으로 사용해야 하는 경우 <include>태그를 사용하여 넣으면 간편하게 넣을 수 있다.
하지만 Include의 경로가 바뀌었을 때, 모든 페이지를 하나씩 다 들어가서 경로를 수정해야 하는 문제점이 있다. 가령 페이지가 50개가 된다면 50개의 페이지에 있는 include 경로를 전부 다 바꾸어 주어야 하는 것이다.
Tiles는 Include와 같이 상단, 하단 메뉴를 반복적으로 넣을 때 사용할 수 있는 방법이며 Include처럼 모든 페이지에서 일일이 수정하지 않고 tiles.xml에서 한번의 수정으로 모든 페이지에 적용할 수 있다.
사전 준비
pom.xml 라이브러리 추가
<properties>
<org.apache.tiles-version>3.0.3</org.apache.tiles-version>
</properties>
<!-- Tiles -->
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-core</artifactId>
<version>${org.apache.tiles-version}</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-servlet</artifactId>
<version>${org.apache.tiles-version}</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-jsp</artifactId>
<version>${org.apache.tiles-version}</version>
</dependency>
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-extras</artifactId>
<version>${org.apache.tiles-version}</version>
</dependency>
tiles 버전은 본인에게 맞는 버전으로 사용하시면 됩니다.
아래 링크로 들어가서 Tiles 관련 라이브러리 4개 전부 추가해주시면 됩니다.
https://mvnrepository.com/search?q=tiles
< Tiles JSP Support, Tiles Servlet Support, Tiles Core Library, Tiles API >
servlet-context.xml
<beans:bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
<beans:property name="order" value="2" />
</beans:bean>
<!-- tiles 설정 -->
<beans:bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<beans:property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView" />
<beans:property name="order" value="1" />
</beans:bean>
<beans:bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
<beans:property name="definitions">
<beans:list>
<beans:value>/WEB-INF/spring/tiles.xml</beans:value>
</beans:list>
</beans:property>
</beans:bean>
<beans:property name="order" value="1" />
tiles가 우선순위가 되도록 order의 value를 1로 지정해주어야 하며
viewResolver의 순위를 2로 맞추어 주면 됩니다.
(tiles로만 view를 할거라면 viewResolver는 주석처리해도 됩니다)
<beans:value></beans:value>는 tiles.xml 파일의 위치 경로입니다
용어 및 사용
Template : 페이지 레이아웃을 의미하며, jsp파일로 페이지의 기본 골격을 구성하고 각 페이지의 실제 구성 내용은 definition에서 설정되는 Attribute(실제 내용)태그를 사용하여 런타임 시 뿌려준다
▶ <tiles-definitions> </tiles-definitions>
여러가지 레이아웃을 추가하기 위한 태그
하나의 페이지 일 경우 - 헤더, 푸터, 메뉴 등 없이 single
<definition name="sample.base.board" template="/WEB-INF/views/sample/board.jsp">
<put-attribute name="body" value="" />
</definition>
헤더, 푸터, 메뉴 등 여려가지 include 할 경우
<definition name="web.base.main" template="/WEB-INF/views/front/web/layout/allLayout.jsp">
<put-attribute name="header" value="/WEB-INF/views/front/web/layout/header.jsp" />
<put-attribute name="body" value="" />
<put-attribute name="footer" value="/WEB-INF/views/front/web/layout/footer.jsp" />
</definition>
▶ <definition name="" template=""> </definition>
name : Controller에서 사용할 이름(URL value)
template : 헤더, 푸터, 바디 등을 적용시키기 위해 만들어놓은 뼈대 jsp 파일의 경로
(없으면 안 적어도 된다)
▶ <put-attribute name="body" value="body.jsp" />
name : 하나의 jsp를 사용하기 위한 것 (single 레이어로 body를 한뒤
definition name과 attribute name 이름으로 원하는 레이아웃을 넣을 수 있다)
value : 사용할 jsp 풀 네임(전체 경로)
▶ 위와 같이 header, footer를 같이 할 경우 body 부분의 값만 변경되기 때문에 body 부분의 내용은 아래와 같이 사용하면 된다.
<definition name="front/web/*.main" extends="web.base.main">
<put-attribute name="body" value="/WEB-INF/views/front/web/body.jsp" />
</definition>
▶ Controller에서 front/wet/*.main을 호출하면 web.base.main의 body 부분에 들어감과 동시에 web.base.main의 레이아웃을 불러오게 된다.
예상되는 에러
'org.springframework.web.servlet.view.tiles3.TilesConfigurer' not found
▶ 원인 : springframework의 버전이 낮아서 tiles3를 사용할 수 없어서 생기는 오류
3.1.1.RELEASE에서는 tiles 3를 사용할 수 없다. 3.2 이상이여야 tiles 3 사용 가능
▶ 해결 : 버전을 올려주면 된다
프로젝트 폴더 우클릭 -> MAVEN -> Update project 클릭
프로젝트 업데이트 후 -> Project -> 클린
springframework와 tiles의 버전이 맞으면 에러가 사라진다
'Programing > 기타' 카테고리의 다른 글
주석의 정의와 종류 (0) | 2022.12.05 |
---|---|
페이징 - AJAX (2) (0) | 2021.07.16 |
페이징 - AJAX (1) (0) | 2021.07.13 |
페이징 - MSSQL (0) | 2021.07.13 |