Tiles definition 렌더링 전 처리 방법 (ViewPreparer 사용)

현재 진행하고 있는 프로젝트에서 Tiles를 사용하고 있는데 다음과 같이 defaultLayout의 left를 동적으로 바꿀 수 있는 방법에 대해서 얘기가 나왔다.

<definition name="defaultLayout" template="/WEB-INF/view/common/layout/default/layout.jsp">

<put-attribute name="header" value="/WEB-INF/view/common/layout/default/header.jsp" />

<put-attribute name="left" value="/WEB-INF/view/common/layout/default/left.jsp" />

<put-attribute name="body" value="/WEB-INF/view/common/layout/default/blank.jsp" />

<put-attribute name="footer" value="/WEB-INF/view/common/layout/default/footer.jsp" />

</definition>


흔히 tiles를 이용할 때 사용하는 방법은 다음과 같이 새로운 definition을 정의한 후 body와 left를 put하는 방법을 이용한다.

<definition name="main" extends="defaultLayout">

<put-attribute name="body" value="/WEB-INF/view/main/main.jsp" />

<put-attribute name="left" value="/WEB-INF/view/main/leftMain.jsp" />

</definition>


하지만 특정 요구 사항으로 인하여 xml 설정이 아닌 코드를 이용하여 left 영역을 동적으로 바꿀 수 있는 방법을 찾아야 했다.


찾아보니 ViewPreparer 인터페이스가 있었고, 해당 인터페이스를 구현하면 tiles definition을 렌더링하기 전에 execute 메소드가 실행된다.


해당 메소드 안에서 다음의 코드와 같이 putAttribute 메소드를 이용하여 layoutId 변수 값에 따른 left 영역을 동적으로 변경할 수가 있다.

attributeContext.putAttribute("left", new Attribute("/WEB-INF/view/" + layoutId + "/test.jsp")) 


전처리 작업을 하기 위해서는 tiles XML 설정 파일의 definition element에 preparer="ViewPreparer 인터페이스를 구현한 class경로" 를 정의하면 됨.


https://tiles.apache.org/framework/tutorial/advanced/preparer.html