📃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>