본문 바로가기

Knowhow/Programming

[스크랩] Spring 웹 어플리케이션 만들기 (아) - Equinox 파악하기(3) - users.html 요청 처리(A) 조회(41)

[스크랩] Spring 웹 어플리케이션 만들기 (아) - Equinox 파악하기(3) - users.html 요청 처리(A)
조회(41)
프로그래밍 | 2006/02/02 (목) 11:15
추천 | 스크랩
View Demonstration  버튼을 눌러서 users.html 요청을 발생시키면 어떻게 될까요?
 
먼저 필터 매핑 정의에 따라서 필터(Servlet Filters)를 거쳐야겠네요.
 
    <filter-mapping>
        <filter-name>messageFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>
    <filter-mapping>
        <filter-name>sitemesh</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>FORWARD</dispatcher>
    </filter-mapping>
    <filter-mapping>
        <filter-name>exportFilter</filter-name>
        <url-pattern>*.html</url-pattern>
    </filter-mapping>
 
messageFilter와 sitemesh 는 모든 URL(/*)이 거쳐야 하고, users.html 요청이니까 exportFilter 도 거쳐야 하는군요.
 
역시 같은 web.xml 파일에 정의된 필터 선언을 하나씩 볼까요?
 
    <filter>
        <filter-name>messageFilter</filter-name>
        <filter-class>org.appfuse.web.MessageFilter</filter-class>
    </filter>
 
메세지필터는 뭐하는 녀석일까요?
 
주요 메소드인 doFilter() 만 살펴보죠.
 
    public void doFilter(ServletRequest req, ServletResponse res,
                         FilterChain chain)
    throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        // grab messages from the session and put them into request
        // this is so they're not lost in a redirect
        Object message = request.getSession().getAttribute("message"); // (1)
        if (message != null) { // (2)
            request.setAttribute("message", message);  // (2)
            request.getSession().removeAttribute("message"); // (2)
        }
        // set the requestURL as a request attribute for templates
        // particularly freemarker, which doesn't allow request.getRequestURL()
        request.setAttribute("requestURL", request.getRequestURL());
        chain.doFilter(req, res);
    }
 
(1) 먼저 요청을 보낸 세션을 읽어서 message라는 이름의 속성을 얻어옵니다. 처음에는 없으니까 null 이 되겠죠. (2) 만약에 뭔가 (남아) 있다면 이를 제거해버립니다. (3) requestURL 이라는 이름으로 해당 요청의 request url 값을  Request 영역(scope)에서 공유될 수 있는 속성을 설정합니다. 이때, URL은 프로토콜(protocol), 서버 이름(server name), 포트 이름(port number)과 서버 경로(server path) 등을 포함하지만 질의 문자열 매개변수(query string parameters)는 제외됩니다.
 
이 경우 request url은 http://localhost/myapp/users.html 이 되는 것이죠. 물론 제 경우는 디폴트 HTTP 포트가 80인 경우이니까 8080 등인 경우는 http://localhost:8080/myapp/users.html 이 되겠죠.
 
아무튼 messageFilter를 거치고 난 요청들은 모두 requestURL 이라는 이름으로 요청의 URL을 읽어올 수 있습니다. 쉽게 생각해서 서버측에서 사용자가 주소창에 무엇을 입력했는지를 식별하기 위한 변수라고 볼 수 있죠.
 
다음 필터는 sitemesh 인데요.
 
    <filter>
        <filter-name>sitemesh</filter-name>
        <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
    </filter>
 
sitemesh는 jar 형태로 참조하기 때문에 소스를 보시려면 다운로드를 해야 합니다.
 
아래 sitemesh의 처리 흐름을 도표화 한 그림을 첨부합니다. 출처는 역시 Opensymphony.com 이구요. 좀 길어져서 쉬었다가 PageFilter 소스를 살펴보죠.
 


원본 : Spring 웹 어플리케이션 만들기 (아) - Equinox 파악하기(3) - users.html 요청 처리(A)