Tiles

JSP Page의 Layout을 구성하는 방법에는 몇 가지가 있다. 대표적인 것이 include 지시어를 사용하여 중복되는 코드를 줄여주는 방법이다. 그러나 여전히 한계가 존재하며 이를 해결하기 위한 더 나은 접근법은 템플릿 중심 아키텍처를 적용하는 것이다. Tiles 는 이를 지원하는 templating system으로 웹 어플리케이션의 유저 인터페이스를 단순화 하기위해 만들어졌다. Struts 에는 Plug-in 형태로 내장되어 있다. Struts 없이도 Tiles를 독립적으로 적용할 수 있으며 이는 Apache Tiles 프로젝트 (http://tiles.apache.org/)에서 확인할 수 있다.
Struts Tiles

Page Layout 구성 방법

구성 방법

  • JSP based approach : 페이지에 삽입할 기능이 많아질수록 복잡해짐. 소규모 어플리케이션에만 적합
  • include 지시어 사용 : 중복되는 코딩 부분의 재사용. 여전히 페이지에서 컨텐츠와 레이아웃이 혼재됨.
  • Template based approach : 페이지의 물리적인 영역을 은닉화하는 방법 제공. 컨텐츠와 레이아웃의 분리

위 그림은 Tiles를 적용하여 페이지 레이아웃을 구성한 예이다.

Tiles 설치

  • struts-tiles.jar을 WEB-INF/lib 디렉토리에 복사한다.
  • web.xml파일의 Action Servlet 정의 부분에 다음과 같이 추가한다.
<init-param>
	<param-name>chainConfig</param-name>
	<param-value>org/apache/struts/tiles/chain-config.xml</param-value>
</init-param>
		
  • struts-config.xml의 plug-in에 TilesPlugin을 다음과 같이 등록한다.
<plug-in className="org.apache.struts.tiles.TilesPlugin">
	<set-property
	    property="definitions-config"
	       value="/WEB-INF/tiles-defs.xml"/>
</plug-in>
  • Tiles를 사용하는 JSP에 다음과 같은 코드를 추가 한다.
 <%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %>

Tiles 사용

Tiles 적용 시 고려점

  • Tiles 단독으로도 사용이 가능하다.
  • Tiles plug-in은 Tiles definitions를 사용할 때만 필요하다. (plug-in 설정 없이도 Tiles 라이브러리를 사용할 수 있음)
  • Tiles definition은 JSP로 정의할 수도 있으나 일반적으로 layout과 Tiles definition (xml) 을 별도로 지정한다.
  • Tiles는 기본적 Template 으로 많은 Layout을 제공하지만 개발에 들어가기 전에 Layout 에 대한 충분한 준비가 필요하다.

Tiles Tag Library의 속성

다음은 Tiles Tag Library의 태그들의 목록과 간단한 설명이다.
Attribute Description
add element를 추가
definition titles component 정의
get <template:put>을 통해 JSP로 전달된 자원을 얻는다.
getAsString Tile/Component/Template 속성값을 JspWriter에 출력
importAttribute 정의된 context안에 타일의 속성을 추가한다.
initComponentDefinitions 정의 팩토리(definitions factory)를 초기화한다.
Insert JSP 페이지 내에서 동적 템플릿을 추가
put <template:insert>태그 내에서 템플릿에 삽입할 자원을 지정
putList 속성으로 전달할 리스트를 선언
useAttribute JSP 페이지에서 속성 값을 사용한다.

보통 모든 페이지에서 적용되는 헤더나 저작 관련 내용들을 한곳에 모아 미리 Layout를 정의해둔다. 이를 Definition 이라 하는데 JSP 나 XML 로 만들 수 있으며 예는 다음과 같다.

Tiles Layout 정의

JSP 로 레이아웃을 정의한 예

다음은 storefront-defs.jsp 라는 jsp 에 tile definition을 정의한 예이다.
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %>

<tiles:definition id="storefront.default" 
	pgae="/layouts/storefrontdefaultLayout.jsp" scope="request">
	<tiles:put name="header" value="/common/header.jsp"/>
	<tiles:put name="menubar" value="/common/menubar.jsp"/>
	<tiles:put name="copyright" value="/common/copyright.jsp"/>
</tiles:definition>
definition들을 이용하려면, 타일 컴포넌트들이 definition 에 접근할 수 있어야 한다. 다음은 definition을 사용하는 JSP 의 예이다. include 를 사용하여 storefront-defs.jsp 를 참조하고 있다.
<%@ taglib uri="http://struts.apache.org/tags-tiles" prefix="tiles" %>
<%@ include file="../common/storefront-defs.jsp" %>

<tiles:insert beanName="storefront.default" beanScope="request">
	<tiles:put name="body-content" value="../security/sigin-body.jsp"/>
</tiles:insert>

XML 로 레이아웃을 정의한 예

위에서는 tile definition 을 jsp 에 설정한 예를 보였지만, xml 로 정의하고 struts-config.xml 에 plug-in으로 정의해 놓고 쓰는 것이 일반적이다.
다음은 tiles-defs.xml의 일부분이다. index 라는 definition을 기본으로 하여 extends 해서 사용함으로 반복된 코딩을 줄여준다.
<!-- Doc index page description  -->
<definition name="index" path="/layout.jsp">
	<put name="title"  value="Anyframe Sample" />
	<put name="header" value="/header.jsp" />
	<put name="menu"   value="/menu.jsp" />
	<put name="body"   value="/body.jsp" />
	<put name="footer" value="/bottom.jsp" /> 
</definition>

<!-- view order information page description  -->  
<definition name="list" extends="index">
	<put name="body"   value="/user/listUser.jsp" />
</definition>
Tiles를 사용하는 경우 action-mapping 에서는 forward path를 Tiles definition에 정의된 definition name으로 주어야 한다.
 <action
            name="userForm"
            path="/empListUser"
            type="com.sds.emp.view.action.user.GetUserListAction"
            scope="request"
            validate="false"
            roles="admin,user">
            <forward name="success" path="list"  />
</action>
forward 의 path 부분에 tiles 의 Definition name 이 들어가면 '/'를 사용하지 않음에 유의한다.

Resources