SiteMesh는 오픈 소스이고 페이지 레이아웃 프레임워크이다.
이와 비슷한 프레임워크는 Tiles, Velocity 등이 있는데 SiteMesh는 처음 써봐서 샘플 코드를 만들어 봤다.
전체 소스 코드 : https://github.com/namkyu/sitemesh_test
sitemesh를 위한 설정은 어렵지 않다.
1. pom.xml에 라이브러리 추가
2. web.xml에 com.opensymphony.sitemesh.webapp.SiteMeshFilter 필터 추가
3. WEB-INF/decorators.xml 파일 생성 후 설정 추가 (페이지 레이아웃 설정 및 URL 패턴 정의)
<?xml version=”1.0″ encoding=”UTF-8″?>
<decorators defaultdir="/decorators"><decorator name="basic-theme" page="basic-theme.jsp"><pattern>/jsp/*</pattern></decorator></decorators>
4. 페이지 레이아웃 구성
<?xml version="1.0" encoding="UTF-8" ?><%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="dec"%><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><title><dec:title /></title></head><body bgcolor="<dec:getProperty property="body.bgcolor" />"><h1>Header</h1><p><b>Navigation</b></p><hr /><dec:body /><hr /><h1>Footer</b></h1></body>
</html>
설정을 마치고 sitemesh의 작동 원리만 알면 쉽게 웹 애플리케이션에 적용이 가능하다.
브라우저에서 http://localhost:8080/jsp/menu.jsp를 웹 애플리케이션 서버에 요청을 보내게 되면 SiteMeshFilter가 해당 요청을 받은 후 전처리 시에는 별다른 동작을 하지 않고, org.apache.jasper.servlet.JspServlet 에게 위임한다. (JspServlet은 톰켓의 web.xml에 정의되어 있음)
JspServlet은 menu.jsp 파일에 대한 동적 파일 처리 완료 후 결과물로 html을 생성하게 되고, SiteMeshFilter 에서 이를 받아 menu.jsp의 결과물인 html의 body부분을 추출 후 페이지 레이아웃의 <dec:body /> 부분에 삽입한다.
서블릿 필터는 기본적으로 다음과 같이 처리
request -> filter -> filter -> servlet
response <- filter <- filter <- servlet
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
// 여기서 전처리
chain.doFilter(req, res);
// 여기서 후처리
}