▼ Backend/스프링 (Spring)

Spring Boot | Tiles (타일즈) 적용하기

Valar 2021. 6. 30. 15:28
반응형

▶ Tiles 란?

웹 페이지의 상단(Header)이나 하단(Footer)과 같이 반복적으로 사용되는 부분들에 대한 코드를 분리하여, 한 곳에서 관리를 가능하게 해 준다.

 

1. pom.xml

 


  <!--- JSTL 필요 : JSTL Dependency를 Maven에 추가해줘야 함.-->
  <dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
  </dependency>
  <dependency>
    <groupId>org.apache.tiles</groupId>
    <artifactId>tiles-jsp</artifactId>
    <version>3.0.7</version>
  </dependency>

 

 

2. WebConfig.java

 

package com.sample.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.view.tiles3.TilesConfigurer;
import org.springframework.web.servlet.view.tiles3.TilesView;
import org.springframework.web.servlet.view.tiles3.TilesViewResolver;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    // TilesConfigurer
    @Bean
    public TilesConfigurer tilesConfigurer() {
        final TilesConfigurer configurer = new TilesConfigurer();

        // tiles.xml 경로 명시
        configurer.setDefinitions(new String[] {
            "/WEB-INF/tiles/tiles.xml"
        });

        // 리프레쉬 가능 여부 설정
        configurer.setCheckRefresh(true);

        return configurer;
    }

    // TilesViewResolver
    @Bean
    public TilesViewResolver tilesViewResolver() {
        final TilesViewResolver tilesViewResolver = new TilesViewResolver();
        tilesViewResolver.setViewClass(TilesView.class);
        tilesViewResolver.setOrder(1); //뷰 우선순위
        return tilesViewResolver;
    }
}

 

 

3. MainController.java

 

package com.sample.main.web;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class MainController {

    @GetMapping("/")
    public String getMainPage(ModelMap model) throws Exception {
        // .web이 tiles.xml에서 접미어로 구분하여 적용한다.
        return "main/index.web";
    }
}

 

 

4. tiles.xml (/webapp/WEB-INF/tiles/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="layout-tiles" template="/WEB-INF/jsp/tiles/layout.jsp">
       <put-attribute name="header" value="/WEB-INF/jsp/tiles/header.jsp" />
       <put-attribute name="body" value="" />
       <put-attribute name="footer" value="/WEB-INF/jsp/tiles/footer.jsp" />
   </definition>
   
   <!-- 
	접미어가 web인 대상들만 tiles를 적용한다. (Ex. Controller Page Return)
	*/* 방식으로 지정하여 접미어 상관없이 전체를 적용할수도 있다.
   -->
   <definition name="*.web" extends="layout-tiles">
       <put-attribute name="body" value="/WEB-INF/jsp/{1}.jsp" />
   </definition>
   <definition name="*/*.web" extends="layout-tiles">
       <put-attribute name="body" value="/WEB-INF/jsp/{1}/{2}.jsp" />
   </definition>
   <definition name="*/*/*.web" extends="layout-tiles">
       <put-attribute name="body" value="/WEB-INF/jsp/{1}/{2}/{3}.jsp" />
   </definition>
</tiles-definitions>

 

 

5. header.jsp (/webapp/WEB-INF/jsp/tiles/header.jsp)

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<p>HEADER</p>

 

 

6. index.jsp (/webapp/WEB-INF/jsp/main/index.jsp)

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<p>BODY</p>

 

 

7. footer.jsp (/webapp/WEB-INF/jsp/tiles/footer.jsp)

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<p>FOOTER</p>

 

 

8. layout.jsp (/webapp/WEB-INF/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">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>Tiles</title>
  </head>
  <body>
    <tiles:insertAttribute name="header" />
    <tiles:insertAttribute name="body" />
    <tiles:insertAttribute name="footer" />
  </body>
</html>

 

 

index 페이지를 호출하면 header, footer가 적용된 상태로 나오는 걸 확인할 수 있다.

 

반응형