TilesView 관련 라이브러리(tiles-extras)를 프로젝트에 빌드 처리 (메이븐 : pom.xml)
요청 처리 메소드의 반환값(ViewName)을 제공받아 응답할 템플릿 페이지 설정
Front Controller가 요청 처리 메소드의 반환값(ViewName)을 제공받아 TilesView를 이용하여 응답 처리되도록 Spring Bean Configuration File 설정 → servlet-context.xml
package xyz.itwill10.controller;
@Controller
public class TilesController {
@RequestMapping("/")
public String tiles() {
return "main";
}
@RequestMapping("/tiles1")
public String tilesOne() {
return "tiles/view";
}
@RequestMapping("/tiles2")
public String tilesTwo() {
return "tiles/sub/view";
}
@RequestMapping("/mgr")
public String tilesAdmin() {
return "admin";
}
@RequestMapping("/mgr_member")
public String tilesMember() {
return "admin/member";
}
}
<!-- https://mvnrepository.com/artifact/org.apache.tiles/tiles-extras -->
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-extras</artifactId>
<version>3.0.8</version>
</dependency>
- definition : 요청 처리 메소드의 반환값(ViewName)을 제공받아 응답 처리할 템플릿 페이지의 JSP 문서를 설정하기 위한 엘리먼트
- name 속성 : definition 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정
- 요청 처리 메소드의 반환값을 제공받아 응답 처리하기 위한 definition 엘리먼트 지정
- template 속성 : 템플릿 페이지의 JSP 문서 경로를 속성값으로 설정
<definition name="main" template="/WEB-INF/views/template.jsp">
- name 속성값을 [*]로 설정한 경우 요청 처리 메소드에서 [문자값] 형식으로 반환되는 모든 뷰이름을 제공받아 처리
- extends 속성 : definition 엘리먼트의 식별자를 속성값으로 설정
- definition 엘리먼트의 템플릿 페이지와 하위 엘리먼트의 정보를 상속받아 사용 가능
<definition name="*" extends="main">
<put-attribute name="content" value="/WEB-INF/views/{1}.jsp"/>
<put-attribute name="content" value="/WEB-INF/views/{1}/{2}.jsp"/>
<?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 : 요청 처리 메소드의 반환값(ViewName)을 제공받아 응답 처리할 템플릿
페이지의 JSP 문서를 설정하기 위한 엘리먼트 -->
<!-- name 속성 : definition 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정 -->
<!-- => 요청 처리 메소드의 반환값을 제공받아 응답 처리하기 위한 definition 엘리먼트 지정 -->
<!-- template 속성 : 응답할 JSP 문서(템플릿 페이지)의 경로를 속성값으로 설정 -->
<definition name="main" template="/WEB-INF/views/template.jsp">
<!-- put-attribute : definition 엘리먼트의 템플릿 페이지를 구성하기 위한 JSP 문서를 제공하는 엘리먼트 -->
<!-- name 속성 : put-attribute 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정 -->
<!-- => 템플릿 페이지의 JSP 문서에서 put-attribute 엘리먼트로 제공된 JSP 문서의
실행 결과를 제공받아 포함하기 위해 사용하는 이름 -->
<!-- value 속성 : put-attribute 엘리먼트로 제공될 JSP 문서의 경로를 속성값으로 설정 -->
<put-attribute name="header" value="/WEB-INF/views/layout/header.jsp"/>
<put-attribute name="content" value="/WEB-INF/views/layout/main.jsp"/>
<put-attribute name="footer" value="/WEB-INF/views/layout/footer.jsp"/>
</definition>
<!--
<definition name="admin" extends="main">
<put-attribute name="header" value="/WEB-INF/views/layout/admin_header.jsp"/>
<put-attribute name="content" value="/WEB-INF/views/layout/admin_main.jsp"/>
</definition>
-->
<definition name="admin" template="/WEB-INF/views/layout/admin_template.jsp">
<put-attribute name="header" value="/WEB-INF/views/layout/admin_header.jsp"/>
<put-attribute name="content" value="/WEB-INF/views/layout/admin_main.jsp"/>
</definition>
<definition name="admin/*" extends="admin">
<put-attribute name="content" value="/WEB-INF/views/tiles/{1}.jsp"/>
</definition>
<!-- name 속성값을 [*]로 설정한 경우 요청 처리 메소드에서 [문자값] 형식으로 반환되는
모든 뷰이름을 제공받아 definition 엘리먼트로 처리 가능 -->
<!-- extends 속성 : definition 엘리먼트의 식별자를 속성값으로 설정 -->
<!-- => definition 엘리먼트의 응답 JSP 문서(템플릿 페이지)와 포함 JSP 문서의 정보를 상속받아 사용 가능 -->
<definition name="*" extends="main">
<!-- put-attribute 엘리먼트에서 상속받은 put-attribute 엘리먼트와 같은 식별자를 사용하여
작성하면 기존 JSP 문서 대신 변경된 JSP 문서를 제공받아 사용 가능 - 오버라이드(Override) -->
<!-- definition 엘리먼트의 name 속성값을 [*]로 설정하면 put-attribute 엘리먼트의 value
속성에서는 반환되는 [문자값]을 {정수값} 형식으로 표현하여 사용 -->
<!-- => 반환되는 [문자값]을 대신하는 정수값은 [1]부터 시작 -->
<put-attribute name="content" value="/WEB-INF/views/{1}.jsp"/>
</definition>
<!-- name 속성값을 [*/*]로 설정한 경우 요청 처리 메소드에서 [문자값/문자값] 형식으로 반환되는
모든 뷰이름을 제공받아 definition 엘리먼트로 처리 가능 -->
<definition name="*/*" extends="main">
<!-- name 속성값의 [*] 기호가 여러개인 경우 {정수값}이 1부터 1씩 증가되어 문자값을 차례대로 표현 -->
<put-attribute name="content" value="/WEB-INF/views/{1}/{2}.jsp"/>
</definition>
<definition name="*/*/*" extends="main">
<put-attribute name="content" value="/WEB-INF/views/{1}/{2}/{3}.jsp"/>
</definition>
</tiles-definitions>
- UrlBasedViewResolver 클래스를 Spring Bean으로 등록
- UrlBasedViewResolver 객체 : 클라이언트 요청에 의해 호출되는 요청 처리 메소드의 반환값(ViewName)을 제공받아 Spring Framework가 제공하는 ViewResolver 객체가 아닌 외부의 뷰프로그램(apache)을 이용하여 응답 처리하는 객체
- 뷰이름으로 응답하기 위한 뷰를 커스터마이징 할 때 사용하는 객체
<beans:bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
viewClass 필드에 뷰프로그램을 구현한 클래스를 인젝션 처리
<beans:property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView"/>
order 필드에 ViewResolver 객체의 우선순위 관련 정수값을 인젝션 처리
<beans:property name="order" value="2"/>
- TilesConfigurer 클래스를 Spring Bean으로 등록
- TilesConfigurer 객체 : TilesView 프로그램의 응답관련 정보를 저장한 Tiles 환경설정파일을 제공하기 위한 객체
<beans:bean class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
definitions 필드에 List 객체를 생성하여 인젝션 처리
<beans:value>/WEB-INF/spring/appServlet/tiles.xml</beans:value>
<?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">
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- servlet-context.xml : appServlet 이름의 Front Controller에서 사용될 클래스의 Spring
Bean을 등록하기 위한 Spring Bean Configuration File -->
<!-- Enables the Spring MVC @Controller programming model -->
<!-- annotation-driven : @Controller 어노테이션을 사용하여 요청 처리 클래스를 Spring Bean으로
등록하고 @RequestMapping 어노테이션을 사용하여 작성된 메소드를 요청 처리 메소드로 등록하여
클라이언트 요청에 의해 요청 처리 클래스의 메소드가 호출되어 처리되도록 설정하는 엘리먼트 -->
<!-- => HandlerMapping 객체를 사용하지 않아도 요청 처리 클래스의 요청 처리 메소드가
클라이언트의 요청에 의해 호출되도록 자동으로 매핑 처리 -->
<annotation-driven />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<!-- resources : 클라이언트 요청을 Front Controller가 직접 응답 처리되도록 설정하는 엘리먼트 -->
<!-- => 클라이언트의 리소스 파일 요청에 대한 응답 처리를 위해 사용하는 엘리먼트 -->
<!-- mapping 속성 : 클라이언트에 의해 요청되는 리소스 파일의 요청 URL 주소 패턴을 속성값으로 설정 -->
<!-- => [**] 패턴문자를 속성값으로 사용한 경우 현재 폴더 및 하위 폴더의 리소스 파일 요청 가능 -->
<!-- location 속성 : 클라이언트 요청에 의해 리소스 파일을 검색하기 위한 폴더를 속성값으로 설정 -->
<!-- <resources mapping="/resources/**" location="/resources/" /> -->
<resources mapping="/images/**" location="/resources/images/" />
<resources mapping="/css/**" location="/resources/css/" />
<resources mapping="/js/**" location="/resources/js/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<!-- InternalResourceViewResolver 클래스를 Spring Bean으로 등록 -->
<!-- InternalResourceViewResolver 객체 : 클라이언트 요청에 의해 호출되는 요청 처리 메소드의
반환값(ViewName)을 제공받아 응답 가능한 JSP 문서로 변환하여 반환하는 객체 -->
<beans:bean 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="3"/>
</beans:bean>
<!-- UrlBasedViewResolver 클래스를 Spring Bean으로 등록 -->
<!-- UrlBasedViewResolver 객체 : 클라이언트 요청에 의해 호출되는 요청 처리 메소드의
반환값(ViewName)을 제공받아 Spring Framework가 제공하는 ViewResolver 객체가 아닌
외부의 뷰프로그램의 이용하여 응답 처리하는 객체 -->
<!-- => 뷰이름으로 응답하기 위한 뷰를 커스터마이징 할 때 사용하는 객체 -->
<beans:bean class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<!-- viewClass 필드에 뷰프로그램을 구현한 클래스를 인젝션 처리 -->
<beans:property name="viewClass" value="org.springframework.web.servlet.view.tiles3.TilesView"/>
<!-- order 필드에 ViewResolver 객체의 우선순위 관련 정수값을 인젝션 처리 -->
<!-- => 다수의 ViewResolver 객체를 이용할 경우 모든 ViewResolver 객체는 반드시 우선순위 설정 -->
<!-- => 필드의 저장된 정수값이 적을수록 우선순위가 높게 설정 -->
<beans:property name="order" value="2"/>
</beans:bean>
<!-- TilesConfigurer 클래스를 Spring Bean으로 등록 -->
<!-- TilesConfigurer 객체 : TilesView 프로그램의 응답관련 정보를 저장한 Tiles 환경설정파일을 제공하기 위한 객체 -->
<beans:bean class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
<!-- definitions 필드에 List 객체를 생성하여 인젝션 처리 -->
<!-- => List 객체의 요소로 Tiles 환경설정파일(XML)의 경로를 추가하여 제공 -->
<beans:property name="definitions">
<beans:list>
<beans:value>/WEB-INF/spring/appServlet/tiles.xml</beans:value>
</beans:list>
</beans:property>
</beans:bean>
<!-- component-scan : 스프링 컨테이너가 스프링 어노테이션을 검색하여 처리하기 위한 엘리먼트 -->
<!-- base-package 속성 : 스프링 어노테이션을 검색하기 위해 어노테이션을 사용한 클래스의 패키지를 속성값으로 설정 -->
<!-- <context:component-scan base-package="xyz.itwill.controller" /> -->
<!-- xyz.itwill10.controller 패키지에 요청 처리 클래스(Model)를 작성하고 스프링 어노테이션을
이용하여 Spring Bean으로 등록 -->
<context:component-scan base-package="xyz.itwill10.controller" />
</beans:beans>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<h1>머릿부</h1>
TilesView 관련 기능을 태그로 제공받기 위해 tags-tiles 태그 라이브러리을 JSP 문서에 포함
<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%>
insertAttribute 태그 : TilesView의 환경설정파일에서 put-attribute 엘리먼트로 제공된 JSP 문서의 실행결과를 제공받아 삽입하기 위한 태그
<tiles:insertAttribute name="header"/>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%-- TilesView 관련 기능을 태그로 제공받기 위해 tags-tiles 태그 라이브러리을 JSP 문서에 포함 --%>
<%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>SPRING</title>
<style type="text/css">
#header {
border: 2px solid red;
height: 150px;
margin: 10px;
padding: 10px;
text-align: center;
}
#content {
border: 2px solid green;
min-height: 450px;
margin: 10px;
padding: 10px;
}
#footer {
border: 2px solid blue;
height: 150px;
margin: 10px;
padding: 10px;
text-align: center;
}
</style>
</head>
<body>
<div id="header">
<%-- insertAttribute 태그 : TilesView의 환경설정파일에서 put-attribute 엘리먼트로
제공된 JSP 문서의 실행결과를 제공받아 삽입하기 위한 태그 --%>
<!-- name 속성 : put-attribute 엘리먼트의 식별자를 속성값으로 설정 -->
<tiles:insertAttribute name="header"/>
</div>
<div id="content">
<tiles:insertAttribute name="content"/>
</div>
<div id="footer">
<tiles:insertAttribute name="footer"/>
</div>
</body>
</html>