본문 바로가기

Spring

[Spring MVC] Tiles 개념과 설정

728x90
반응형

Tiles란?

Tiles를 이용하지 않으면 화면 내에 공통적으로 들어가게 될 header, footer 같은 소스를 jsp 파일로 분리한다. 그리고 각 화면의 jsp 파일마다 include하는 방식을 사용한다. 이럴 경우, 모든 화면에 header, footer를 include 해야 하고, 페이지의 레이아웃이 바뀔 때 jsp 파일을 모두 수정해야 하기 때문에 번거롭다.

 

이 때, 웹 페이지의 header, footer, 메뉴처럼 공통적인 소스를 분리하여 화면의 jsp 파일에는 각 화면에 해당하는 소스만 작성하고 페이지의 레이아웃을 한 곳에서 설정하여 관리할 수 있도록 하는 프레임워크이다.

 

처음엔 Tiles와 Thymeleaf 둘 중 하나를 선택해서 사용해야 하는 줄 알았다.

하지만 Tiles는 레이아웃 템플릿, Thymeleaf는 텍스트 템플릿 엔진으로 함께 사용 가능한 것이었다.

Thymeleaf는 따로 포스팅할 때 자세히 설명하겠다. 아래 글은 템플릿 엔진에 대한 내용이다.

https://gmlwjd9405.github.io/2018/12/21/template-engine.html

 

[Template Engine] 템플릿 엔진(Template Engine)이란 - Heee's Development Blog

Step by step goes a long way.

gmlwjd9405.github.io

 

 

설정

pom.xml

		<!-- Tiles -->
		<dependency>
			<groupId>org.apache.tiles</groupId>
			<artifactId>tiles-jsp</artifactId>
			<version>3.0.8</version>
		</dependency>
		<dependency>
			<groupId>org.apache.tiles</groupId>
			<artifactId>tiles-servlet</artifactId>
			<version>3.0.8</version>
		</dependency>
		<dependency>
			<groupId>org.apache.tiles</groupId>
			<artifactId>tiles-extras</artifactId>
			<version>3.0.8</version>
		</dependency>

 

https://mvnrepository.com/search?q=tiles

 

Maven Repository: tiles

Tiles JSP support: Classes and tag libraries to use Tiles in a JSP environment. Last Release on Sep 30, 2017

mvnrepository.com

 

위 주소로 들어가면 아래 내용이 나온다.

이 세 가지의 최신 버전 <dependency>를 복사해서 pom.xml에 넣는 것이다.

현재는 3.0.8 버전이 최신이므로 해당 버전을 받는다.

 

servlet-context.xml

	<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
	<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/tiles/tiles.xml</beans:value>
			</beans:list>
		</beans:property>
	</beans:bean>

기존 veiwResolver의 order 속성을 2로 수정하고 아래 Tiles 내용을 추가한다.

order 속성은 실행의 우선순위를 의미한다.

tilesConfigurer에 타일즈 설정을 할 xml 파일의 경로를 입력한다.

 

/WEB-INF/tiles/tiles.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC
  "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
  "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">

<tiles-definitions>

	<!-- tiles 적용 -->
	<definition name="template" template="/WEB-INF/tiles/template.jsp">
		<put-attribute name="header" value="/WEB-INF/tiles/header.jsp" />
		<put-attribute name="left" value="/WEB-INF/tiles/left.jsp" />
		<put-attribute name="footer" value="/WEB-INF/tiles/footer.jsp" />
	</definition>
 
	<definition name="*" extends="template">
		<put-attribute name="main" value="/WEB-INF/views/{1}.jsp" />
	</definition>
	
</tiles-definitions>

<definition>로 tiles 태그를 사용할 template 파일의 경로를 작성한 후, <put-attribute>에 사용할 태그의 이름, jsp 파일의 경로를 입력한다.

main은 컨트롤러에 의해 화면에 띄워질 jsp파일을 의미하므로 value에 경로를 적어준다.

 

definition name에 *로 설정하면 컨트롤러에서 return값을 "home" 으로 작성하면 되고

*/*로 설정하면 "home/home", "*.*"이면 "home.home", 또는 "*.tiles"로 "home.tiles", "*.normal"은 "home.normal" 식으로 작성하면 된다.

 

jsp 파일

WEB-INF/tiles/header.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<h1>Header</h1>
 
<script type="text/javascript">
    $(function() {
          
    });    
</script>

WEB-INF/tiles/footer.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<h1>Footer</h1>
 
<script type="text/javascript">
    $(function() {
 
    });    
</script>

WEB-INF/tiles/left.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<h1>Left 메뉴</h1>
 
<script type="text/javascript">
    $(function() {
 
    });    
</script>

WEB-INF/tiles/template.jsp _ 레이아웃 파일

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>
<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>제목</title>
    <style>
        #header{            
            width:100%;
            height:50px;
            text-align: center;
            background-color: aqua;
        }
        #left{
            float:left;
             width:15%;
            background-color: gray;
        }
        #main{
            float:left;
             width:85%;
            background-color: lime;
        }
        #footer{
            width: 100%;
            height: 50px;            
            text-align: center;
            background-color: orange;
            clear:both;
        }
         #left, #main{ 
               min-height: 600px;
         } 
    </style>
    
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
    <div style="width:100%; height:100%;">
    <div id="header"><tiles:insertAttribute name="header" /></div>
    <div id="left"><tiles:insertAttribute name="left" /></div>
    <div id="main"><tiles:insertAttribute name="main" /></div>    
    <div id="footer"><tiles:insertAttribute name="footer" /></div>
    </div>
 
    <script type="text/javascript">
        $(function() {
 
        });    
    </script>    
</body>
</html>

WEB-INF/views/home.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
	<title>Home</title>
</head>
<body>
<h1>
	Hello world!  
</h1>

<P>  The time on the server is ${serverTime}. </P>
</body>
</html>

HomeController.java

@Controller
public class HomeController {
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String home() {
        
        return "home";
    }
}

 

이렇게 설정이 완료되었다.

아래 링크는 더 자세한 설명과 preparer이라는 기능에 대해 알려주고 있으므로 필요하다면 참고하자

https://seypark.tistory.com/126

 

Spring MVC - Tiles로 jsp구성하기

 - Tiles 그전에는 "definition" 이라는 이름으로 Tiles를 사용했었으나 Spring에서는 name속성에 viewName을 걸어준다. 실제로 Controller에서 viewName으로 jsp페이지를 뿌려줄텐데, 그것을 Tiles의 'definiti..

seypark.tistory.com

 

728x90
반응형