sitemesh 설정

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);

    // 여기서 후처리

}