TilesView 클래스
- 요청 처리 메소드의 반환값(ViewName)을 제공받아 다수의 JSP 문서가 결합된 JSP 문서(템플릿 페이지)로 응답하기 위한 기능을 제공해준다.
- 일종의 ViewResolver이다.
- Apache에서 제공해준다.
사용법
1. TilesView 관련 라이브러리(tiles-extras 라이브러리)를 프로젝트에 빌드 처리 해준다. (메이븐 이용 : pom.xml)
https://mvnrepository.com/artifact/org.apache.tiles/tiles-extras/3.0.8

pom.xml

2. 요청 처리 메소드의 반환값(ViewName)을 제공받아 응답할 템플릿 페이지를 설정해준다.
- TilesView 프로그램의 환경설정파일을 설정한다. - /WEB-INF/spring/appServlet/tiles.xml

difinition : 요청 처리 메소드의 반환값(ViewName)을 제공받아 응답 처리할 템플릿 페이지의 JSP 문서를 설정하기 위한 엘리먼트
- name 속성에는 definition 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정한다.
- -> name 속성값이 요청 처리 메소드의 반환값과 같은 경우 definition 엘리먼트로 응답 처리한다.
- template 속성에는 응답 처리할 JSP 문서(템플릿 페이지)의 경로를 속성값으로 설정한다.
put-attribute : 템플릿 페이지 작성에 필요한 JSP 문서를 제공하기 위한 엘리먼트
- name 속성에는 put-attribute 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정한다.
- value 속성에는 put-attribute 엘리먼트로 제공될 JSP 문서의 경로를 속성값으로 설정한다.
tiles.xml


header.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<h1>머릿부</h1>
main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<h1>몸체부</h1>
footer.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<h1>꼬릿부</h1>
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 태그 : TileView 프로그램의 환경설정파일에서 put-attribute 엘리먼트로
제공된 JSP 문서의 실행결과를 제공받아 삽입하기 위한 태그 --%>
<tiles:insertAttribute name="header"/>
</div>
<div id="content">
<tiles:insertAttribute name="content"/>
</div>
<div id="footer">
<tiles:insertAttribute name="footer"/>
</div>
</body>
</html>
3. Front Controller(DispatcherServlet 클래스)가 요청 처리 메소드의 반환값(ViewName)을 제공받아 TilesView 클래스를 이용하여 응답 처리되도록 Spring Bean Configuration File(servlet-context.xml)을 설정한다.
- InternalResourceViewResolver 프로그램보다 TilesView 클래스가 먼저 실행되도록 우선 순위를 설정해주어야 한다.
UrlBasedViewResolver 객체
- 클라이언트 요청에 의해 호출되는 요청 처리 메소드의 반환값(ViewName)을 spring 프레임워크에서 제공하는 ViewResolver 객체가 아닌 외부의 ViewResolver 객체로 응답처리하기 위한 기능을 제공하는 객체이다.
- 뷰이름으로 응답 처리하기 위한 뷰를 커스터마이징(Customizing) 할 때 사용하는 객체이다.
order 필드에 ViewResolver 객체의 우선순위를 설정하기 위한 정수값을 주입해준다.
- 다수의 ViewResolver 객체가 있는 경우 반드시 우선순위를 설정해주어야 한다.
- 필드에 저장된 정수값이 작을수록 우선순위가 높게 설정된다.
servlet-context.xml

TilesConfigurer 클래스를 Spring Bean으로 등록해준다.
- TilesConfigurer 객체 : TilesView 클래스가 응답 처리하기 위한 정보를 얻기 위한 환경설정 파일을 제공하는 객체

TilesController
@Controller
public class TilesController {
@RequestMapping("/")//최상위 디렉토리를 요청
public String tiles() {
return "main";
}
}

name 속성값을 [*]로 설정한 경우 요청 처리 메소드에서 [문자값] 형식으로 반환하는 모든 뷰이름을 제공받아 definition 엘리먼트로 응답 처리가 가능하다.
extends 속성에는 definition 엘리먼트의 식별자를 속성값으로 설정한다.
- -> definition 엘리먼트의 응답 JSP 문서를 상속받아 사용할 수 있다.
definition 엘리먼트로 상속받은 put-attribute 엘리먼트를 오버라이드 선언하면 put-attribute 엘리먼트의 name 속성값이 같은 경우에 기존 JSP 문서 대신 새로운 JSP 문서를 템플릿 페이지에게 제공한다.
definition 엘리먼트의 name 속성값을 [*]로 설정한 경우 put-attribute 엘리먼트의 value 속성에서는 [*]을 {정수값} 형식으로 표현하여 사용할 수 있다.
- -> 요청 처리 메소드에서 반환되는 뷰이름을 정수값으로 표현하여 사용할 수 있다.
- -> 뷰이름 대신 사용되는 정수값은 1부터 1씩 증가된 값을 사용한다.
<definition name="*" extends="main">
<!-- definition 엘리먼트로 상속받은 put-attribute 엘리먼트를 오버라이드 선언
-> put-attribute 엘리먼트의 name 속성값이 같은 경우 기존 JSP 문서 대신 새로운
JSP 문서를 템플릿 페이지에게 제공한다. -->
<put-attribute name="content" value="/WEB-INF/views/{1}.jsp"></put-attribute>
</definition>
definition 엘리먼트의 name 속성값을 [*/*]로 설정한 경우 요청 처리 메소드에서 [문자값/문자값] 형식으로 반환하는 모든 뷰이름을 제공받아 definition 엘리먼트로 응답 처리할 수 있다.
//클라이언트 요청
@RequestMapping("/tiles1")
public String tiles1() {
return "layout/tiles1";
}
//동작
<definition name="*/*" extends="main">
<put-attribute name="content" value="/WEB-INF/views/{1}/{2}.jsp"></put-attribute>
</definition>
definition 엘리먼트의 name 속성값을 [*/*/*]로 설정한 경우 요청 처리 메소드에서 [문자값/문자값/문자값] 형식으로 반환하는 모든 뷰이름을 제공받아 definition 엘리먼트로 응답 처리할 수 있다.
//클라이언트 요청
@RequestMapping("/tiles2")
public String tiles2() {
return "layout/sub/tiles2";
}
}
//동작
<definition name="*/*/*" extends="main">
<put-attribute name="content" value="/WEB-INF/views/{1}/{2}/{3}.jsp"></put-attribute>
</definition>
관리자 페이지의 경우
디자인이 다른 경우
<!--<definition name="admin" template="/WEB-INF/views/layout/template_admin.jsp">-->
디자인이 같은 경우
<definition name="admin" extends="main">
<put-attribute name="header" value="/WEB-INF/views/layout/header_admin.jsp"/>
<put-attribute name="content" value="/WEB-INF/views/layout/main_admin.jsp"/>
<put-attribute name="footer" value="/WEB-INF/views/layout/footer_admin.jsp"/>
</definition>
<definition name="admin/*" extends="main">
<put-attribute name="content" value="/WEB-INF/views/admin/{1}.jsp"/>
</definition>
<definition name="admin/*/*" extends="main">
<put-attribute name="content" value="/WEB-INF/views/admin/{1}/{2}.jsp"/>
</definition>
TilesController
@RequestMapping("/admin")
public String admin() {
return "admin";
}
@RequestMapping("/admin1")
public String admin1() {
return "admin/display1";
}
@RequestMapping("/admin2")
public String admin2() {
return "admin/sub/display2";
}
'학원 > 복기' 카테고리의 다른 글
[Spring] 인터셉터(Interceptor) (0) | 2023.08.14 |
---|---|
[Spring] 예외 클래스 / ExceptionHandler / jbcrypt 라이브러리 (0) | 2023.08.11 |
[Spring] TranscationManager (0) | 2023.08.10 |
[Spring] SpringMVC 이용한 웹프로그램 작성(2) / Junit 이용 (0) | 2023.08.09 |
[Spring] Mybatis 로깅 정보를 스프링 로그 구현체로 기록하는 방법 (0) | 2023.08.09 |