JSP Page의 Layout을 구성하는 방법에는 몇 가지가 있다.
대표적인 것이 include 지시어를 사용하여 중복되는 코드를 줄여주는 방법이다. 그러나 여전히 한계가 존재하며 이를 해결하기 위한
더 나은 접근법은 템플릿 중심 아키텍처를 적용하는 것이다. Tiles 는 이를 지원하는 templating system으로 웹 어플리케이션의
유저 인터페이스를 단순화 하기위해 만들어졌다. Struts 에는 Plug-in 형태로 내장되어 있다.
Struts 없이도 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 이 들어가면 '/'를 사용하지 않음에 유의한다.