TilesView (다수의 JSP 문서 결합)

woom·2023년 2월 27일
0

Framework

목록 보기
14/20
post-thumbnail

🌼 TilesView

  • 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보다 먼저 실행되도록 설정

📙 Model (Tiles)


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";
	}
}





📌 Tiles-extras lib 빌드 처리

  • TilesView 기능을 제공하기 위한 라이브러리
		<!-- 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>





📒 tiles.xml

  • 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 문서의 경로를 속성값으로 설정
  • name 속성값을 [*]로 설정한 경우 요청 처리 메소드에서 [문자값] 형식으로 반환되는 모든 뷰이름을 제공받아 처리
    • extends 속성 : definition 엘리먼트의 식별자를 속성값으로 설정
    • definition 엘리먼트의 템플릿 페이지와 하위 엘리먼트의 정보를 상속받아 사용 가능
    • <definition name="*" extends="main">
  • put-attribute 엘리먼트에서 상속받은 put-attribute 엘리먼트와 같은 식별자를 사용하여 작성하면 기존 JSP 문서 대신 변경된 JSP 문서 제공받아 사용 가능 → 오버라이드(Override)
    • definition 엘리먼트의 ame 속성값을 [ * ]로 설정하면 put-attribute 엘리먼트의 value 속성에서는 반환되는 [문자값]을 {정수값} 형식으로 표현하여 사용
    • <put-attribute name="content" value="/WEB-INF/views/{1}.jsp"/>
    • 반환되는 [문자값]을 대신하는 정수값은 [1]부터 시작
  • name 속성값을 [ * / * ]로 설정한 경우 요청 처리 메소드에서 [문자값 / 문자값] 형식으로 반환되는 모든 뷰이름을 제공받아 definition 엘리먼트로 처리 가능
    • name 속성값의 [ * ] 기호가 여러개인 경우 {정수값}이 1부터 1씩 증가되어 문자값을 차례대로 표현
    • <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>		





📕 servlet-context.xml (Tiles)

  • 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 객체의 우선순위 관련 정수값을 인젝션 처리

    • 다수의 ViewResolver 객체를 이용할 경우 모든 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 객체를 생성하여 인젝션 처리

    • List 객체의 요소로 Tiles 환경설정파일(XML)의 경로를 추가하여 제공
    • <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>





🌸 header.jsp

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




🐣 응답 (template)

  • TilesView 관련 기능을 태그로 제공받기 위해 tags-tiles 태그 라이브러리을 JSP 문서에 포함

    • <%@taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%>
  • insertAttribute 태그 : TilesView의 환경설정파일에서 put-attribute 엘리먼트로 제공된 JSP 문서의 실행결과를 제공받아 삽입하기 위한 태그

    • name 속성 : put-attribute 엘리먼트의 식별자를 속성값으로 설정
    • <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>
  
  
  
  
  

profile
Study Log 📂

0개의 댓글