페이지 공통 분모 집중화
웹페이지에서 똑같이 사용되는 코드를 모듈화해 한쪽에서 href 주소를 변경하면
모든 페이지 소스 코드를 돌아가면서 변경해야 되는 수고로움을 없앰
Tiles
모듈화 시킨 페이지를 합쳐주는 라이브러리
(2017년 서비스 끝남. 프론트엔드에서 하는 작업이라 프론트 기술이 발전하면서 사망함)
(대규모 사이트에서는 아직 혼합해서 사용하고 있기도 하다고 한다)
dispatcher가 기존의 조각낸 페이지 경로를 뱉어내는 것보다 우선시 되야 하므로
1.tiles 라이브러리 명령을 우선적으로 수행하게 하는 코드와
2.요청된 페이지에 합쳐질 모듈 조각들의 종류에 대한 지시
3.어디에 어떻게 붙일지에 대한 위치 지정을 위한 지시가 필요하다.
기존의 jsp를 공통 분모에 따라 나눈다
header, footer, layout (index에서도 공용으로 쓰일 경우)
aside, visual, layout (게시판 같은 곳에서 공용으로 쓰일 경우. 따로 폴더 만들어서 넣음)
list, detail (유일하게 바뀌는 main 영역, 얘도 구분지은 폴더에 따로만들어서 넣는게 좋음)
layout 외에는 head 부분조차 필요없음 그냥 조각냄
layout은 합치는 과정을 위한 head만 있는 껍데기
먼저 controller에서 viewResolver 보다 tiles 사용이 우선되어 반환되어야 하기 때문에
new ModelAndView("root/index");
new ModelAndView("root.index");
view 경로를 지정해주는 부분을 변경해준다
https://tiles.apache.org/framework/tutorial/basic/pages
Tiles 사용 튜토리얼 페이지
But for now, let's stick to the default and create the /WEB-INF/tiles.xml file, with a definition as described in concepts:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!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 name="myapp.homepage" template="/layouts/classic.jsp">
<put-attribute name="title" value="Tiles tutorial homepage" />
<put-attribute name="header" value="/tiles/banner.jsp" />
<put-attribute name="menu" value="/tiles/common_menu.jsp" />
<put-attribute name="body" value="/tiles/home_body.jsp" />
<put-attribute name="footer" value="/tiles/credits.jsp" />
</definition>
</tiles-definitions>
/WEB-INF/tiles.xml
file을 저기에 저런 이름으로 만들란다
[tiles.xml]
<definition name="root.index" template="/layouts/layout.jsp">
name에 controller에서 반환하는 이름, template에 layout 경로
<put-attribute name="title" value="Tiles tutorial homepage" />
name에 조립할때 쓸 이름, value에 조립 파일 경로
참고해 조립 설계도를 만든다
조립을 하려면 jsp에서 사용할 태그lib가 필요하다
먼저 tiles를 설치해야함
[pom.xml]
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-jsp</artifactId>
<version>3.0.8</version>
</dependency>
설치가 완료되면 jsp에서 조립한다
[layout.jsp]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
<%@ 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><tiles:getAsString name="title" /></title>
<link href="/css/customer/layout.css" type="text/css" rel="stylesheet" />
</head>
<body>
<!-- header 부분 -->
<tiles:insertAttribute name="header" />
<!-- --------------------------- <visual> --------------------------------------- -->
<!-- visual 부분 -->
<tiles:insertAttribute name="visual" />
<!-- --------------------------- <body> --------------------------------------- -->
<div id="body">
<div class="content-container clearfix">
<!-- --------------------------- aside --------------------------------------- -->
<!-- aside 부분 -->
<tiles:insertAttribute name="aside" />
<!-- --------------------------- main --------------------------------------- -->
<tiles:insertAttribute name="body" />
</div>
</div>
<!-- ------------------- <footer> --------------------------------------- -->
<tiles:insertAttribute name="footer" />
</body>
</html>
|
cs |
<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles" %>
tiles tag lib 삽입
<tiles:insertAttribute name="aside" />
tiles.xml에 지정한 이름
<tiles:getAsString name="title" />
단순한 문자열 삽입도 가능하다
ViewResolver가 Tiles를 인식하고 맵핑 & 우선순위를 정할 수 있도록 설정
[dispatcher-servlet.xml]
<bean
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.tiles3.TilesView" />
<property name="order" value="1" />
</bean>
<bean
class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
<property name="definitions" value="/WEB-INF/tiles.xml" />
</bean>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/view/"></property>
<property name="suffix" value=".jsp"></property>
<property name="order" value="2" />
</bean>
굵게 칠해진 곳이 추가되는 부분
order로 우선 순위를 정해주고 있다
View 조립이 잘되는지 실행해본다
안 될 경우 왜 안되는지 보통 오류창에 나옴
필요한 lib이 없거나, 코드가 틀렸거나, maven update를 안했거나 등.
server 실행환경이 바뀐 설정을 적용하지 못했을 수도 있으니 서버를 지웠다가 다시 구성해보는 방법도 있다
Tiles Wildcard (pattern) 사용법
[tiles.xml]
<tiles-definitions>
<definition name="root.*" template="/WEB-INF/view/inc/layout.jsp">
<put-attribute name="title" value="공지사항" />
<put-attribute name="header" value="/WEB-INF/view/inc/header.jsp" />
<put-attribute name="body" value="/WEB-INF/view/{1}.jsp" />
</definition>
</tiles-definitions>
definition name="root.*"
*을 붙일 경우 root.뒤로 어떤 컨트롤러 리턴값이 와도 해당 definition의 조립 명세를 따른다
value="/WEB-INF/view/{1}.jsp"
{1}을 붙일 경우 root.뒤로 온 값을 해당 영역에 삽입한다
root.index가 왔다면 view/index.jsp가 된다
{2}를 붙이면 root.*.* 의 2번째 값이 들어가게 된다
Wildcard 참고 : https://tiles.apache.org/framework/tutorial/advanced/wildcard.html
'Development > Java' 카테고리의 다른 글
Spring XML 파일 설정 나누기 #7 (0) | 2022.08.29 |
---|---|
데이터 서비스 클레스 분리, DB 연결 정보 분리 #6 (0) | 2022.08.29 |
Spring MVC에서 정적 파일 서비스하기 #4 (0) | 2022.08.26 |
Spring MVC, 웹 개발환경 설정 #3 (0) | 2022.08.26 |
DI, AOP #2 (0) | 2022.08.25 |