반응형
외부의 뷰프로그램으로 응답하기 위해 필요한 UrlBasedViewResolver (servlet-context.xml에 등록)
- 필드에 일종의 ViewResolver 역할을 해줄 TilesView 클래스 의존성 주입
- TilesView (Spring이 직접 만들어주는 것이 아닌 아파치에서 제공해줌) : inlclude 액션태그처럼 결과를 포함시키는 TilesView 클래스 (코드 포함이 아님!!)
🌈TilesView 관련 라이브러리 빌드 처리
[🖤Model] 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 {
//클라이언트는 특정 페이지 요청이 아닌 /(최상위디렉토리)를 요청할 것임
//=> 서버의 최상위디렉토리 : <http://localhost:8000/spring>
@RequestMapping("/")
public String tiles() {
//[뷰이름]을 반환하는 것이 아니라, definition 엘리먼트의 [name 속성값 = main]임
return "main";
}
@RequestMapping("/tiles1")
public String tilesOne() {
//definition 엘리먼트의 [name 속성값 = */*]임
return "tiles/view";
}
@RequestMapping("/tiles2")
public String tilesTwo() {
//definition 엘리먼트의 [name 속성값 = */*/*]임
return "tiles/sub/view";
}
@RequestMapping("/mgr")
public String tilesAdmin() {
//[뷰이름]을 반환하는 것이 아니라, definition 엘리먼트의 [name 속성값 = admin]임
return "admin";
}
@RequestMapping("/mgr_member")
public String tilesMember() {
//[뷰이름]을 반환하는 것이 아니라, definition 엘리먼트의 [name 속성값 = admin/*]임
return "admin/member";
}
}
💖TilesView 환경설정파일(XML) [tiles.xml]
<?xml version="1.0" encoding="UTF-8"?>
<!-- 루트엘리먼트는 tiles-definitious / 누구나사용가능 / 아피치 소프트웨어 재단에서 제공해주는 /영어로 된 DTD파일 3.0버전
그 파일의 위치는 <https://tiles.apache.org/dtds/tiles-config_3_0.dtd> -->
<!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>
- 반환값으로 main 식별자를 받으면 TilesView가 해당 jsp 문서를 조합해 결과값 반환 : template속성 이용
<!-- definition : 요청 처리 메소드의 반환값(ViewName)을 제공받아 응답할 템플릿 페이지의 JSP 문서를 설정하기 위한 엘리먼트 -->
<!-- name 속성 : 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정 -->
<!-- => [요청 처리 메소드의 반환값]을 제공받아 응답처리하기 위한 definition 엘리먼트 지정 -->
<!-- => 즉, [요청 처리 메소드의 반환값] = [definition 엘리먼트의 name 속성값] -->
<!-- template 속성 : 템플릿 페이지의 JSP 문서 경로를 속성값으로 설정 -->
<definition name="main" template="/WEB-INF/views/template.jsp">
<!-- put-attribute : definition 엘리먼트의 템플릿 페이지를 구성하기 위한 JSP 문서를 제공하는 엘리먼트 -->
<!-- 일종의 include 액션태그와 비슷, 코드를 삽입하는 것이 아닌 결과를 삽입하는 것 -->
<!-- name 속성 : put-attribute 엘리먼트를 구분하기 위한 식별자를 속성값으로 설정 -->
<!-- => 템플릿 페이지의 JSP 문서에서 put-attribute로 제공된 JSP 문서의 실행 결과를 제공받아 포함하기 위해 사용하는 이름 -->
<!-- value 속성 : put-attribute 엘리먼트로 제공될 JSP 문서의 경로를 속성값으로 설정 -->
<!-- => header,content,footer 이름을 가진 JSP 문서의 실행결과를 main에게 갖다줘!! -->
<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>
- 반환값으로 admin 식별자를 받으면 TilesView가 해당 jsp 문서를 조합해 결과값 반환 : extends속성 이용
<!-- => [main] 상속받을게~ 가져다 쓸 수 있는 [header,content,footer] 3개 중 header와 content 쓸건데, 오버라이드 할게~ -->
<!--
<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>
-->
- 반환값으로 admin 식별자를 받으면 TilesView가 해당 jsp 문서를 조합해 결과값 반환 : template속성 이용
<!-- 레이아웃 전체가 변경될 경우 템플릿을 상속받지 말고 그냥 새로 만들기 -->
<!-- 레이아웃 중 footer는 빼고 header & content 새로 작성하면 출력 시 header & content만 나옴 -->
<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>
- 반환값으로 admin/* 식별자를 받으면 TilesView가 해당 jsp 문서를 조합해 결과값 반환 : extends속성 이용
<definition name="admin/*" extends="admin">
<put-attribute name="content" value="/WEB-INF/views/tiles/{1}.jsp"/>
</definition>
- 반환값으로 * 식별자를 받으면 TilesView가 해당 jsp 문서를 조합해 결과값 반환 (즉, view 폴더 바로 하위 1레벨의 모든 JSP문서 출력 가능) : extends속성 이용
<!-- [*]은 반드시 하단에 작성 -->
<!-- name 속성값을 [*]로 설정한 경우 요청 처리 메소드에서 [문자값] 형식으로 반환되는
모든 뷰이름을 제공받아 definition 엘리먼트로 처리 가능 -->
<!-- extends 속성 : definition 엘리먼트의 식별자를 속성값으로 설정 -->
<!-- => definition 엘리먼트의 응답 JSP 문서(템플릿 페이지)와 포함 JSP 문서의 정보를 상속받아 사용 가능 -->
<!-- => [main] 상속받을게~ 가져다 쓸 수 있는 [header,content,footer] 3개 중 content 쓸건데, 오버라이드 할게~ -->
<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>
- 반환값으로 /* 식별자를 받으면 TilesView가 해당 jsp 문서를 조합해 결과값 반환 : extends속성 이용
<!-- name 속성값을 [*/*]로 설정한 경우 요청 처리 메소드에서 [문자값/문자값] 형식으로 반환되는
모든 뷰이름을 제공받아 definition 엘리먼트로 처리 가능 -->
<definition name="*/*" extends="main">
<!-- name 속성값의 [*] 기호가 여러개인 경우 {정수값}이 1부터 1씩 증가되어 문자값을 차례대로 표현 -->
<put-attribute name="content" value="/WEB-INF/views/{1}/{2}.jsp"/>
</definition>
- 반환값으로 /*/* 식별자를 받으면 TilesView가 해당 jsp 문서를 조합해 결과값 반환 : extends속성 이용
<definition name="*/*/*" extends="main">
<put-attribute name="content" value="/WEB-INF/views/{1}/{2}/{3}.jsp"/>
</definition>
</tiles-definitions>
[🖤View] 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>
layout > header.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<h1>머릿부</h1>
layout > content.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<h1>몸체부</h1>
layout > footer.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<h1>꼬릿부</h1>
[🖤View] 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>
layout > admin_header.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<h1>관리자 머릿부</h1>
layout > admin_main.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<h1>관리자 몸체부</h1>
tiles > view.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<h1>TilesView - 1 </h1>
tiles > sub > view.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<h1>TilesView - 2 </h1>
tiles > member.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<h1>회원관리 - 관리자</h1>
반응형
'framework > spring mvc' 카테고리의 다른 글
[springMVC] 13. resources 자원을 출력하는법 (0) | 2024.08.04 |
---|---|
[springMVC] 12. HttpSession객체 | @SessionAttributes (0) | 2024.08.04 |
[springMVC] 11. 포워드이동 VS 리다이렉트이동 (0) | 2024.08.04 |
[springMVC] 10. 사용자가 전달한 값을 요청처리 메소드가 받는법 (0) | 2024.08.04 |
[springMVC] 9. 요청방식을 지정해서 요청처리 메소드 만드는법 @GetMapping @PostMapping (0) | 2024.08.04 |