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)는 제외됩니다.
아무튼 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 소스를 살펴보죠.
|