SiteMesh ?
| contents |
|---|
| 정의 | 웹 페이지를 구성하는 레이아웃을 효율적으로 만들 수 있게 도와주는 프레임워크 |
| 용도 | 웹 페이지에서 상단, 하단, 메뉴같이 공통된 부분들을 한 곳에 집중하여 처리하고, 변경되는 중간의 콘텐츠만 변경될 수 있도록 해 준다. |
| 동작 방식 | 공통으로 적용될 레이아웃과 구성 요소를 정의하고 있는 데코레이터를 응답 결과에 적용하는 방식으로 동작함. |
| 구성 | 레이아웃 코드 및 헤더와 몸체가 삽입될 위치 정보로 구성됨.어떤 생성 화면이든지 데코레이터를 적용하기만 하면 데코레이터에 정의된 레이아웃과 공통 영역이 적용된 응답 결과를 볼 수 있다. |
SiteMesh vs jsp include ?
| SiteMesh | include |
|---|
| 중복 코드 발생 가능성 | 낮음 | 높음 |
| 사용 방식 | 완전한 HTML 페이지를 생성한 뒤 Decorator Pattern을 사용하여 HTML 페이지에 레이아웃을 입히는 방식 | 전체 페이지 중 내용 부분에 해당하는 코드만을 생성하는 방식 (Tiles, Velocity) |
| 특징 | 레이아웃 템플릿을 만들어주는 기술 중의 하나. | 레이아웃 자체를 변경하거나 새로운 영역을 추가해야 할 경우 전체 jsp 페이지를 변경해주어야 하는 부담이 있음 |
SiteMesh 동작 방식

- 위 그림에서 데코레이터에 전달되는 HTML 페이지는
<html>, <head>, <body> 등을 포함한 완전한 HTML 페이지이다. 이때 데코레이터에 전달되는 HTML 페이지는 레이아웃과 관련된 내용은 포함되지 않는다.
- 데코레이터는 레이아웃 정보를 담고 있는 JSP 페이지로서, 앞서 생성한 HTML 페이지에 저장된 (
<title> 등의) 메타 정보와 <body> 태그에 포함된 내용을 추출한 뒤, 레이아웃의 알맞은 위치에 추출한 내용을 삽입하여 최종 결과를 생성하게 된다.
PageFilter(servelet filter) ?
💡 SiteMesh를 설정하기 위해 설정해야 하는 것
<filter-mapping>
<filter-name>sitemesh</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- 위 예시는 / 로 들어오는 모든 요청에 대해서 PageFilter를 적용한다고 설정 한 것
- PageFilter는 요청 URL과 매칭되는 데코레이터를 검색한 뒤, 데코레이터가 발견될 경우 결과 HTML에 매칭되는 데코레이터를 적용한다.
- 따라서, 데코레이터가 적용되어야 하는 URL의 경우 반드시 PageFilter에 매핑시켜주어야 함.
Decoratror ?
💡 jsp 페이지로서, SiteMesh가 제공하는 커스텀 태그를 사용하여 결과 HTML 페이지를 꾸밈.
| contents |
|---|
| <decorator:head /> | 원본 소스에서 head 요소 부분에 있는 내용(..)을 <decorator:head /> 부분에 삽입 |
| <decorator:body /> | 원본 소스에서 body 요소 부분에 있는 내용(..)을 <decorator:head /> 부분에 삽입 |
| <decorator:title [default=".."] /> | 원본 소스에서 title 요소 안에 내용을 <decorator:title /> 부분에 삽입 |
| <decorator:getProperty property="..." [default="..."][writeEntireProperty=".."] /> | 원본 페이지의 프로퍼티를 가져옴 |
| <decorator:usePage id="..." /> | 원본 페이지의 객체에 접근할 수 있 |
| <page:applyDecorator name=".." /> | decorator.xml에 decorator 등록된 name으로 해당 jsp를 적용 |
| <page:param name=".." /> | decorator할 페이지에서 <decorator:getProperty />로 값을 가져올 수 있음 |