얼마전 백기선님의 "스프링 MVC에서 타일즈 2 사용하기" 포스팅을 참조로 스트라이프에서 스프링 MVC + 타일즈로 갈아탔었다. 당시에는 급박해서 그냥 그대로 하긴 했었는데 다음과 같이 페이지마다 definition 을 설정하는 것은 영 성가신게 아니다.
<definition name="cm/meta/meta.create" extends="tiles/cm">
<put-attribute name="title" value="메타 속성 등록" />
<put-attribute name="menu" value="/tiles/menu.cm.jsp" />
<put-attribute name="description" value="메타 속성을 등록합니다." />
<put-attribute name="body" value="/cm/meta/meta.create.spring.jsp" />
</definition>
<definition name="cm/meta/meta.modify" extends="tiles/cm">
<put-attribute name="title" value="메타 속성 수정" />
<put-attribute name="menu" value="/tiles/menu.cm.jsp" />
<put-attribute name="description" value="메타 속성을 수정합니다." />
<put-attribute name="body" value="/cm/meta/meta.modify.spring.jsp" />
</definition>
<definition name="cm/meta/meta.delete" extends="tiles/cm">
<put-attribute name="title" value="메타 속성 삭제" />
<put-attribute name="menu" value="/tiles/menu.cm.jsp" />
<put-attribute name="description" value="메타 속성을 삭제합니다. 이미 컨텐츠 유형이나 분류체계 유형에서 사용하고 있다면 삭제할 수 없습니다. 정말 삭제하시겠습니까?" />
<put-attribute name="body" value="/cm/meta/meta.delete.spring.jsp" />
</definition>
1. 기본 스프링 & 타일즈 설정
그래서 이런 노가다를 없앨 수 있는 방법을 타일즈에서는 여러가지 방법으로 제공하고 있다.
이번에 적용할 방법은 EL 표현식과 와일드카드를 이용하는 방법이다.
이런 방법을 사용하기 위해서는 타일즈 팩토리를 만들어 낼 때, 몇가지 설정이 추가되어야하는데 다행히 스프링에서 엄청 간단한 방법을 제공하고 있다.
<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView"></property>
<property name="order" value="1" />
</bean>
<bean id="viewResolver2" class="org.springframework.web.servlet.view.BeanNameViewResolver" >
<property name="order" value="2"></property>
</bean>
<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/" />
<property name="suffix" value=".spring.jsp" />
<property name="order" value="3" />
</bean>
<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
<property name="completeAutoload"><value>true</value></property>
<property name="definitions">
<list>
<value>/WEB-INF/tiles2/tiles-*.xml</value>
</list>
</property>
</bean>
위 소스는 뷰리졸버로, 첫번째로 타일즈 뷰 그거없으면 빈네임으로, 그것도 없으면 jsp 렌더링으로 하라는 소스다. 요건 하든지 말든지 알아서 하시고 ㅎㅎ,
여튼, 중요한건 타일즈 속성의 completeAutoload 속성을 true 로 하면 여러가지 표현식을 사용할 수 있게 된다.
물론 이러한 기능을 사용하기 위해서는 tiles-core 가 아닌 tiles-extra 라이브러리가 필요하다.
메이븐 설정에 다음이 들어가 있어야한다.(물론 메이븐을 안 쓰면, 라이브러리만 구해다가 클래스 패스에 등록하면 된다)
<dependency>
<groupId>org.apache.tiles</groupId>
<artifactId>tiles-extras</artifactId>
<version>2.2.2</version>
</dependency>
자, 이제 필요한 설정은 전부 끝났다.
와일드카드와 EL 표현식을 적용한 샘플을 작성해보자.
우선 레이아웃 페이지를 작성한다.
/layout/admin-layout.xml
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %><%@
taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@
taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %><%@
taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"
%><!doctype html>
<html lang="ko">
<head>
<meta charset="utf-8">
<meta name="description" content="타일즈 어플리케이션">
<meta name="keywords" content="">
<title><tiles:insertAttribute name="title" /></title>
</head>
<body>
<div id="header">
<h1><tiles:insertAttribute name="title" /></h1>
<nav id="main-menu"><tiles:insertAttribute name="menu" /></nav>
</div>
<div id="page-content">
<tiles:insertAttribute name="body" />
</div>
</body>
주의 깊게 볼 부분은 레이아웃에 넘겨줄 속성 부분이다. 위 샘플은 title, menu, body 를 넣도록 하고 있다.
그다음은 타일즈에서 해당 레이아웃을 사용하고, 각 속성을 넣을 방법을 정의하는 타일즈 deifnition 설정 부분이다.
/WEB-INF/tiles2/tiles-layout.jsp
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN" "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
<tiles-definitions>
<!-- Default Layout -->
<definition name="default-layout" template="/layout/default-layout.jsp">
<put-attribute name="title" value="무제" />
<put-attribute name="menu" value="/layout/empty.jsp" />
<put-attribute name="body" value="/layout/empty.jsp" />
</definition>
<!-- Content -->
<definition name="tiles/admin/index" extends="default-layout">
<put-attribute name="title" value="관리자 페이지" />
<put-attribute name="menu" value="/layout/menu.admin.jsp" />
<put-attribute name="body" value="/admin/index.jsp" />
</definition>
</tiles-definitions>
일단은 definition 에서 수동으로 들어갈 값을 직접 입력해보았다. 이후에 el 표현식과 와일드 카드를 순차적으로 적용하는 것을 보여드릴테니, 조급해하지 마시길:)
그다음은 컨트롤러다.
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class AdminController {
@RequestMapping("/admin/index.do")
public ModelAndView adminIndex() {
ModelAndView mav = new ModelAndView("tiles/admin/index");
return mav;
}
}
위와 같이 작성하면 /admin/index.do 로 접근시에 다음과 같이 렌더링된다.
<!doctype html> | |
<html lang="ko"> | |
<head> | |
<meta charset="utf-8"> | |
<meta name="description" content="타일즈 어플리케이션"> | |
<meta name="keywords" content=""> | |
<title>관리자 페이지</title> | |
</head> | |
<body> | |
<div id="header"> | |
<h1>관리자 페이지</h1> | |
<nav id="main-menu"> | |
<ul> | |
<li>전광판 관리</li> | |
<li>사용자 관리</li> | |
</ul> | |
</nav> | |
</div> | |
<div id="page-content"> | |
<p>관리자 페이지입니다.</p> | |
</div> | |
</body> |
자, 이제 노가다를 없애보자.
2. EL 적용
우선 타이틀을 타일즈 설정 파일에서 박는게 아니라 컨트롤러에서 값을 유동적으로 변경 가능하도록 해보자.
컨트롤러를 다음과 같이 title attirbutue 를 추가한다.
@Controller
public class AdminController {
@RequestMapping("/admin/index.do")
public ModelAndView adminIndex() {
ModelAndView mav = new ModelAndView("tiles/admin/index");
mav.addObject("title", "관리자 페이지");
return mav;
}
}
그리고 타일즈 설정파일에 해당 값을 el 표현식으로 바꾼다. value 속성이 아닌 expression 속성을 사용한다는 것을 명심하자.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN" "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
<tiles-definitions>
<!-- Default Layout -->
<definition name="default-layout" template="/layout/default-layout.jsp">
<put-attribute name="title" value="무제" />
<put-attribute name="menu" value="/layout/empty.jsp" />
<put-attribute name="body" value="/layout/empty.jsp" />
</definition>
<!-- Content -->
<definition name="tiles/admin/index" extends="default-layout">
<put-attribute name="title" expression="${title}" />
<put-attribute name="menu" value="/layout/menu.admin.jsp" />
<put-attribute name="body" value="/admin/index.jsp" />
</definition>
</tiles-definitions>
끝이다.
만약, template 속성에도 el 을 적용하고 싶을 경우에는 template 속성 대신, templateExpression 속성을
3. 와일드 카드 적용
이번엔 와일드 카드를 이용해서, body 영역과 메뉴도 동적으로 변경해보자. (이부분도 el 표현식을 이용해도 상관은 없다. 이 글에선 샘플 작성을 위해 일부러 와일드 카드를 이용한다.)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN" "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
<tiles-definitions>
<!-- Default Layout -->
<definition name="default-layout" template="/layout/default-layout.jsp" templateExpression="">
<put-attribute name="title" value="무제" />
<put-attribute name="menu" value="/layout/empty.jsp" />
<put-attribute name="body" value="/layout/empty.jsp" />
</definition>
<!-- Content -->
<definition name="WILDCARD:tiles/*/**" extends="default-layout">
<put-attribute name="title" expression="${title}" />
<put-attribute name="menu" value="/layout/menu.{1}.jsp" />
<put-attribute name="body" value="/{1}/{2}.jsp" />
</definition>
</tiles-definitions>
우선 와일드 카드를 사용하는 부분에 대해선 "WIDCARD:" 라고 prefix 코드를 넣어줘야한다.
그러며 * 패턴에 대해 매칭되는 갑사을 순차적으로 {1}, {2} 등으로 사용할 수 있게 한다.
위 설정대로라면 "/tiles/admin/index" 라는 뷰네임은 다음과 같이 매핑된다.
- {1} : admin
- {2} : index
- {1} : admin
- {2} : user/manage
이 문서는 스프링 3.0.7, tiles 2.2.2 로 작성되었다.
참조링크
- http://whiteship.me/?p=11657
- http://tiles.apache.org/2.2/framework/tutorial/advanced/wildcard.html
- http://tiles.apache.org/2.2/framework/tutorial/advanced/el-support.html
- http://kaludin.egloos.com/2799009