본문 바로가기
Spring

2022-12-05 Spring에서 Tiles framework 사용하기

by HTT 2022. 12. 5.
Tiles framework

Tiles

 

템플릿 구성 프레임워크로, 일반적인 페이지 요소의 중복을 줄이기 위해 상속으로 사용하거나 다른 타일에 포함시켜 재사용이 가능하도록 도와주는 프레임워크이다. tiles를 이용하면 전체 애플리케이션의 일관된 모양과 느낌을 줄 수 있고 개발이 간소화된다.

 

 

사용 방법

 

1. pom.xml에 라이브러리 등록

=> Tiles Servlet Support, Tiles JSP Support

tiles라이브러리
<dependency>
	<groupId>org.apache.tiles</groupId>
	<artifactId>tiles-servlet</artifactId>
	<version>3.0.8</version>
    </dependency>

Maven Repository: org.apache.tiles » tiles-servlet (mvnrepository.com)

 

jsp support라이브러리
<!-- https://mvnrepository.com/artifact/org.apache.tiles/tiles-jsp -->
<dependency>
	<groupId>org.apache.tiles</groupId>
	<artifactId>tiles-jsp</artifactId>
	<version>3.0.8</version>
</dependency>

Maven Repository: org.apache.tiles » tiles-jsp (mvnrepository.com)

 

 

 

2. 중요한 빈을 스프링 설정파일(spring-config.xml)에 등록

 

- 전에는 jsp파일을 만들 수 있는 ViewResolver를 이용했었는데 이제는 tiles를 기반으로 뷰를 만들어낼 수 있도록 ViewResolver등록하기

- 만약 thymeleaf를 사용하더라도 thymeleaf를 적용해서 View를 만들 수 있도록 ViewResolver등록하기

1. tiles설정파일을 읽어서 작업할 수 있도록 설정파일을 등록

<beans:bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
	<beans:property name="definitions">
		<beans:list>
			<beans:value>/WEB-INF/**/*-tiles.xml</beans:value>
			<!-- 어떤 폴더에 있는 파일이든지 -tiles가 붙는 건 다 인식되게 하겠다는 것 -->
			<!-- **이 두 개면 폴더, *하나는 파일 -->
		</beans:list>
	</beans:property>
</beans:bean>


2. Tiles를 기반으로 뷰를 만들 수 있도록 ViewResolver등록하기
<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
	class="org.springframework.web.servlet.view.InternalResourceViewResolver">
	<beans:property name="prefix" value="/WEB-INF/" />  
	<beans:property name="suffix" value=".jsp" />
	<beans:property name="order" value="2"/>   <!-- 이 부분이 추가됨 -->
</beans:bean>

=>  ViewResolver가 두 개이기 때문에 "order"속성을 부여해 우선순위를 설정해야 한다. 그렇지 않으면 위에서부터 선언된 순서로 인식하기 때문에 jsp에서만 찾으려 하기 때문이다.

tiles를 연습하기 위해 tiles를 1순위로, jsp를 2순위로 설정하였다.

 

 

 

3. tiles메인 설정 파일 작성하기(main-tiles.xml)


- 뷰템플릿 등록하기

<?xml version="1.0" encoding="UTF-8"?>
<!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="mainTemplate" template="/WEB-INF/template/mainLayout.jsp">
		<put-attribute name="top" value="/WEB-INF/include/top.jsp"/>
		<put-attribute name="menu" value="/WEB-INF/menu/ad_menu.jsp"/>
		<put-attribute name="content" value="/WEB-INF/include/content.jsp"></put-attribute>
	</definition>
</tiles-definitions>

=> mainLayout.jsp로 정의된 뷰를 "mainTemplate"이라는 이름으로 템플릿 등록. mainLayout.jsp에서 사용하는 구성(top, menu, content)도 같이 등록하기


- 뷰 등록하기

① 템플릿의 구성을 수정하지 않고 사용하고 싶을 때

<tiles-definitions>
	<definition name="index" extends="mainTemplate">
	</definition>
<tiles-definitions>

=> 상속만 해주기

 

② 템플릿의 일부 구성을 변경하고 싶을 때

<tiles-definitions>
	<definition name="menu/servlet" extends="mainTemplate">     
		<put-attribute name="menu" value="/WEB-INF/menu/jsp_menu.jsp"/>
		<put-attribute name="content" value="/WEB-INF/emp/search.jsp"/>
	</definition>
<tiles-definitions>

=> 상속은 그대로 하되, 템플릿에 등록된 구성 중 변경할 부분의 name을 <put-attribute>에 정확하게 써주고 어떤 것으로 바꿀지 value에 경로써주기. 또한 수정한 뷰의 새로운 이름을 정해줘야 하고, 화면 하나당 <definition> 하나씩 주기(로그인화면, 회원가입, 회원목록화면 등 각각 줘야 함).

definition name=" 이름 " 이 이름으로 뷰를 요청하면 응답

 

 

 

4. 레이아웃 템플릿 파일 작성 (mainLayout.jsp)


- jsp파일에 전체 레이아웃을 어떻게 구성할 것인지 작성하기.

<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>

<body>
	<!-- top영역 -->
	<tiles:insertAttribute name="top"></tiles:insertAttribute>   
		<div class="row">
			<div class="col-lg-2 sidenav">
				<!-- 메뉴영역 -->
				<tiles:insertAttribute name="menu"></tiles:insertAttribute>
			</div>
			<div class="col-lg-10">
				<%-- 컨텐츠영역 --%>
				<tiles:insertAttribute name="content"></tiles:insertAttribute>
			</div>
		</div>
	</div>
</body>

=> 상단 태그에 URI작성하기

name은 main-tiles.xml에서 지정한 이름과 동일해야 함!!!

 

 

 

 

직접 적용해보기

 

메인 화면

 

게시글 리스트

 

 

** 위의 사진처럼 메인화면의 구성을 유지하면서 top 게시판메뉴만 남기고 왼쪽메뉴와 가운데 내용물을 바꿔보자.

 

<!-- ================템플릿등록================ -->
<definition name="mainTemplate" template="/WEB-INF/template/mainLayout.jsp">
	<put-attribute name="top" value="/WEB-INF/include/top.jsp"/>
	<put-attribute name="menu" value="/WEB-INF/menu/ad_menu.jsp"/>
	<put-attribute name="content" value="/WEB-INF/include/content.jsp"></put-attribute>
</definition>

<!-- ================index등록================-->
<definition name="index" extends="mainTemplate">
</definition>

=> 메인 화면을 "index"라는 이름의 뷰로 등록.

이제 menu(왼쪽 메뉴)와 content(가운데 내용물)를 바꿔보자

 

<tiles-definitions>
	<definition name="board/list" extends="mainTemplate">
		<put-attribute name="menu" value="/WEB-INF/menu/board_menu.jsp"/>
		<put-attribute name="content" value="/WEB-INF/board/boardlist_jstl.jsp"/>
	</definition>
</tiles-definitions>

=> 메인화면의 구성을 유지하기 위해 extends해주고 menu와 content의 내용만 바꿔주기

 

 

 

 

 

db연동과 같은 다른 작업은 하지 않고 뷰 화면만 보여주고 싶을 때는 view설정파일 만들어서 등록하기

 

컨트롤러.java파일에 메소드를 등록하지 않아도 뷰 화면만 보여줄 수 있음. view-config.xml에 <view-controller>에 이름주고 보여줄 뷰의 이름 등록하기

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans
	xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
	<!-- ===================뷰를 위한 컨트롤러 추가=================== -->
	<view-controller path="/menu/jsp" view-name="menu/jsp"/> 
	<view-controller path="/menu/insa" view-name="menu/emp"/>
</beans:beans>

=> 스프링과 동일환 환경을 구성하기 위해 <beans:beans> 복사 붙여넣기

"/menu/jsp"의 주소로 요청이 들어오면 tiles설정파일에서 name="menu/jsp"로 등록된 뷰를 실행해줌

 

 

- 배치 기술자(web.xml)에 경로등록하기

<servlet>
	<servlet-name>appServlet</servlet-name>
	<servlet-class>org.springframework.web.servlet.DispatcherServlet
	</servlet-class>
	<init-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>
		/WEB-INF/config/spring-config.xml
		/WEB-INF/config/view-config.xml    <!-- 이 부분이 추가됨 -->
		</param-value>
	</init-param>
	<load-on-startup>1</load-on-startup>
</servlet>

 

 

 

** 에러날 때 jsp파일이 실행되면 tiles설정파일의 name확인하기

댓글