>

TIL

decorators.xml 파일

ekdud 2025. 1. 17. 14:57

 

decorators.xml

웹 어플리케이션을 구성하고 있는 웹 페이지들은 대부분은 페이지 레이아웃이 동일하게 구성되어 있다. 따라서 동일한 레이아웃을 여러 페이지에 적용하게 된다. 이를 쉽게 할 수 있게 해주는 것이 tiles, velocity, siteMesh 등의 기술이다.

Apache Tiles(프레임워크) - <jsp.include>, <%include%>와 비슷한 역할. 하지만 tiles의 성능이 더 우수.

Apache Velocity(템플릿 엔진) - Java 코드에 정의된 객체를 참조하는 템플릿 언어를 제공함. 웹 애플리케이션에서 프레젠테이션 계층과 비즈니스 계층 MVC 패턴에 맞게 분리하는 것을 목표로 함.

 

Tiles나 Velocity 방식이 전체 페이지 중 내용 부분에 해당하는 코드만을 생성하는 방식이라면, SiteMesh는 완전한 HTML 페이지를 생성한 뒤 Decorator라는 패턴을 사용하여 데코레이터 HTML 페이지에 레이아웃을 입히는 방식이다.

 

 

Sitemesh

Sitemesh프레임워크는 Decorator Tag, Page Tag 2개의 tag 라이브러리를 제공한다. Decorator Tag는 decorator page를 생성할 때 사용되는 tag이고, Page Tag는 decorator 페이지 내에서 다른 decorator를 포함할 때 사용된다.

 

일단 이번에는 decorator를 공부해보자.

 

∘ sitemesh 설정  

참고 -  https://github.com/sitemesh/sitemesh2?tab=readme-ov-file

spring maven의 라이브러리를 의존성 설정을 해준다.
(maven을 사용하기 때문에 pom.xml에 작성해주었지만 Gradle의 경우에는 build.gradle에 작성한다.)
이때, 그룹 아이디는 opensymphony, 아티팩트 아이디는 sitemesh.

pom.xml 예시
...

<!-- sitemesh -->
<dependency>
    <groupId>opensymphony</groupId>
    <artifactId>sitemesh</artifactId>
    <version>2.4.2</version>
</dependency>
<!-- sitemesh 끝 -->

...

 



이제 sitemesh.xml과 decorator.xml을 생성한다.

sitemesh.xml
기본적인 sitemesh의 설정 및 사용할 decorators.xml 파일을 호출하는 역할
<?xml version="1.0" encoding="UTF-8"?>
<sitemesh>
	<!--decorator 결정-->
	<property name="decorators-file" value="/WEB-INF/decorators.xml" /> 
	<!-- 데코레이터 파일을 불러온다.  -->
	<excludes file="${decorators-file}" />

	<!--parse 설정. 해당 페이지의 content-type이 뭐라고 쓰여있는지에 따라 데코레이터 결정 -->  
	<page-parsers>
		<parser content-type="text/html" class="com.opensymphony.module.sitemesh.parser.HTMLPageParser" />
		<parser content-type="text/html;charset=UTF-8" class="com.opensymphony.module.sitemesh.parser.HTMLPageParser" />
	</page-parsers>
    
	<decorator-mappers>
        <mapper class="kr.co.경로.framework.sitemesh.UriDecoratorMapper"> <!-- 커스텀 데코레이터매퍼 -->
    	</mapper>
		<mapper class="com.opensymphony.module.sitemesh.mapper.PrintableDecoratorMapper">
			<param name="decorator" value="printable" />
			<param name="parameter.name" value="printable" />
			<param name="parameter.value" value="true" />
		</mapper>
		<mapper class="com.opensymphony.module.sitemesh.mapper.PageDecoratorMapper" >
			<param name="property" value="meta.decorator" />
		</mapper>
		<!-- mapper결정 : 설정파일 사용하여 decorator정하기-->  
		<mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
			<param name="config" value="${decorators-file}" />
		</mapper>
	</decorator-mappers>
</sitemesh>

 




decorators.xml 파일은 스프링(Spring) 프레임워크에서 웹 페이지 레이아웃 처리를 위해 사용되는 XML 파일이다. 

프로젝트 내에 decorators.xml 파일을 생성하여 사용한다. (일반적으로 WEB-INF 디렉토리 내에 위치.)









decorators.xml 예시

<?xml version="1.0" encoding="UTF-8"?>

<decorators defaultdir="/WEB-INF/jsp/decorator">
	<decorator name="defaultPage" page="default.jsp">
		<pattern>*/main.do</pattern>
	</decorator>
	
	<excludes>
		<pattern>/remote_auth.do*</pattern>
	</excludes>
	
	<decorator-mappers>
		<mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
		</mapper>
	</decorator-mappers>
</decorators>

excludes element 내에는 sitemesh를 사용하지 않을 url패턴을 넣는다.
decorator element 내에는 실제 적용 될 jsp 레이아웃과 템플릿을 포함시킨다.


decorator엘리먼트는 스프링 컨트롤러를 타고 리턴된 페이지(view)가 생성되고
/WEB-INF/jsp/decorator/default.jsp에 붙여넣게 된다.

 



 web.xml에 사이트메쉬 필터를 정의해준다.

<jsp-config>
    <taglib>
        <taglib-uri>/tags/sitemesh-decorator</taglib-uri>
        <taglib-location>/WEB-INF/tlds/sitemesh-decorator.tld</taglib-location>
    </taglib>
    <taglib>
        <taglib-uri>/tags/sitemesh-page</taglib-uri>
        <taglib-location>/WEB-INF/tlds/sitemesh-page.tld</taglib-location>
    </taglib>
</jsp-config>

<filter>
    <filter-name>sitemesh</filter-name>
    <filter-class>com.opensymphony.sitemesh.webapp.SiteMeshFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>sitemesh</filter-name>
    <url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
    <filter-name>sitemesh</filter-name>
    <url-pattern>*.do</url-pattern>
</filter-mapping>


*클라이언트의 요청이 sitemesh filter에 진입하면 decorators.xml에서 해당 요청 패턴을 찾는데
만약 decorators.xml에 패턴을 정의하지 않으면 요청을 빨리 처리하지 못하고 느려지므로 필터를 타는 요청을 꼭 패턴에 정의하자. - <decorator>, <excludes>


*/main.do 패턴의 view 페이지는 이제 sitemesh에 의해 default.jsp에 들어가게 된다.

이제 데코레이터 페이지인 default.jsp를 작성해주면 된다.

<%@ taglib uri="/tags/sitemesh-decorator" prefix="decorator"%>

 

<decorator:head />
view페이지의 head태그 구문을 가져온다.
<decorator:body />
view페이지의 body태그 안의 구문을 가져온다.
<decorator:title default=" " /> view페이지의 title태그 구문을 가져온다.(title을 찾을 수 없다면 value값을 default로 지정할 수 있다.
<decorator:getProperty property=" " default=" " writeEntireProperty=" " /> 원래 페이지의 속성을 가져온다. 
property: 추가할 속성의 이름.
default: 속성을 발견하지 못했을 때 default로 지정될 값.
writeEntireProperty: 1, yes, true, t, y로 지정했을 때, 이름을 포함한 속성값이 그대로 쓰여진다.
<decorator:usePage id=" " />
decorator 페이지에서 사용할 page object id를 지정한다.

 

 

DecoratorMapper에는 다양한 종류가 있고 그 외에도 커스텀하여 사용할 수 있는데,

예를 들어 UriDecoratorMapper라는 DecoratorMapper를 만들어 사용하고자 한다면

UriDecoratorMapper.java파일을 sitemesh파일 내에 만들고 아래 예시 코드처럼 다른 Mapper를 extend 해서 사용하거나 하면 된다.

...
import java.util.Properties;

...
import com.opensymphony.module.sitemesh.Config;
import com.opensymphony.module.sitemesh.Decorator;
import com.opensymphony.module.sitemesh.DecoratorMapper;
import com.opensymphony.module.sitemesh.Page;
import com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper;
import com.opensymphony.module.sitemesh.mapper.ConfigLoader;

public class UriDecoratorMapper extends ConfigDecoratorMapper {
	private static final Logger LOGGER = LoggerFactory.getLogger(UriDecoratorMapper.class);
	
	...

 

 

 

참고 [spring에서 sitemesh설정]

참고 [sitemesh 매뉴얼 번역본]