header나 left 메뉴를 고정된 메뉴가 아닌 동적으로 구성하고 싶을때
tiles의 preparer를 사용하면 jsp페이지를 호출하기 전에 실행 되므로 편리하다.
적용방법
1.servlet context 설정
<bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
<property name="definitions">
<list>
<value>/WEB-INF/tiles/tiles-layout.xml</value>
</list>
</property>
<property name="preparerFactoryClass" value="org.springframework.web.servlet.view.tiles3.SimpleSpringPreparerFactory"></property>
</bean>
->preparerFactoryClass property를 추가한다.
2.tiles definition 설정
<definition name="defaultTemplate" templateExpression="/WEB-INF/template/default/defaultTemplate.jsp" preparer="com.trandent.util.MenuPreparer" >
<put-attribute name="header" value="/WEB-INF/template/default/header.jsp" />
<put-attribute name="left" value="/WEB-INF/template/default/left.jsp" />
<put-attribute name="body" value="/WEB-INF/template/default/body.jsp" />
<put-attribute name="footer" value="/WEB-INF/template/default/footer.jsp" />
</definition>
-> preparer: viewpreparer를 상속받을 클래스 경로및 파일명. 여기서 설정한 위치에 클래스를 만든다.
3.MenuPreparer.class
package com.trandent.util;
import java.util.ArrayList;
import org.apache.tiles.Attribute;
import org.apache.tiles.request.Request;
import org.apache.tiles.preparer.PreparerException;
import org.apache.tiles.preparer.ViewPreparer;
import org.apache.tiles.request.Request;
public class MenuPreparer implements ViewPreparer {
@Override
public void execute(Request context, AttributeContext attributeContext) throws PreparerException {
ArrayList<MenuPreparer.MenuItem> menu = new ArrayList<MenuPreparer.MenuItem>();
menu.add(new MenuItem("Home", "Home.jsp"));
menu.add(new MenuItem("About", "about.jsp"));
attributeContext.putAttribute("leftMenu", new Attribute(menu),true);
}
public static class MenuItem {
private String url;
private String caption;
public MenuItem(String caption, String url) {
this.caption = caption;
this.url = url;
}
public String getUrl() {
return url;
}
public String getCaption(){
return caption;
}
}
}
-> viewpreparer를 상속받아 execute를 override한다.
예제로는 메뉴를 list에 하드코딩으로 담았지만 db에서 가져올수있다.
불러온 메뉴 리스트를 attributeContext에 넣는다 이때 마지막 parameter로 true를 꼭 넣어주도록 한다.
안넣을경우 jsp페이지에서 불러올때 error importing attributes attribute ' ' is null error가 발생하는 경우가 있다.
4.jsp페이지
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles"%>
<tiles:importAttribute name="leftMenu"/>
.
.
.
<ul>
<c:forEach var="i" items="${leftMenu }">
<li><a href="${i.url}">${i.caption }</a></li>
</c:forEach>
</ul>
.
.
.
-> class에서putAttribute한 이름과 jsp에서 importAttribute의 name을 똑같이 설정한다.
jstl를 이용하면 정상적으로 출력되는것을 확인 할 수 있다.