[Spring 13-3] TilesView를 이용한 프로그램 사용법

임승현·2023년 2월 24일

Spring

목록 보기
38/46

🌈요청 처리 클래스 생성

📃TilesController.java

※ xyz.itwill10.controller 패키지에 TilesController.java 클래스 생성

package xyz.itwill10.controller;
//
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
//
//TilesView : 요청 처리 메소드의 반환값(ViewName)을 제공받아 다수의 JSP 문서를 합쳐 하나의
//템플릿 페이지의 JSP 문서로 응답하기 위한 기능을 제공하는 뷰프로그램 - ViewResolver
//1.TilesView 관련 라이브러리(tiles-extras)를 프로젝트에 빌드 처리 - 메이븐 : pom.xml
//2.요청 처리 메소드의 반환값(ViewName)을 제공받아 응답할 템플릿 페이지 설정
//→ TilesView 환경설정파일(XML)을 작성하여 설정 - /WEB-INF/spring/appServlet/tiles.xml
//3.Front Controller가 요청 처리 메소드의 반환값(ViewName)을 제공받아 TilesView를 이용하여 응답 처리되도록 Spring Bean Configuration File 설정 - servlet-context.xml
//→ 기존의 ViewName을 JSP 문서로 변환한 InternalResourceViewResolver보다 먼저 실행되도록 설정
//
@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";
	}
	//관리자 페이지를 요청해서 Header가 바뀌는 경우
	@RequestMapping("/mgr")
	public String tilesAdmin() {
		return "admin";
	}
	//
	@RequestMapping("/mgr_member")
	public String tilesMember() {
		return "admin/member";
	}
}

①메이븐 빌드 처리

📃pom.xml

<!-- https://mvnrepository.com/artifact/org.apache.tiles/tiles-extras -->
<!-- → TilesView 기능을 제공하기 위한 라이브러리 -->
<dependency>
    <groupId>org.apache.tiles</groupId>
    <artifactId>tiles-extras</artifactId>
    <version>3.0.8</version>
</dependency>

②TilesView 환경설정파일(XML)을 작성

📃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 : 요청 처리 메소드의 반환값(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>
	<!-- ============================================================================================================ -->
	<!-- 관리자 페이지를 요청해서 Header가 바뀌는 경우 -->
	<!-- 
	<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 속성값을 [*]로 설정한 경우 요청 처리 메소드에서 [문자값] 형식으로 반환되는 모든 뷰이름을 제공받아 처리 -->
	<!-- extends 속성 : definition 엘리먼트의 식별자를 속성값으로 설정 -->
	<!-- → definition 엘리먼트의 템플릿 페이지와 하위 엘리먼트의 정보를 상속받아 사용 가능 -->
	<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 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>	

③Spring Bean Configuration File 설정

📃servlet-context.xml

<?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 Configuretion 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>

🌈템플릿 페이지 생성

📃template.jsp

※ WEB-INF/views 폴더에 template.jsp 생성

<%@ 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>

📃header.jsp

※ WEB-INF/views 폴더에 layout 폴더 생성 후 header.jsp 생성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<h1>머릿부</h1>

📃main.jsp

※ WEB-INF/views/layout 폴더에 main.jsp 생성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<h1>몸체부</h1>

📃footer.jsp

※ WEB-INF/views/layout 폴더에 footer.jsp 생성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<h1>꼬릿부</h1>

📃view.jsp

※ WEB-INF/views 폴더에 tiles 폴더 생성 후 view.jsp 생성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>SPRING</title>
</head>
<body>
	<h1>TilesView - 1</h1>
	<hr>
</body>
</html>

📃view.jsp

※ WEB-INF/views/tiles 폴더에 sub 폴더 생성 후 view.jsp 생성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>SPRING</title>
</head>
<body>
	<h1>TilesView - 2</h1>
	<hr>
</body>
</html>

📃admin_header.jsp

※ WEB-INF/views/layout 폴더에 admin_header.jsp 생성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<h1>머릿부 - 관리자</h1>

📃admin_main.jsp

※ WEB-INF/views/layout 폴더에 admin_main.jsp 생성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<h1>몸체부 - 관리자</h1>

📃admin_template.jsp

※ WEB-INF/views/layout 폴더에 admin_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>
<head>
<meta charset="UTF-8">
<title>SPRING</title>
<style type="text/css">
#header {
	border: 2px solid red;
	height: 200px;
	margin: 10px;
	padding: 10px;
	text-align: center;
}
#content {
	border: 2px solid green;
	min-height: 550px;
	margin: 10px;
	padding: 10px;
}
</style>
</head>
<body>
	<div id="header">
		<tiles:insertAttribute name="header"/>	
	</div>
	<div id="content">
		<tiles:insertAttribute name="content"/>	
	</div>
</body>
</html>

📃member.jsp

※ WEB-INF/views 폴더에 member.jsp 생성

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<h1>회원관리 - 관리자</h1>

0개의 댓글