Spring tile3 동적 메뉴구성 dynamic menu viewpreparer 사용

북마크 추가

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를 이용하면 정상적으로 출력되는것을 확인 할 수 있다.

 

 

 

 

 

 

HKH
2015-09-25 22:23
SHARE
keyboard_arrow_left
keyboard_arrow_up