웹 어플리케이션을 구성하고 있는 웹 페이지들은 대부분은 페이지 레이아웃이 동일하게 구성되어 있다. 따라서 동일한 레이아웃을 여러 페이지에 적용하게 된다. 이를 쉽게 할 수 있게 해주는 것이 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를 포함할 때 사용된다.
*클라이언트의 요청이 sitemesh filter에 진입하면 decorators.xml에서 해당 요청 패턴을 찾는데 만약 decorators.xml에 패턴을 정의하지 않으면 요청을 빨리 처리하지 못하고 느려지므로 필터를 타는 요청을 꼭 패턴에 정의하자. - <decorator>, <excludes>
*/main.do 패턴의 view 페이지는 이제 sitemesh에 의해 default.jsp에 들어가게 된다.
원래 페이지의 속성을 가져온다. 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);
...