sitemesh는 웹페이지 레이아웃이고 framework 다.
자바, J2EE, XML 기반의 오픈소스 프레임워크고 Servlet스펙 2.3에서 소개된 개념의 필터들로 구성되어 있다.
SiteMesh의 설정을 담당하고 있는 것은 decorators.xml과 sitemesh.xml 파일이다.
-decorators.xml : 여러 장식자의 정의와 특정 장식자가 적용될 페이지의 리스트가 설정되어 있다.
-sitemesh.xml : 장식자 연결자 리스트가 설정되어 있다.
만일 Sitemesh가 해당 경로에서 설정 파일을 찾는데 실패하면sitemesh-2.2.1.jar 에 패키징 되어 있는 sitemesh-default.xml 파일로 대체된다.
자세한 설명은 여기(introduction to sitemesh)를 참고하세요
Sitemesh 동작 원리를 알기 위해 테스트 페이지를 만들 것이다.
그 전에 동작할 수 있는 환경으로 셋팅이 필요하다.
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
"<!-- sitemesh 추가 시작부분 -->"
<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>*.jsp</url-pattern>
</filter-mapping>
<taglib>
<taglib-uri>sitemesh-page</taglib-uri>
<taglib-location>/WEB-INF/sitemesh-page.tld</taglib-location>
</taglib>
<taglib>
<taglib-uri>sitemesh-decorator</taglib-uri>
<taglib-location>/WEB-INF/sitemesh-decorator.tld</taglib-location>
</taglib>
" <!-- sitemesh 추가 마지막부분 -->"
</web-app>
<decorators defaultdir="/decorators">
<decorator name="main" page="main.jsp">
<pattern>*</pattern>
</decorator>
<decorator name="panel" page="panel.jsp"/>
<decorator name="printable" page="printable.jsp"/>
</decorators>
<decorator>요소는 하나의 장식자(decorators)를 정의함
-속성
name : 장식자 이름 정의
page : jsp내에 정의
<pattern>: 하위요소는 특별한 장식자가 적용될 때 사용됨
장식자 태그,페이지 태그 | 장식자 페이지를 생성할 때 사용되는 태그 |
---|---|
decorator:head/> | 장식될 페이지의 <head>태그의 내용을 삽입 |
<decorator:body/> | 장식될 페이지의 <body>태그의 내용을 삽입 |
<decorator:title/> | 장식될 페이지의 <title>태그의 내용을 삽입 |
<decorator:getProperty/> | 장식이 완료된 HTML 페이지의 <body>태그 내에 이벤트 핸들러를 생성하기 위해 사용 |
<decorator:usePage/> | 장식자 페이지에서 장실될 페이지의 페이지 객체를 얻을 수 있게 함 |
페이지 태그 | 장실자 페이지 내에서 다른 장식자를 포함할 때 사용 |
---|---|
<page:applyDecorator/> | 현재 장식자 페이지 내에 장식될 페이지와 장식 지정하여 삽입한다. |
<page:param/> | <page:applyDecorator/> 사용시 해당 장식자에세 파라미터를 전달하기 위해 사용 |
<?xml version="1.0" encoding="UTF-8"?>
<sitemesh>
<property name="decorators-file" value="/WEB-INF/decorators.xml"/>
<excludes file="${decorators-file}"/>
<page-parsers>
<parser content-type="text/html"
class="com.opensymphony.module.sitemesh.parser.FastPageParser" />
</page-parsers>
<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 for localization -->
<mapper
class="com.opensymphony.module.sitemesh.mapper.LanguageDecoratorMapper">
<param name="match.en" value="en" />
<param name="match.zh" value="zh" />
</mapper>
<!-- Mapper for browser compatibility -->
<mapper
class="com.opensymphony.module.sitemesh.mapper.AgentDecoratorMapper">
<param name="match.MSIE" value="ie" />
<param name="match.Mozilla/" value="ns" />
</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.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.ConfigDecoratorMapper">
<param name="config" value="${decorators-file}" />
</mapper>
</decorator-mappers>
</sitemesh>
1. 요청된 페이지나 경로에 따라 장식에 참여할 장식자의 결정
2. 요청이 일어난 시간 또는 로케일(locale),브라우저에 따른 장식자의 결정
3. url쿼리 스트링, 요청속성, 메타태그 속성에 따라 장식자 결정
4 .웹 페이지 사용자의 설정에 따른 장식자의 결정
- PageDecoratorMapper : PageDecoratorMapper는 메타 태그에 decorator 항목이 있을 때 장식자를 리턴한다.
예를 들어 현재 main.jsp 라는 장식자가 default 로 결정되어 있지만 decorator_test 라는 이름의 장식자를 특정 페이지에 적용하고 싶다면
<META name="decorator" content="decorator_test"> 혹은 <HTML decorator="decorator_test">
를 특정페이지에 추가한다.
- AgentDecoratorMapper : AgentDecoratorMapper는 브라우저에 따른 장식자를 선택할수 있도록 한다. 예를 들어 http클라이언트가 익스플로러 라면 /decorators/main-ie.jsp 장식자 페이지를 적용하게 된다. 모질라 기반 브라우저라면 /decorators/main-ns.jsp 가 장식자 페이지로 결정될 것이다. 만약 선정된 장식자 페이지를 찾는데 실패한다면 기본 장식자 페이지인 main.jsp 가 적용될 것이다.
- PrintableDecoratorMapper : PrintableDecoratorMapper는 url쿼리 스트링의 printable=true라는 문자열에 반응한다. /WEB-INF/decorators.xml에 정으된 장식자 중 printable장식자를 리턴할 것이다.
- ParameterDecoratorMapper : ParameterDecoratorMapper는 설정에 정의된 파라미터와 동일한 스트링이 url 쿼리 스트링에 존재할 때 정의해 놓은 장식자를 선정하도록 되어 있다. 위의 예에서 confirm=true 문자열과 일치할 경우 somedecorator 가 장식자로 선정 될 것이다.
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<%@ page
language="java"
contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"
%>
<META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<META name="GENERATOR" content="IBM WebSphere Studio">
<META http-equiv="Content-Style-Type" content="text/css">
<LINK href="theme/Master.css" rel="stylesheet" type="text/css">
<TITLE>index.jsp</TITLE>
</HEAD>
<BODY>
<H4>Test different decorators</H4>
<table>
<tr><td><A href="login.jsp"> Login Page</A></td></tr>
<tr><td><A href="home.jsp"> Home Page</A></td></tr>
<tr><td><A href="help.jsp"> Help Page</A></td></tr>
</table>
</BODY>
</HTML>
<servlet>
<servlet-name>sitemesh-velocity</servlet-name>
<servlet-class>
com.opensymphony.module.sitemesh.velocity.VelocityDecoratorServlet
</servlet-class>
</servlet>
<!--Declare servlet for handling freemarker requests -->
<servlet>
<servlet-name>sitemesh-freemarker</servlet-name>
<servlet-class>
com.opensymphony.module.sitemesh.freemarker.FreemarkerDecoratorServlet
</servlet-class>
<init-param>
<param-name>TemplatePath</param-name>
<param-value>/</param-value>
</init-param>
<init-param>
<param-name>default_encoding</param-name>
<param-value>ISO-8859-1</param-value>
</init-param>
</servlet>
<!-- Velocity servlet should serve all requests with .vm extension-->
<servlet-mapping>
<servlet-name>sitemesh-velocity</servlet-name>
<url-pattern>*.vm</url-pattern>
</servlet-mapping>
<!-- FreeMarker servlet should serve all requests with .dec extension-->
<servlet-mapping>
<servlet-name>sitemesh-freemarker</servlet-name>
<url-pattern>*.dec</url-pattern>
</servlet-mapping>
<html>
<head>
<title>My Site - $Advanced SiteMesh</title>
${head}
</head>
<body>
<table border="1">
<tr>
<td>SiteMesh Corporation</td>
</tr>
<tr>
<td>${body}</td>
</tr>
<tr>
<td>SiteMesh copyright</td>
</tr>
</table>
</body>
</html>
<html>
<head>
<title>My Site - $title</title>
$head
</head>
<body>
<table border="1">
<tr>
<td> SiteMesh Header </td>
</tr>
<tr>
<td> Sidemenu </td>
<td> $body </td>
</tr>
<tr>
<td> SiteMesh Footer </td>
</tr>
</table>
</body>
</html>