๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ’ปStudy/Spring

์ •์  ํŒŒ์ผ ๋งคํ•‘ / Tiles์™€ TilesResolver

* ์ •์  ํŒŒ์ผ ๋งคํ•‘

 

์‹ค์Šต์„ ์œ„ํ•ด www.newlecture.com html ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›์•„์„œ webapp ํด๋” ์•ˆ์— ๋„ฃ๋Š”๋‹ค. index.jsp ํŒŒ์ผ์„ ํผ๋ธ”๋ฆฌ์‹ฑ ๋œ index.html์˜ ๋‚ด์šฉ๋ฌผ๋กœ ๋ฐ”๊พผ ๋’ค ์‹คํ–‰ํ•˜๋ฉด ์ด๋ฏธ์ง€ ํŒŒ์ผ์ด ๋‚˜์˜ค์ง€ ์•Š๋Š”๋‹ค.

 

 

 

ํ•ด๋‹น ๊ฒฝ๋กœ(webapp/images/logo.png)์— ํŒŒ์ผ์ด ์žˆ์Œ์—๋„ ์ด๋ฏธ์ง€๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š๋Š” ์ด์œ ๋Š”, ์Šคํ”„๋ง์ด ์ •์ ์ธ ํŒŒ์ผ(html, ์ด๋ฏธ์ง€ ๋“ฑ)์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋„๋ก ๋ง‰์•„๋‘์—ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. jsp ํŒŒ์ผ์€ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ ์ด๋ฏธ์ง€ ๋“ฑ์€ url์œผ๋กœ ์š”์ฒญํ–ˆ์„ ๋•Œ 404๊ฐ€ ๋œฌ๋‹ค. (localhost:8080/images/logo.png)

 

 

 

 

์œ„์™€ ๊ฐ™์€ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ์ •์  ํŒŒ์ผ ์„œ๋น„์Šค๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ '/images/**'์œผ๋กœ ์š”์ฒญํ–ˆ์„ ๋•Œ '/images/' ๊ฒฝ๋กœ์—์„œ ์ฐพ์•„๋ณด๊ฒŒ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค. ๊ฐ„ํŽธํ•˜๊ฒŒ๋Š” resource๋ผ๋Š” ํด๋”๋ฅผ ๋งŒ๋“ค์–ด images, js, css๋ฅผ ๋‹ค ๋ชฐ์•„๋„ฃ์œผ๋ฉด ๋œ๋‹ค.

 

 

dispatcher-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/mvc
        https://www.springframework.org/schema/mvc/spring-mvc.xsd"> 
        <!-- mvc๋ผ๋Š” ์Šคํ‚ค๋งˆ ํŒŒ์ผ ์ถ”๊ฐ€ํ•˜๋ฉด mvc ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. -->
        
    <!-- 
    http://www.springframework.org/schema/mvc : ์Šคํ‚ค๋งˆ ์ด๋ฆ„
    https://www.springframework.org/schema/mvc/spring-mvc.xsd : ์Šคํ‚ค๋งˆ ํŒŒ์ผ
    
    ** xmlns:mvc="http://www.springframework.org/schema/mvc"์˜ ์˜๋ฏธ
    mvc๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ http://www.springframework.org/schema/mvc ์Šคํ‚ค๋งˆ๋ฅผ ์ด์šฉํ•  ๊ฒƒ์ด๊ณ ,
          ์Šคํ‚ค๋งˆ ํŒŒ์ผ์€ xsi:schemaLocation์— ๋ช…์‹œ๋œ 
          https://www.springframework.org/schema/mvc/spring-mvc.xsd"
         -->

    <bean id="/index" class="com.newlecture.web.controller.IndexController" />  
    
    <!-- View Resolver -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    	<property name="prefix" value="/WEB-INF/view/"></property>
    	<property name="suffix" value=".jsp"></property>
    </bean>
    
    <mvc:resources location="/resource/" mapping="/resource/**"></mvc:resources>
    <!-- /resource/**๋ผ๋Š” ์š”์ฒญ์ด ์™”์„ ๋•Œ(mapping) /resource/ ํด๋”์—์„œ ์ฐพ์•„๋ณด๊ฒŒ ํ•จ(location)  -->
    
    
</beans>

 

mvc ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด beans xml namespace์— mvc ๊ด€๋ จ ์Šคํ‚ค๋งˆ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

์ง์ ‘ ์จ๋„ ๋˜๊ณ  ํ˜น์€ dispatcher-servlet.xml ํŒŒ์ผ ์šฐํด๋ฆญ > Open With > Spring Config Editor๋ฅผ ๋ˆ„๋ฅด๋ฉด namespace ํƒญ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. (์ด์ „์— namespace ํƒญ์ด ์•ˆ ๋ณด์—ฌ์„œ ์ดํด๋ฆฝ์Šค ๋‹ค์‹œ ๊น”๊ณ  ๋ณ„ ๋ป˜์ง“์„ ๋‹คํ–ˆ๋Š”๋ฐ ๋Œ“๊ธ€์—์„œ ๊ฟ€ํŒ์„ ์–ป์—ˆ๋‹ค......)

 

์œ„ ์ฝ”๋“œ์ฒ˜๋Ÿผ '/resource/**' ์œผ๋กœ ๋งคํ•‘ํ•˜๋ฉด ๋ชจ๋“  ์ •์  ํŒŒ์ผ์„ ๊ทธ ์ฃผ์†Œ๋กœ ๋งคํ•‘ํ•ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํŒŒ์ผ๋“ค์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊พธ๊ณ  ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•œ๋‹ค. (์ด์ „์—๋Š” webapp(๋ฃจํŠธํด๋”) ์•ˆ resource ํด๋”์— css, images, js ๋“ฑ ์žˆ์—ˆ์Œ)

 

์ˆ˜์ •์ „ ํŒŒ์ผ ๊ฒฝ๋กœ

 

์ˆ˜์ • ํ›„ ํ˜„์žฌ ํŒŒ์ผ ๊ฒฝ๋กœ

 

dispatcher-servlet.xml

    <mvc:resources location="/static/" mapping="/**"></mvc:resources>

 

์š”์ฆ˜์€ static ํด๋” ์•ˆ์— ์ •์  ํŒŒ์ผ์„ ๋ชฐ์•„๋„ฃ๋Š” ๋ฐฉ์‹์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋ฏ€๋กœ ํด๋” ์ด๋ฆ„์„ static์œผ๋กœ ์ˆ˜์ •ํ–ˆ๋‹ค.

 

 

 

โ€ป "/*"๊ณผ "/**"์˜ ์ฐจ์ด

 

     /* : /*์— ์žˆ๋Š” url๊ณผ ์ผ์น˜ํ•˜๋Š” ๋””๋ ‰ํ† ๋ฆฌ
     /** : ํ•˜์œ„ ๋””๋ ‰ํ† ๋ฆฌ๊นŒ์ง€ ํฌํ•จ
    
     ์˜ˆ๋ฅผ ๋“ค๋ฉด
     /*  ํŒจํ„ด์€  /, /aaa, /bbb ๋“ฑ๋“ฑ์— ๋งตํ•‘์ด ๋˜์ง€๋งŒ /aaa/bbb๋Š” /*์— ๋งตํ•‘์ด ์•ˆ๋˜๊ณ , /**์—๋Š” ๋งตํ•‘์ด ๋œ๋‹ค.

 

 

 

 

* ํŽ˜์ด์ง€ ๊ณตํ†ต๋ถ„๋ชจ ์ง‘์ค‘ํ™”๋ฅผ ์œ„ํ•œ ํŽ˜์ด์ง€ ๋ชจ๋“ˆ ๋ถ„๋ฆฌํ•˜๊ธฐ

 

 

 

header, footer ๋“ฑ ๋ชจ๋“  ํŽ˜์ด์ง€์— ์ผ๊ด„์ ์œผ๋กœ ์กด์žฌํ•˜๋Š” ๋ถ€๋ถ„์ด ์žˆ๋‹ค. <jsp:include>๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ณตํ†ต๋ถ€๋ถ„์„ ํ•˜๋‚˜์˜ ํŒŒ์ผ๋กœ ๊ตฌ์„ฑํ•ด์„œ ๋–ผ์–ด๋†“๊ณ  ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋“ค์ด ๊ทธ ํŽ˜์ด์ง€๋ฅผ ์ฐธ์กฐํ•˜๊ฒŒ ํ•˜๋ฉด ๊ณตํ†ต๋ถ€๋ถ„์„ ์ง‘์ค‘ํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ๋งˆ์ €๋„ ๋ชจ๋“  ํŽ˜์ด์ง€์— include ๊ตฌ๋ฌธ์„ ์จ์•ผํ•˜๋Š” ๋‹จ์ ์ด ์žˆ๊ธฐ์— tiles๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ํ•œ๋‹ค.

 

 

 

 

์ƒ๋‹จ ๋ถ€๋ถ„์€ header.jsp, ํ•˜๋‹จ ๋ถ€๋ถ„์€ footer.jsp, ๊ณ ๊ฐ์„ผํ„ฐ ๋ฉ”๋‰ด์—์„œ ํ—ค๋” ๋ฐ‘ ๋ถ€๋ถ„(customer)์€ visual.jsp, ์ขŒ์ธก ๋ฉ”๋‰ด๋Š” aside.jsp๋กœ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ๋–ผ์–ด๋†“์•˜๋‹ค. layout.jsp๋Š” ๊ตฌ์„ฑ ๋ ˆ์ด์•„์›ƒ ํŒŒ์ผ์ด๋‹ค. 

 

 

ํ˜„์žฌ ๋””๋ ‰ํ† ๋ฆฌ ์ƒํƒœ

 

 

* Tiles ์ง€์‹œ์„œ ์ž‘์„ฑํ•˜๊ธฐ

 

tiles.apache.org ์ ‘์†

 

 

tiles๋Š” ์ด์ œ ์€ํ‡ดํ–ˆ๋‹ค๊ณ  ํ•œ๋‹ค.. ์š”์ฆ˜์€ ๋ฐฑ์—”๋“œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ ๋‹ค. ํŠนํžˆ ์†Œ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ๋Š” ์™„์ „ํžˆ ํ”„๋ก ํŠธ ๋งŒ์œผ๋กœ ํŽ˜์ด์ง€ ์ž‘์—…์„ ํ•˜๊ธฐ๋„ ํ•œ๋‹ค. tiles๋Š” ๋ฐฑ์—”๋“œ์—์„œ ํŽ˜์ด์ง€๋ฅผ ํ•ฉ์น˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ๋ฐ ์š”์ฆ˜์€ ํ”„๋ก ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ถ”์„ธ์ด๋‹ค ๋ณด๋‹ˆ ๋ฐœ์ „์„ ์ ์  ์ค„์ด๊ณ  ์žˆ๋‹ค.

 

Documentation > Tiles 3.0.x > Tutorial > Creating tiles Pages > Create a definition์˜ ๋‚ด์šฉ์„ ๋ณต์‚ฌํ•˜์—ฌ WEB-INF ์•ˆ์˜ tiles.xml ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ณ  ๋ถ™์—ฌ๋„ฃ๊ธฐํ•œ๋‹ค.

 

 

ListController.java

public class ListController implements Controller{

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		ModelAndView mv = new ModelAndView("notice.list");

		return mv;
	}
}

 

์ปจํŠธ๋กค๋Ÿฌ์˜์—์„œ ๋ทฐ ๋„ค์ž„์„ 'notice.list'์œผ๋กœ ์„ค์ •ํ•˜๊ณ  ๋ฆฌํ„ด,

 

 

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="notice.list" template="/WEB-INF/view/customer/inc/layout.jsp">
  <!-- name : ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ฐ˜ํ™˜ํ•œ ์ด๋ฆ„ -->
    <put-attribute name="title" value="๊ณต์ง€์‚ฌํ•ญ" />
    <put-attribute name="header" value="/WEB-INF/view/inc/header.jsp" />
    <put-attribute name="visual" value="/WEB-INF/view/customer/inc/visual.jsp" />
    <put-attribute name="aside" value="/WEB-INF/view/customer/inc/aside.jsp" />
    <put-attribute name="body" value="/WEB-INF/view/customer/notice/list.jsp" />
    <put-attribute name="footer" value="/WEB-INF/view/inc/footer.jsp" />
  </definition>  
  <definition name="notice.detail" template="/WEB-INF/view/customer/inc/layout.jsp">
    <put-attribute name="title" value="Tiles tutorial homepage" />
    <put-attribute name="header" value="/WEB-INF/view/inc/header.jsp" />
    <put-attribute name="visual" value="/WEB-INF/view/customer/inc/visual.jsp" />
    <put-attribute name="aside" value="/WEB-INF/view/customer/inc/aside.jsp" />
    <put-attribute name="body" value="/WEB-INF/view/customer/notice/detail.jsp" />
    <put-attribute name="footer" value="/WEB-INF/view/inc/footer.jsp" />
  </definition>
</tiles-definitions>

 

tiles.xml ์ง€์‹œ์„œ์—์„œ definition name์œผ๋กœ ๋ฐ›๋Š”๋‹ค. 'notice.list'๋ผ๋Š” ์š”์ฒญ์ด ์™”์„ ๋•Œ tiles.xml์—์„œ ํ•ด๋‹น name์œผ๋กœ definition์„ ์ฐพ์•„ template, ์ฆ‰ layout.jsp๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ header, footer ๋“ฑ์„ ์„ค์ •ํ•  ๊ฒƒ์ด๋‹ค.

 

 

 

* ๋ ˆ์ด์•„์›ƒ ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ์™€ Tiles ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์„ค์ •ํ•˜๊ธฐ

 

 

 

Tiles๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์ฝ”๋“œ์—์„œ๋Š” 'notice/list' ๋ผ๋Š” ์š”์ฒญ์ด ์™”์„ ๋•Œ ๋ทฐ ๋ฆฌ์กธ๋ฒ„์˜ prefix, suffix๋ฅผ ํ†ตํ•ด 'WEB-INF/view/notice/list.jsp'๋ผ๋Š” ๋ทฐ ํŽ˜์ด์ง€๋ฅผ ์ฐพ์•„์„œ ๋ฆฌํ„ดํ•œ๋‹ค. Tiles๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด 'notice.list'๋ผ๋Š” ์š”์ฒญ์ด ์™”์„ ๋•Œ Tiles์˜ definition name์ด 'notice.list'์ธ ๊ฒƒ์„ ์ฐพ์•„ ์„ธํŒ…ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด์ œ ์ด ์•ˆ์—์„œ visual, aside, body ๋“ฑ์˜ ์œ„์น˜๋ฅผ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

 

maven repository์—์„œ tiles-jsp๋ฅผ ๊ฒ€์ƒ‰ํ•œ๋‹ค. Tiles JSP Support 3.0.8์„ ๋ณต์‚ฌํ•ด์„œ pom.xml์— ๋ถ™์ด๊ณ , ํ…œํ”Œ๋ฆฟ์ด ๋˜๋Š” layout.jsp์˜ ์ƒ๋‹จ์— tiles ํƒœ๊ทธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ค€๋‹ค.

 

 

layout.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>

<head>
<meta charset="UTF-8">
<title><tiles:getAsString name="title"></tiles:getAsString></title>

<link href="/css/customer/layout.css" type="text/css" rel="stylesheet" />
<style>
#visual .content-container {
	height: inherit;
	display: flex;
	align-items: center;
	background: url("../../images/customer/visual.png") no-repeat center;
}
</style>
</head>

<body>
	<!-- header ๋ถ€๋ถ„ -->
	<tiles:insertAttribute name="header"></tiles:insertAttribute>

	<!-- --------------------------- <visual> --------------------------------------- -->
	<!-- visual ๋ถ€๋ถ„ -->
	<tiles:insertAttribute name="visual"></tiles:insertAttribute>
	
	<!-- --------------------------- <body> --------------------------------------- -->
	<div id="body">
		<div class="content-container clearfix">

			<!-- --------------------------- aside --------------------------------------- -->
			<tiles:insertAttribute name="aside"></tiles:insertAttribute>
			<!-- aside ๋ถ€๋ถ„ -->

			<!-- --------------------------- main --------------------------------------- -->
			<tiles:insertAttribute name="body"></tiles:insertAttribute>
		</div>
	</div>

	<!-- ------------------- <footer> --------------------------------------- -->
	<tiles:insertAttribute name="footer"></tiles:insertAttribute>
</body>
</html>

 

 

* Tiles ViewResolver ์„ค์ •ํ•˜๊ธฐ

 

 

dispatcher-servlet.xml

	<!-- Tiles ViewResolver -->
	<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
		<property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView" />
		<property name="order" value="1" />
	</bean>

	<bean class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
		<property name="definitions" value="/WEB-INF/tiles.xml" />
	</bean>
    
    
	<!-- View Resolver -->
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="prefix" value="/WEB-INF/view/"></property>
		<property name="suffix" value=".jsp"></property>
		<property name="order" value="2" />
	</bean>

 

์•„๋ž˜๋Š” ์ด์ „์— ์„ค์ •ํ•ด ๋‘์—ˆ๋˜ ๋ทฐ ๋ฆฌ์กธ๋ฒ„์ด๊ณ  ์œ„์˜ ๋‘ bean ํƒœ๊ทธ๋Š” Tiles์—์„œ ์„ค์ •ํ•œ ๋ทฐ ๋ฆฌ์กธ๋ฒ„์ด๋‹ค. ๊ฐ™์€ ์š”์ฒญ์ด ์™”์„ ๋•Œ์˜ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•˜๊ธฐ ์œ„ํ•ด <property name="order".../>๋ฅผ ์ถ”๊ฐ€ํ•˜์˜€๋‹ค.

 

 

pom.xml

	<!-- https://mvnrepository.com/artifact/javax.servlet/jstl -->
	<dependency>
	    <groupId>javax.servlet</groupId>
	    <artifactId>jstl</artifactId>
	    <version>1.2</version>
	</dependency>

 

 

* Tiles ์„ค์ •์— Wildcard ์ด์šฉํ•˜๊ธฐ

 

tiles.xml์—์„œ ํŽ˜์ด์ง€๋งˆ๋‹ค definidefinition ์„ค์ •์„ ํ•ด์ฃผ์—ˆ๋Š”๋ฐ, ๋ชจ๋“  ์š”์ฒญ๊ณผ ํŽ˜์ด์ง€์— ๋Œ€ํ•ด ์ „๋ถ€ ์„ค์ •ํ•ด์•ผ ํ•˜๋ฉด ์ฝ”๋“œ๊ฐ€ ๊ธธ์–ด์ง€๊ฒŒ ๋œ๋‹ค. ์ด๋Ÿด ๋•Œ๋Š” ์™€์ผ๋“œ์นด๋“œ ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

 

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="notice.*" template="/WEB-INF/view/customer/inc/layout.jsp">
  <!-- name : ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋ฐ˜ํ™˜ํ•œ ์ด๋ฆ„ -->
    <put-attribute name="title" value="๊ณต์ง€์‚ฌํ•ญ" />
    <put-attribute name="header" value="/WEB-INF/view/inc/header.jsp" />
    <put-attribute name="visual" value="/WEB-INF/view/customer/inc/visual.jsp" />
    <put-attribute name="aside" value="/WEB-INF/view/customer/inc/aside.jsp" />
    <put-attribute name="body" value="/WEB-INF/view/customer/notice/{1}.jsp" /> 
    <!-- ์ฒซ๋ฒˆ์งธ ์™€์ผ๋“œ์นด๋“œ์— ์“ฐ์ธ ๋ฌธ์ž์—ด์„ {1}์œผ๋กœ. ์™€์ผ๋“œ์นด๋“œ๋Š” ์—ฌ๋Ÿฌ๊ฐœ์ผ ์ˆ˜ ์žˆ๋‹ค. -->
    <put-attribute name="footer" value="/WEB-INF/view/inc/footer.jsp" />
  </definition>  
</tiles-definitions>

 

definition name์—์„œ * ์‚ฌ์šฉ, body์—์„œ {1}์€ ์ฒซ ๋ฒˆ์งธ ์™€์ผ๋“œ์นด๋“œ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

 

 

 

* Root ํŽ˜์ด์ง€๋“ค์„ ์œ„ํ•œ layout ํŽ˜์ด์ง€ ๋งŒ๋“ค๊ธฐ

 

๊ณ ๊ฐ์„ผํ„ฐ ํŽ˜์ด์ง€๋“ค์„ ์œ„ํ•œ layout ์„ค์ •์ด ๋๋‚ฌ๋‹ค. ๋ฃจํŠธ ํŽ˜์ด์ง€๋ฅผ ์œ„ํ•œ layout ํŽ˜์ด์ง€๋ฅผ ์ถ”๊ฐ€ํ•ด ์ค€๋‹ค.

 

 

 

layout.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>

<head>
<title>์ฝ”๋”ฉ ์ „๋ฌธ๊ฐ€๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ์˜จ๋ผ์ธ ๊ฐ•์˜ ์‹œ์Šคํ…œ</title>
<meta charset="UTF-8">
<title>๊ณต์ง€์‚ฌํ•ญ๋ชฉ๋ก</title>

<link href="/css/layout.css" type="text/css" rel="stylesheet" />
<link href="/css/index.css" type="text/css" rel="stylesheet" />
<script>
	
</script>
</head>

<body>
	<!-- header ๋ถ€๋ถ„ -->
	<tiles:insertAttribute name="header"></tiles:insertAttribute>

	<!-- --------------------------- <body> --------------------------------------- -->
	<tiles:insertAttribute name="body"></tiles:insertAttribute>

	<!-- ------------------- <footer> --------------------------------------- -->
	<tiles:insertAttribute name="footer"></tiles:insertAttribute>


</body>
</html>

 

 

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="root.*" template="/WEB-INF/view/inc/layout.jsp">
    <put-attribute name="title" value="๊ณต์ง€์‚ฌํ•ญ" />
    <put-attribute name="header" value="/WEB-INF/view/inc/header.jsp" />
    <put-attribute name="body" value="/WEB-INF/view/{1}.jsp" /> 
    <put-attribute name="footer" value="/WEB-INF/view/inc/footer.jsp" />
  </definition>  
  <definition name="notice.*" template="/WEB-INF/view/customer/inc/layout.jsp">
    <put-attribute name="title" value="๊ณต์ง€์‚ฌํ•ญ" />
    <put-attribute name="header" value="/WEB-INF/view/inc/header.jsp" />
    <put-attribute name="visual" value="/WEB-INF/view/customer/inc/visual.jsp" />
    <put-attribute name="aside" value="/WEB-INF/view/customer/inc/aside.jsp" />
    <put-attribute name="body" value="/WEB-INF/view/customer/notice/{1}.jsp" />
    <put-attribute name="footer" value="/WEB-INF/view/inc/footer.jsp" />
  </definition>  
</tiles-definitions>

 

๋ฃจํŠธ ํŽ˜์ด์ง€๋“ค์„ ์œ„ํ•œ layout์ด๋ผ์„œ definition name์„ '*'์œผ๋กœ ์„ค์ •ํ•˜๊ฒŒ ๋˜๋ฉด, ๋ชจ๋“  ํŽ˜์ด์ง€๋“ค์€ ์ „๋ถ€ <definition name="*" ....>์„ ํƒ€๊ณ  ํ…œํ”Œ๋ฆฟ์„ ์„ธํŒ…ํ•  ๊ฒƒ์ด๋‹ค. ๊ทธ๋ ‡๊ฒŒ ๋˜๋ฉด <definition name="notice.*" ....>๊ณผ ๊ฐ™์€ ์š”์ฒญ๋„ ๋จนํžˆ์ง€๊ฐ€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ 'root.*'์ด๋ผ๊ณ  ์„ค์ •ํ•˜๊ณ , IndexController์—์„œ ๊ฒฝ๋กœ๋ฅผ ์ˆ˜์ •ํ•œ๋‹ค.

 

 

IndexController.java

public class IndexController implements Controller{

	@Override
	public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
		ModelAndView mv = new ModelAndView("root.index");
		mv.addObject("data", "Hello Spring MVC");

		return mv;
	}
}

 

ModelAndView mv = new ModelAndView("index"); ์—์„œ index๋ฅผ root.index์œผ๋กœ ์ˆ˜์ •ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ฃจํŠธ๋ฅผ ํ†ตํ•ด ๋“ค์–ด์˜ค๋Š” ํŽ˜์ด์ง€๋“ค์˜ ๋ ˆ์ด์•„์›ƒ ์„ธํŒ…๋„ ์™„๋ฃŒ๋œ๋‹ค.

 


๋‰ด๋ ‰์ฒ˜ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ ๊ฐ•์˜๋ฅผ ๋“ฃ๊ณ  ์ •๋ฆฌํ•œ ๊ฒŒ์‹œ๊ธ€์ž…๋‹ˆ๋‹ค.

www.youtube.com/user/newlec1