Sitemesh 설정, 사용방법, 옵션 등에 대한 정리 (jsp에서 테스트)

2016. 12. 22. 15:07framework/etc framework


Sitemesh 설정, 사용방법

 

그동안 미뤄놨던 Sitemesh 에 대한 정리

 

 

Sitemesh3 가 나왔다고 하지만 내가 사용했던 Sitemesh2 2.4.2 버전을 기준으로 설명한다. 

설정 및 테스트는 jsp로 진행한다.

 

 

 

> Sitemesh란

웹페이지의 레이아웃을 효율적으로 처리할 수 있게 도와주는 프레임워크이다.

 

웹페이지의 동일한 상단, 하단, 메뉴 등의 부분들은 한곳에서 관리하고 각각의 페이지는 실제 내용만을 관리한다.

 



 

> Design Pattern

디자인 패턴에는 여러가지가 있다.

 

그 중에서 Sitemesh는 Decorator 패턴을 사용한다.

 

레이아웃 프레임워크중에서 가장 많이 사용되고있는 Tiles와 비교해보자.

Tiles (타일즈) 는 Composite View Pattern 을 사용한다.

 

부모 뷰와 자식 뷰들을 전체와 부분 관계로 나타낸다.


모든 뷰는 자신보다 작은 부분들의 집합이며 여러 뷰에서 생기는 중복 코드를 감소시키는 역할을 한다.

 

각각의 뷰들 사이의 일관성을 높여 유지보수와 제어를 수월하게 할 수 있도록 한다.

        

 


Sitemesh는 Decorator Pattern 을 사용한다.

 

웹서버로부터 웹브라우저로 제공되는 원본 컨텐츠를 파싱하고, 컨텐츠로부터 속성과 데이타를 추출하여 최종 결과물을 생산한다.


예를 들면 JSP페이지 수행결과가 웹브라우저에 가기 전에 중간에 가로채서 문서의 내용을 변경할 수 있게 한다.

 

 


> Sitemesh 장점

대형 웹사이트에서 많은 웹페이지가 일관된 사용자 룩앤필, 페이지이동, 페이지 레이아웃을 갖는데 용이하다.

 

설정방법과 사용방법도 Tiles 에 비하면 간단한 수준이다.

 

또한 Java2, Servlet, JSP, XML, CGI(Perl, Python etc), PHP, Cold Fusion 등 다른 아키텍쳐와 잘 통합된다.

 



 

> Sitemesh 설정

 테스트환경 : JSP, Tomcat 7.0, JDK 1.7, eGov 2.7

 

설정방법은 매우 간단하다.

 

http://wiki.sitemesh.org/wiki/display/sitemesh/Download

 

위 주소로 이동하여 2.4.2 버전의 jar 파일을 다운받는다.

 

다운받은 파일을 lib 폴더에 위치시킨다.

 

 

web.xml

1
2
3
4
5
6
7
8
  <filter>
    <filter-name>sitemesh</filter-name>
    <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>sitemesh</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

Sitemesh 를 사용하기 위한 설정이다. 

 

위 내용을 web.xml에 작성한다.

 

 

 

다음으로 아래와 같이 decorators.xml, sitemesh.xml 파일을 생성한다.

 

sitemesh.xml 경로는 꼭 아래 경로에 위치해야 하며 decorators.xml 은 sitemesh.xml 파일 내에서 경로를 설정해줄 수 있기 때문에 아무대나 위치해도 된다.

 

편의상 같이 두는것을 추천한다 ^^

사용할 준비는 다 끝났습니다.

 

이제 decorators.xml 파일과 sitemesh.xml 파일을 살펴보면서 내부에 어떤 설정을 하고 있는지 알아보자.

 

 

sitemesh.xml

태그기본적인 sitemesh의 설정 및 사용할 decorators.xml 파일을 호출하는 역할을 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?xml version="1.0" encoding="UTF-8"?>
<sitemesh>
    <page-parsers>
        <parser default="true"
            class="com.opensymphony.module.sitemesh.parser.DefaultPageParser" />
        <parser content-type="text/html"
            class="com.opensymphony.module.sitemesh.parser.FastPageParser" />
    </page-parsers>
 
    <excludes file="/WEB-INF/decorators.xml"/>
    
    <decorator-mappers>
 
        <mapper class="com.opensymphony.module.sitemesh.mapper.PageDecoratorMapper">
            <param name="property.1" value="meta.decorator" />
            <param name="property.2" value="decorator" />
        </mapper>
 
        <mapper
            class="com.opensymphony.module.sitemesh.mapper.FrameSetDecoratorMapper">
        </mapper>
 
        <mapper class="com.opensymphony.module.sitemesh.mapper.AgentDecoratorMapper">
            <param name="match.MSIE" value="ie" />
            <param name="match.Mozilla [" value="ns" />
            <param name="match.Opera" value="opera" />
            <param name="match.Lynx" value="lynx" />
        </mapper>
 
        <mapper
            class="com.opensymphony.module.sitemesh.mapper.PrintableDecoratorMapper">
            <param name="decorator" value="printable" />
            <param name="parameter.name" value="printable" />
            <param name="parameter.value" value="true" />
        </mapper>
 
        <mapper
            class="com.opensymphony.module.sitemesh.mapper.PrintableDecoratorMapper">
            <param name="decorator" value="printable2" />
            <param name="parameter.name" value="printable2" />
            <param name="parameter.value" value="true" />
        </mapper>
 
        <mapper
            class="com.opensymphony.module.sitemesh.mapper.ParameterDecoratorMapper">
            <param name="decorator.parameter" value="decorator" />
            <param name="parameter.name" value="confirm" />
            <param name="parameter.value" value="true" />
        </mapper>
 
        <mapper class="com.opensymphony.module.sitemesh.mapper.RobotDecoratorMapper">
            <param name="decorator" value="robot" />
        </mapper>
        
        <mapper class="com.opensymphony.module.sitemesh.mapper.FileDecoratorMapper">
        </mapper>
        
        <mapper
            class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
            <param name="config" value="/WEB-INF/decorators.xml" />
        </mapper>
 
    </decorator-mappers>
 
</sitemesh>

2# : sitemesh 태그

10# : decorators.xml 에 정의된 excludes 태그를 사용한다는 선언이다. decorators.xml 이 아닌 별도의 파일을 생성할 수 도 있다.


12# : decorator 를 연결해주는 맵퍼를 정의, 정의된 순서대로 우선순위가 결정되는것 같다.

14# : PageDecoratorMapper : meta 태그를 사용하여 decorator을 선택할 수 있다.

PageDecoratorMapper는 <meta>태그에 decorator 항목이 있을 때 장식자를 리턴한다. 예를 들어 현재 layout.jsp 라는 장식자가 default 로 결정되어 있지만 popup이라는 이름의 장식자를 특정 페이지에 적용하고 싶다면 <meta name="decorator" content="popup"></meta> 라고 작성

19# : PageDecoratorMapper  : 프레임셋 사용시

page가 HTMLPage 또는 isFrameSet() 의 return value가 true일 때 특정 decorator을 선정할 수 있도록 한다.

decorator의 이름은 주어진 property에서 지정할 수 있다.

23# : AgentDecoratorMapper : 브라우저별로 다른 decorator을 설정할 경우

AgentDecoratorMapper는 브라우저에 따른 장식자를 선택할수 있도록 한다. 
예를 들어 http클라이언트가 익스플로러 라면 /decorators/layout-ie.jsp 장식자 페이지를 적용하게 된다. 
모질라 기반 브라우저라면 /decorators/layout-ns.jsp 가 장식자 페이지로 결정될 것이다. 만약 선정된 장식자 페이지를 찾는데 실패한다면 기본 장식자 페이지인 layout.jsp 가 적용될 것이다.

30# : PrintableDecoratorMapper : url queryString 의 특정 패턴에 따라 decorator을 설정할 경우

url쿼리 스트링의 printable=true라는 문자열에 반응한다.

/WEB-INF/decorators.xml에 정의된 장식자 중 printable장식자를 리턴할 것이다.

44# : ParameterDecoratorMapper : url queryString 에 dacoratorName를 설정할 경우

url쿼리 스트링의 decorator=decoratorName&confirm=true라는 문자열에 반응한다.

/WEB-INF/decorators.xml에 정의된 장식자 중 decoratorName장식자를 리턴할 것이다.

51# : RobotDecoratorMapper : 검색엔진의 로봇이라고 식별될 때 decorator 를 사용한다.

55# : FileDecoratorMapper : web-app context에서 decorator 이름을 사용할 파일이름으로 취급한다.

58# : ConfigDecoratorMapper : decorators.xml 에 정의된 decorator를 사용한다.

 

* 자세한 설명은 다음 주소 참고

도큐먼트

 

decorators.xml

정의된 decorator 패턴을 지정하는 역할

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="UTF-8"?>  
 
<decorators defaultdir="/WEB-INF/jsp/decorators">
 
    <excludes>
      <pattern>/includeSample/*</pattern>
    </excludes>    
    
    <decorator name="sitemeshSample" page="layout.jsp">
       <pattern>/sitemeshSample/view/*</pattern>  
    </decorator>  
    
    <decorator name="sitemeshSamplePopup" page="popup.jsp">
       <pattern>/sitemeshSample/popup/*</pattern>  
    </decorator>  
      
    <decorator name="popup" page="popup.jsp"/>
    <decorator name="printable" page="printable.jsp"/>
    <decorator name="printable2" page="printable2.jsp"/>
    <decorator name="help" page="help.jsp"/>
    
</decorators>

3# : 정의된 decorator 파일들이 있는 기본 디렉토리를 설정

5# : controller를 호출하는 url 값이 정의된 패턴에 해당한다면 decorator를 사용하지 않음

9#, 13# : controller를 호출하는 url 값이 정의된 패턴에 해당한다면 지정된 page의 레이아웃 형태를 사용한다.

17# ~ 20# : 패턴이 없는 decorator이다.

sitemesh.xml 에서 정의한 mapper로 사용가능하다.

 

 

layout.jsp

jsp 에서 사용하는 방법이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.opensymphony.com/sitemesh/decorator" prefix="decorator" %>
 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <title>title:::::<decorator:title /></title>
    <!-- header -->
    <decorator:head></decorator:head>
    <!-- //header -->
</head>
<body>
    <!-- UI Object -->
    <div id="wrap">
        <p>wrap</p>
        <!-- container -->
        <div id="container">
            <p>container</p>
            <!-- snb -->
            <div class="snb" >
                <p>snb</p>
            </div>
            <decorator:body ></decorator:body>
            <!-- //content -->
        </div>
        <!-- //container -->
        <!-- footer -->
        <div id="footer">
            <p>footer</p>
        </div>
        <!-- //footer -->
    </div>
    <!-- //UI Object -->
</body>
</html>

2# : dacorator 태그를 사용하기 위한 선언

8# : decorator:title : 컨텐츠 페이지에서 title을 가져온다.

10# : decorator:head : 컨텐츠 페이지에서 head 를 가져온다.

24# : decorator:body : 컨텐츠 페이지에서 body 부분을 가져온다.

 

 

 

위 내용만 보면 기본적인 sitemesh 설정 및 사용하는데 크게 무리가 없을 것이다.