Sitemesh의 PageFilter 클래스의 소스 코드를 볼까요?
doFilter 메소드 위주로 보도록 하죠.
public void doFilter(ServletRequest rq, ServletResponse rs, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) rq;
if (rq.getAttribute(FILTER_APPLIED) != null || factory.isPathExcluded(extractRequestPath(request))) { // (1)
// ensure that filter is only applied once per request
chain.doFilter(rq, rs);
}
else {
request.setAttribute(FILTER_APPLIED, Boolean.TRUE);
// force creation of the session now because Tomcat 4 had problems with
// creating sessions after the response had been committed
if (Container.get() == Container.TOMCAT) { // (2)
request.getSession(true);
}
HttpServletResponse response = (HttpServletResponse) rs;
// parse data into Page object (or continue as normal if Page not parseable)
Page page = parsePage(request, response, chain);
if (page != null) {
page.setRequest(request);
Decorator decorator = factory.getDecoratorMapper().getDecorator(request, page);
if (decorator != null && decorator.getPage() != null) {
applyDecorator(page, decorator, request, response);
page = null;
return;
}
// if we got here, an exception occured or the decorator was null,
// what we don't want is an exception printed to the user, so
// we write the original page
writeOriginal(request, response, page);
page = null;
}
}
}
FILTER_APPLIED 라는 상수는 RequestConstants 인터페이스에 정의된 것이고, PageFilter 는 이를 구현학 있습니다. (1) 구문은 결국 이 필터가 한번만 수행되도록 하는 부분인 것 같네요.
Container는 서블릿 컨테이너를 표현하기 위한 클래스인데, 여기 설정된 상수들이 SiteMesh가 지원하는 것들이라고 생각됩니다. 주요 컨테이너는 모두 지원하네요.
public static final int TOMCAT = 1;
public static final int RESIN = 2;
public static final int ORION = 3; // Orion or OC4J
public static final int WEBLOGIC = 4;
public static final int HPAS = 5;
public static final int JRUN = 6;
public static final int WEBSPHERE = 7;
(2) 구문에서는 톰캣에서 수행되는 경우만 새로운 세션을 생성합니다.
하늘색으로 칠한 부분이 SiteMesh가 Decorator 패턴을 활용하여 페이지를 구성하는 것으로 보입니다. 자세한 처리 결과까지 살펴보는 것은 뒤로 미뤄야 할 것 같습니다. Spring을 이해하는 것인데 SiteMesh를 따라 가다가 길을 잃을 우려가 있을 듯 해서..ㅡㅡ;
PageFilter 에서는 SiteMesh를 이용하여 페이지를 구성한다 정도로 정리해두죠.
마지막으로 exportFilter 가 남았네요. 보아하니 이 녀석도 DisplayTag라는 라이브러리(3-rd party library)를 이용하는 것이군요. 이번엔 API 정도만 살펴보죠.
<filter>
<filter-name>exportFilter</filter-name>
<filter-class>org.displaytag.filter.ResponseOverrideFilter</filter-class>
</filter>
이는 DisplayTag 라이브러리의 TableTag를 사용하면서 Export 기능을 구현하고자 할 때 쓰는 것이라고 하네요.
필터 설정을 정리하면 messageFilter 가 요청 URL을 기억해서 공유하게 했구요. sitemesh라는 이름으로 설정한 com.opensymphony.module.sitemesh.filter.PageFilter와 exportFilter 라는 이름으로 설정한 org.displaytag.filter.ResponseOverrideFilter가 각각 SiteMesh를 이용한 페이지 구성 준비와 TableTag의 Export 기능을 준비하게 하는 것이었습니다.
|