본문 바로가기

학원/복기

[Spring] TilesView 클래스

TilesView 클래스

  • 요청 처리 메소드의 반환값(ViewName)을 제공받아 다수의 JSP 문서가 결합된 JSP 문서(템플릿 페이지)로 응답하기 위한 기능을 제공해준다.
  • 일종의 ViewResolver이다.
  • Apache에서 제공해준다.

 

https://tiles.apache.org/ 참고 

 

사용법

 

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