본문 바로가기

Knowhow/Programming

[스크랩] Spring 웹 어플리케이션 만들기 (자) - Equinox 파악하기(4) - users.html 요청 처리(B) 조회(44)

[스크랩] Spring 웹 어플리케이션 만들기 (자) - Equinox 파악하기(4) - users.html 요청 처리(B)
조회(44)
프로그래밍 | 2006/02/02 (목) 11:16
추천 | 스크랩
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 기능을 구현하고자 할 때 쓰는 것이라고 하네요.
 
DisplayTag 라이브러리 API 문서: http://displaytag.sourceforge.net/apidocs/
 
필터 설정을 정리하면 messageFilter 가 요청 URL을 기억해서 공유하게 했구요. sitemesh라는 이름으로 설정한 com.opensymphony.module.sitemesh.filter.PageFilter와 exportFilter 라는 이름으로 설정한 org.displaytag.filter.ResponseOverrideFilter가 각각 SiteMesh를 이용한 페이지 구성 준비와 TableTag의 Export 기능을 준비하게 하는 것이었습니다.
 
 
원본 : Spring 웹 어플리케이션 만들기 (자) - Equinox 파악하기(4) - users.html 요청 처리(B)