'FRAMEWORK'에 해당되는 글 126건

  1. 2014.09.29 Spring - AOP 개념 정리
  2. 2014.09.29 Spring MVC 와 DispatcherServlet
  3. 2014.09.26 Spring 레퍼런스
  4. 2014.09.26 Bean 정의시 id vs name
  5. 2014.09.25 스프링 설정파일과 소스코드(java, jsp)에서 properties 참조
  6. 2014.09.25 util:properties, properties.xml 사용하기
  7. 2014.09.25 스프링 ContextLoaderListener 의 역할
  8. 2014.09.25 sitemesh 정리
  9. 2014.09.25 sitemesh mapper
  10. 2014.09.25 sitemesh 예제

Spring - AOP 개념 정리

FRAMEWORK/SPRING MVC 2014. 9. 29. 13:30

AOP (Aspect Oriented Programming)

- 기능을 핵심 비지니스 로직과 공통 모듈로 구분하고, 핵심 로직에 영향을 미치지 않고 사이사이에 공통 모듈을 효과적으로 잘 끼워넣도록 하는 개발 방법이다.

공통 모듈(보안 인증, 로깅 같은 요소등)을 만든 후에 코드 밖에서 이 모듈을 비지니스 로직에 삽입하는 것이 바로 AOP 적인 개발이다. 코드 밖에서 설정된다는 것이 핵심이다.

 

AOP가 사용되는 경우

1) 간단한 메소드 성능 검사
개발 도중 특히 DB에 다량의 데이터를 넣고 빼는 등의 배치 작업에 대하여 시간을 측정해보고 쿼리를 개선하는 작업은 매우 의미가 있다. 이 경우 매번 해당 메소드 처음과 끝에 System.currentTimeMills();를 사용하거나, 스프링이 제공하는 StopWatch코드를 사용하기는 매우 번거롭다.
이런 경우 해당 작업을 하는 코드를 밖에서 설정하고 해당 부분을 사용하는 편이 편리하다.

2) 트랜잭션 처리
트랜잭션의 경우 비지니스 로직의 전후에 설정된다. 하지만 매번 사용하는 트랜잭션 (try~catch부분)의 코드는 번거롭고, 소스를 더욱 복잡하게 보여준다.

3) 예외 반환
스프링에는 DataAccessException이라는 매우 잘 정의되어 있는 예외 계층 구조가 있다. 예전 하이버네이트 예외들은 몇 개 없었고 그나마도 Uncatched Exception이 아니였다. 이렇게 구조가 별로 안 좋은 예외들이 발생했을 때, 그걸 잡아서 잘 정의되어 있는 예외 계층 구조로 변환해서 다시 던지는 애스팩트는 제 3의 프레임워크를 사용할 때, 본인의 프레임워크나 애플리케이션에서 별도의 예외 계층 구조로 변환하고 싶을 때 유용하다.

4) 아키텍처 검증

5) 기타
- 하이버네티스와 JDBC를 같이 사용할 경우, DB 동기화 문제 해결
- 멀티쓰레드 Safety 관련하여 작업해야 하는 경우, 메소드들에 일괄적으로 락을 설정하는 애스팩트
- 데드락 등으로 인한 PessimisticLockingFailureException등의 예외를 만났을 때 재시도하는 애스팩트
- 로깅, 인증, 권한 등

 

AOP의 구성요소
조인포인트(joinPoint) - 횡단 관심 모듈의 기능이 삽입되어 동작할 수 있는 실행 가능한 특정위치
ex) 메쏘드가 호출되는 부분 또는 리턴되는 시점, 필드를 액세스하는 부분, 인스턴스가 만들어지는 지점, 예외가 던져지는 시점, 예외 핸들러가 동작하는 위치, 클래스가 초기화되는 곳 등이 대표적인 조인포인트가 될 수 있다. 각각의 조인포인트들은 그 안에 횡단 관심의 기능이 AOP에 의해 자동으로 추가되어져서 동작할 수 있는 후보지가 되는 것이다.

포인트컷(pointCut) - 어떤 클래스의 어느 조인포인트를 사용할 것인지를 결정하는 선택 기능
AOP가 항상 모든 모듈의 모든 조인포인트를 사용할 것이 아니기 때문에 필요에 따라 사용해야 할 모듈의 특정 조인포인트를 지정할 필요가 있다. 일종의 조인포인트 선정 룰과 같은 개념이다. 
AOP에서는 포인트컷을 수행할 수 있는 다양한 접근 방법을 제공한다. AspectJ에서는 와일드카드를 이용한 메쏘드 시그니처를 사용한다.


어드바이스(advise) 또는 인터셉터(intercepter)
어드바이스 - 각 조인포인트에 삽입되어져 동작할 수 있는 코드
  주로 메소드 단위로 구성된 어드바이스는 포인트컷에 의해 결정된 모듈의 조인포인트에서 호출되어 사용된다. 
  일반적으로 독립적인 클래스 등으로 구현된 횡단 관심 모듈을 조인포인트의 정보를 참조해서 이용하는 방식으로 작성된다.
인터셉터 - 인터셉터 체인 방식의 AOP 툴에서 사용하는 용어로 주로 한 개의 invoke 메소드를 가지는 어드바이스

어드바이스(advise)의 종류
Before advice : 메서드 실행전에 적용되는 실행
After returning advice : 메서드가 정상적으로 실행된 후에 실행  (예외를 던지는 상황은 정상적인 상황에서 제외)
After throwing advice : 예외를 발생시킬 때 적용되는 Advice를 정의 (catch와 비슷)
Around advice : 메서드 호출 이전, 이후, 예외 발생 등 모든 시점에서 적용 가능한 Advice를 정의


위빙(weaving) 또는 크로스컷팅(crossCutting)
위빙 - 포인트컷에 의해서 결정된 조인포인트에 지정된 어드바이스를 삽입하는 과정 (다른 말로 크로스컷팅)
위빙은 AOP가 기존의 핵심 관심 모듈의 코드에 전혀 영향을 주지 않으면서 필요한 횡단 관심 기능을 추가할 수 있게 해주는 핵심적인 처리과정이다. 위빙을 처리하는 방법은 후처리기를 통한 코드생성 기술을 통한 방법부터 특별한 컴파일러 사용하는 것, 이미 생성된 클래스의 정적인 바이트코드의 변환 또는 실행 중 클래스로더를 통한 실시간 바이트코드 변환 그리고 다이내믹 프록시를 통한 방법까지 매우 다양하다.


인트로덕션(Introduction) 또는 인터타입 선언
인트로덕션 - 정적인 방식의 AOP 기술
동적인 AOP 방식을 사용하면 코드의 조인포인트에 어드바이스를 적용해서 핵심관심 코드의 동작 방식을 변경할 수 있다. 
인트로덕션은 이에 반해서 기존의 클래스와 인터페이스에 필요한 메소드나 필드를 추가해서 사용할 수 있게 해주는 방법
OOP에서 말하는 오브젝트의 상속이나 확장과는 다른 방식으로 어드바이스 또는 애스팩트를 이용해서 기존 클래스에 없는 인터페이스 등을 다이내믹하게 구현해 줄 수 있다.


애스팩트(aspect) 또는 어드바이저
애스팩트 - 포인트컷(어디에서) + 어드바이스(무엇을 할 것인지) + (필요에 따라 인트로덕션도 포함)
AspectJ와 같은 자바 언어를 확장한 AOP에서는 마치 자바의 클래스처럼 애스팩트를 코드로 작성할 수 있다. AOP 툴의 종류에 따라서 어드바이스와 포인트컷을 각각 일반 자바 클래스로 작성하고 이를 결합한 어드바이저 클래스를 만들어서 사용하는 방법도 있다.




Primary(Core) Concern - 비지니스 로직을 구현한 부분
Cross-Cutting Concern - 보안, 인증, 로그 등과 같은 부가적인 기능으로서 시스템 전반에 산재되어 사용되는 기능
Code - Primary(Core) concern을 구현해 놓은 코드를 이야기

위의 이미지는 AOP에 대하여 간단하게 정리한 이미지이다. (그냥 이해한 대로 정리한거라..;;)
설명을 하자면 기존의 코드는 Primary Concern과 Cross-Cutting Concern이 같이 하나의 프로그램으로 구현되어졌다.
당연히 비지니스 로직과 상관없는 코드들이 여기저기 산재해 있게 되었기에 가독성과 유지보수성이 좋지 않았다.
하지만 AOP는 Primary Concern과 Cross-Cutting Concern이 별도로 코드로 구현이 되고, 최종적인 프로그램은 이 (Code와 Advise)을 연결해주는 설정 정보인 Point-Cut을 이용하여 Weaving되어 완성하게 되는 것이다. 

 

AOP의 설정 구조는 보통 아래와 같이 구성되어 있다.

<aop:config> 
    <aop:pointcut /> : pointcut 설정
    <aop:aspect> : aspect를 설정
        <aop:before /> : method 실행 전
        <aop:after-returning /> : method 정상 실행 후
        <aop:after-throwing /> : method 예외 발생 시
        <aop:after /> : method 실행 후 (예외 발생 예부 상관 없음)
        <aop:around /> : 모든 시점 적용 가능
    </aop:aspect>
</aop:config> 

 

참고 : http://whiteship.tistory.com/1960http://www.zdnet.co.kr/news/news_view.asp?artice_id=00000039147106&type=det 

'FRAMEWORK > SPRING MVC' 카테고리의 다른 글

Spring - POJO  (0) 2014.09.29
Spring - Bean 초기화 및 생명주기  (0) 2014.09.29
Spring - Bean Scope  (0) 2014.09.29
Spring - IoC & DI  (0) 2014.09.29
Spring MVC 와 DispatcherServlet  (0) 2014.09.29
:

Spring MVC 와 DispatcherServlet

FRAMEWORK/SPRING MVC 2014. 9. 29. 13:28

Spring MVC 는 다른 MVC 프레임워크와 동일하게 앞단에 프론트 컨트롤러(DispatcherServler)를 두고있다.

DispatcherServlet - web.xml 에 정의한 서블릿
                                MVC아키텍처로 구성된 프레젠테이션 계층을 만들 수 있도록 설계되어 있다.

[ Spring MVC의 흐름 ]



 

1) DispatcherServlet의 HTTP 요청 접수

자바 서버의 서블릿 컨테이너는 HTTP 프로토콜을 통해 들어오는 요청이 스프링의 DIspatcherServlet에 할당된 것이라면 HTTP 요청 정보를 DIspatcherServlet에 전달.

web.xml에는 DIspatcherServlet이 전달받을 URL의 패턴이 정의되어 있다.

DIspatcherServlet는 공통적으로 진행해야 하는 파라미터조작, 한글 디코딩 같은 전처리 작업이 등록되어 있다면 이를 먼저 수행한다.

web.xml의 설정 (서블릿을 하나 등록하고 해당 서블릿에 매핑을 시켜주는것이 전부이다.)

<web-app>
<servlet>
<servlet-name>example</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>example</servlet-name>
<url-pattern>*.form</url-pattern>
</servlet-mapping>
</web-app>

 

2) DIspatcherServlet에서 컨트롤러로 HTTP 요청 위임

DIspatcherServlet는 URL이나 파라미터 정보, HTTP 명령등을 참고하여 해당 컨트롤러에 작업을 위임.

DIspatcherServlet는 핸들러 매핑전략을 이용하여 컨트롤러를 선정

핸들러 - 컨트롤러를 웹의 요청을 다루는(handle) 오브젝트.

핸들러 매핑전략 - 사용자 요청을 기준으로 어떤 핸들러에게 작업을 위임할 지 결정해주는 것

어댑터 - DIspatcherServlet은 컨트롤러가 어떤 메소드를 가졌고 어떤 인터페이스를 구현하였는지 알지 못한다.
        그래서 사용 어댑터는 자신이 담당하는 컨트롤러에 맞는 호출방법을 이용하여 컨트롤러에 작업 요청을 보내고 결과를 
        돌려받아 DIspatcherServlet에게 다시 돌려주는 기능을 한다.



 

3) 컨트롤러의 모델 생성과 정보 등록

MVC패턴의 장점은 정보를 담고 있는 모델과 정보를 어떻게 뿌려줄지를 알고 있는 뷰가 분리된다는 점이다.

컨트롤러의 역활 : 사용자의 요청을 해석
                        실제 비지니스 로직을 수행하도록 서비스 계층 오브젝트에게 작업을 위임
                        모델(맵에 담긴 정보 - 이름과 그에 대응되는 값의 쌍으로 정보를 만드는 것) 생성
                        뷰 선택

컨트롤러는 모델과 뷰 두 가지 정보는 반드시 DispatcherServlet에 전달해야 한다.

 

4) 컨트롤러의 결과 리턴 : 모델 , 뷰

컨트롤러에게서 뷰의 논리적인 이름을 리턴받아, (DispatcherServlet가) 뷰 리졸버를 이용하여 뷰 오브젝트를 생성.

JSP파일로 만들어진 뷰 템플릿과 JstlView클래스로 만들어진 뷰 오브젝트가 결합하여 HTML을 생성한다.

ModelAndView 오브젝트 - DispatcherServlet이 최종적으로 컨트롤러로부터 돌려받는 오브젝트 
                                        (모델, 뷰 두가지 정보를 담고 있다.)

 

5) DispatcherServlet의 뷰 호출과 6) 모델 참조

DispatcherServlet은 컨트롤러로부터 받은 모델을 뷰오브젝트에 전달 및 클라이언트에게 돌려줄 최종 결과물을 생성 요청

동적으로 생성되는 부분은 모델을 내용을 참고를 내용을 채운다.

ex) 컨트롤러가 모델에 name이라는 이름으로 'Spring'을 담았다면 아래와 같이 처리된다.

<div> 이름 : ${name} <div> -> <div> 이름 : Spring </div>

HttpsServletResponse오브젝트 - 뷰 작업을 통한 최종 결과물을 담는 오브젝트.

 

7) HTTP응답 돌려주기

DispatcherServlet은 등록된 후처리기가 있는지 확인하고 있으면 후속작업을 진행한 후 뷰가 만들어준 HttpServletResponse에 담긴 최종 결과를 서블릿 컨테이너에게 돌려준다.

서블릿 컨테이너는 HttpServletResponse에 담긴 정보를 HTTP응답으로 만들어 사용자게에 전달해주고 작업을 종료한다.

 

 

[ 다양한 DispatcherServlet의 DI 가능 전략 ]

HandlerMapping

URL과 요청 정보를 기준으로 어떤 핸들러 오브젝트, 즉 컨트롤러를 사용할 것인지 결정하는 로직 담당

DispatcherServlet은 하나의 이상의 핸들러 매핑을 가질 수 있다.

Default - BeanNameUrlHandlerMapping, DefaultAnnotationHandlerMapping

 

HandlerAdapter

핸들러 매핑으로 선택한 컨트롤러/핸들러를 DispatcherServlet이 호출할 때 사용하는 어뎁터

 

HandlerExceptionResolver

예외가 발생하였을 경우 처리하는 로직을 담당

예외가 발생하였을 때 예외의 종류에 따라 DispatcherServlet을 통해 처리되는 작업의 경우, DispatcherServlet에 등록된 HandlerExceptionResolver 중에서 발생한 예외에 적합한 것을 찾아 예외처리를 위임한다.

 

ViewResolver

컨트롤러가 리턴한 뷰이름을 참고하여 적절한 뷰 오브젝트를 찾아주는 로직을 가진 전략 오브젝트

ViewResolving(뷰 리졸빙) - http://isstory83.tistory.com/117 


LocaleResolver

지역(Locale)정보를 결정해주는 전략

디폴트인 AcceptHandlerLocaleResolver는 HTTP 헤더 정보를 이용하여 지역정보를 설정한다.

'FRAMEWORK > SPRING MVC' 카테고리의 다른 글

Spring - POJO  (0) 2014.09.29
Spring - Bean 초기화 및 생명주기  (0) 2014.09.29
Spring - Bean Scope  (0) 2014.09.29
Spring - IoC & DI  (0) 2014.09.29
Spring - AOP 개념 정리  (0) 2014.09.29
:

Spring 레퍼런스

FRAMEWORK/SPRING REF 2014. 9. 26. 15:02

http://blog.outsider.ne.kr/category/JAVA/Framework?page=4

:

Bean 정의시 id vs name

FRAMEWORK/SPRING 2014. 9. 26. 13:56

Spring 빈 정의할때 id 또는 name을 혼용해서 사용하는데 둘의 차이는 다음과 같다.


id 사용시 name과 다른점


XML내에서 Unique 해야함.

XML 에디터에서 중복 id발견시 validator가 체크해 줌

name사용시에는 Editor레벨에서 발견할 수 없고 Spring Runtime시에 중복 여부를 알수 있음


특수문자가 올수 없다. / , 등

name="/user/action.do" 라고 쓸수있지만 id="/user/action.do" 라고 쓸수 없다


출처 - http://mrjh.com/wiki/content.php?no=369&page=2

:

스프링 설정파일과 소스코드(java, jsp)에서 properties 참조

FRAMEWORK/SPRING 2014. 9. 25. 13:46

스프링 설정파일과 java, jsp 소스 코드 상에서 properties 파일의 값을 참조하는 방법 중에서<context:property-placeholder> 를 이용하는 방법과 SpEL 을 이용하는 방법에 대해서 정리하겠다.

 

 

1. <context:property-placeholder>

 

1) 서블릿 컨텍스트 파일 설정

<beans xmlns="http://www.springframework.org/schema/beans"   
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  xmlns:p="http://www.springframework.org/schema/p"   
  xmlns:context="http://www.springframework.org/schema/context"   
  xmlns:mvc="http://www.springframework.org/schema/mvc
  xmlns:util="http://www.springframework.org/schema/util"
  xsi:schemaLocation="http://www.springframework.org/schema/beans   
       http://www.springframework.org/schema/beans/spring-beans-3.1.xsd   
       http://www.springframework.org/schema/util 
       http://www.springframework.org/schema/util/spring-util-3.1.xsd
       http://www.springframework.org/schema/context   
     
http://www.springframework.org/schema/context/spring-context-3.1.xsd 
       http://www.springframework.org/schema/mvc 
       http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">  

 

<context:property-placeholder location="/WEB-INF/*.properties" />

 

2) 사용법

- xml 안에서 사용

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />

</bean>

 

-- java 코드 내에서 사용

@Value("${jdbc.url}")

private String dbURL;

 

 

2. SpEL 이용

 

1) 서블릿 컨텍스트 파일 설정

<beans xmlns="http://www.springframework.org/schema/beans"   
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
  xmlns:p="http://www.springframework.org/schema/p"   
  xmlns:context="http://www.springframework.org/schema/context"   
  xmlns:mvc="http://www.springframework.org/schema/mvc
  xmlns:util="http://www.springframework.org/schema/util"
  xsi:schemaLocation="http://www.springframework.org/schema/beans   
       http://www.springframework.org/schema/beans/spring-beans-3.1.xsd   
       http://www.springframework.org/schema/util 
       http://www.springframework.org/schema/util/spring-util-3.1.xsd
       http://www.springframework.org/schema/context   
       http://www.springframework.org/schema/context/spring-context-3.1.xsd 
       http://www.springframework.org/schema/mvc 
       http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">  

 

<util:properties id="db" location="/WEB-INF/database.properties" />  

<!-- SpEL 을 이용시에는 파일명으로 와일드문자(*)를 사용할 수 없다. 파일명을 다 입력해 주어야 한다. -->

 

2) 사용법

-- xml 안에서 사용

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property name="driverClassName" value="#{db['jdbc.driver']}" />
<property name="url" value="#{db['jdbc.url']}" />
<property name="username" value="#{db['jdbc.username']}" />
<property name="password" value="#{jdbc.password']}" />

</bean>

 

-- java 코드 내에서 사용

@Value("#{db['jdbc.url']}")

private String dbURL;

 

 

 

* 톰캣7.0, jdk1.7, spring 3.1 에서 테스트 해 보니 <context:property-placeholder/> 이용하는 방법은 파일을 읽어들여서 키 값을 참조하는 시점에서 참조하지 못하는 오류가 일부 발생한다. 전체를 참조하지 못하는 것이 아니고 일부 키만 ㅡㅡ; 아직 원인을 찾아 해결하지는 몯했다.

SpEL을 이용하는 방법은 정상적으로 동작한다.


출처 - http://roadrunner.tistory.com/366

:

util:properties, properties.xml 사용하기

FRAMEWORK/SPRING 2014. 9. 25. 12:32

1. 우선 *.xml 파일을 생성했다. 문법은 간단하다


1.<?xml version="1.0" encoding="UTF-8"?>
2.<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd" >
3.<properties>
4. 
5.<comment>설명</comment>
6.<entry key="key">value</entry>
7. 
8.</properties>



2. dispatcher-servlet.xml 에 다음과 같은 내용을 추가해준다

util:properties를 사용하기 위해서 선언해주고, util:properties로 properties.xml을 등록한다.

01.<?xml version="1.0" encoding="UTF-8"?>
02.<beans xmlns:util="http://www.springframework.org/schema/util" xsi:schemalocation="   .... 생략 ....
05. 
06.<!-- properties.xml -->
07.<util:properties id="config" location="classpath:/conf/properties.xml">
08.</util:properties>
09.</beans>





3. SpEL을 이용해서 Java에서 사용하는 방법이다.

@Value("#{config['key']}") String picturePath;


4. applicationContext.xml과 같은 *.xml에서 사용하는 방법이다


1.<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
2.<property name="driverClassName" value="#{config['key']}">
3.... 생략 ...
4.</property></bean>


5. JSP에서 사용하는 방법


1.<%@ taglib uri="http://www.springframework.org/tags" prefix="spring"%>
2.... 생략 ...
3.<spring:eval expression="@config['key']">
4.</spring:eval>



출처 -http://umsh86.tistory.com/41

:

스프링 ContextLoaderListener 의 역할

FRAMEWORK/SPRING 2014. 9. 25. 12:03

계층별로 나눈 xml 설정파일이 있다고 가정할 때,
web.xml에서 모두 load되도록 등록할 때 사용.
서블릿이전에 서블릿 초기화하는 용도록 쓰이며, 
contextConfigLocation라는 파라미터를 쓰면, 
Context Loader가 load할 수 있는 설정파일을 여거개 쓸 수 있다.

web.xml에 저 문장이 빠지게 되면 default로,
/WEB-INF/applicationContext.xml (spring 설정파일) 을 쓰게 된다.

[web.xml]

<context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>
           /WEB-INF/mars-ibatis.xml 
           /WEB-INF/mars-service.xml 
      </param-value>
</context-param>

<listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>


출처 - http://northface.tistory.com/entry/contextConfigLocation-and-orgspringframeworkwebcontextContextLoaderListener%EC%8A%A4%ED%94%84%EB%A7%81-%EC%84%A4%EC%A0%95%ED%8C%8C%EC%9D%BC%EC%9D%84-%EC%9D%BD%EA%B8%B0




<servlet>

    <servlet-name>aController</servlet-name>

    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <init-param>

    <param-name>contextConfigLocation</param-name>

    <param-value>/WEB-INF/a-servlet.xml</param-value>

        </init-param>

     <load-on-startup>1</load-on-startup>

</servlet>


<servlet>

    <servlet-name>bController</servlet-name>

    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

        <init-param>

    <param-name>contextConfigLocation</param-name>

    <param-value>/WEB-INF/b-servlet.xml</param-value>

        </init-param>

     <load-on-startup>1</load-on-startup>

</servlet>


위와 같은 경우 DispatcherServlet 은 각가 별도의 webapplicationcontext를 생성한다.

두 context 는 독립적이므로 각각의 설정파일에서 생성한 빈을 서로 사용할 수 없다.(공유X)


이때 동시에 필요한 의존성(공통빈) 이 있어야 하는 경우

ContextLoaderListener 을 사용하여 공통으로 사용할 빈을 설정할 수 있다.


<listener>

     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

</listener>


<context-param>

    <param-name>contextConfigLocation</param-name>

    <param-value>

        /WEB-INF/applicationContext.xml

        /WEB-INF/applicationContext_dao.xml

    </param-value>

</context-param>


ContextLoaderListener 와 DispatcherServlet 은 각각 webapplicationcontext 를 생성하는데

ContextLoaderListener 가 생성한 컨텍스트가 root 컨텍스트가 되고 DispatcherServlet  생성한 인스턴스는

root 컨텍스트를 부모로 하는 자식 컨텍스트가 된다.


자식 컨텍스트들은 root 컨텍스트의 설정 빈을 사용 할 수 있다.

그러기에 ContextLoaderListener 을 이용 공통빈 설정 가능.


출처 - http://blog.daum.net/_blog/BlogTypeView.do?blogid=0Tqpx&articleno=217&categoryId=0&regdt=20130911110427

:

sitemesh 정리

FRAMEWORK/SITEMESH 2014. 9. 25. 11:27

sitemesh

sitemesh 설치

sitemesh : http://www.opensymphony.com/sitemesh
download : http://www.opensymphony.com/sitemesh/download.action
다운받았다면 WEB-INF/lib아래 복사해 넣으면 된다. 

sitemesh 설정하기 [web.xml]

 <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>

위의 내용을 보면 알 수 있듯이 사이트메쉬는 필터 기반이다. 
해당 페이지를 전혀 건드리지 않고 레이아웃을 설정할 수 있게해주며 사용하기 쉽다. 

WEB-INF/sitemesh.xml

<?xml version="1.0" encoding="UTF-8"?>
<sitemesh>
    <property name="decorators-file" value="/WEB-INF/decorators.xml" /> <!-- decorator 정의 파일 위치 설정-->
    <excludes file="${decorators-file}" /> 

    <!-- parser를 설정한다. 어떻게 parsing 해서 레이아웃을 입힐 것인지 결정한다.  -->
    <page-parsers>
        <parser content-type="text/html"
            class="com.opensymphony.module.sitemesh.parser.HTMLPageParser" />
        <parser content-type="text/html;charset=UTF-8"
            class="com.opensymphony.module.sitemesh.parser.HTMLPageParser" />
    </page-parsers>

    <!-- mapper를 설정한다.  다양한 레이아웃 결정 방법을 제공한다. -->
    <decorator-mappers>
  <!-- 파라미터에 printable=true 하면 printable이라는 이름의 레이아웃을 적용한다.  -->
  <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>

  <!-- 페이지의 meta tag에 이름을 decorator라고 하고 거기에 적용할 레이아웃을 설정하면 된다. -->
  <mapper class="com.opensymphony.module.sitemesh.mapper.PageDecoratorMapper" >
   <param name="property" value="meta.decorator" />
  </mapper>

  <!-- /WEB-INF/decorators.xml 파일에 정의된 걸  적용한다. -->
  <mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
            <param name="config" value="${decorators-file}" />
        </mapper>
    </decorator-mappers>
</sitemesh>


WEB-INF/decorators.xml

<?xml version="1.0" encoding="UTF-8"?>
<decorators defaultdir="/decorator">
    <!-- 입력한 주소가 /test/어쩌구.jsp 이런 패턴이면 아래 레이아웃이 적용된다. -->
    <decorator name="main" page="testLayout.jsp">
          <pattern>/test/*</pattern> 
    </decorator>
    <decorator name="panel" page="panel.jsp"/>
    <decorator name="kkaok" page="panel.jsp"/>
    <decorator name="printable" page="printable.jsp"/>
</decorators>



레이아웃 페이지에 값 전달 하기

content 이용하기 
해당페이지 : <content tag="tagName">값이 넘어가나요.</content>
레이아웃페이지 : <decorator:getProperty property="page.tagName"/>
<content>를 이용하고 tag에 이름을 주면 해당 블럭의 값이 전달된다. 

meta tag 이용하기 
해당페이지
<meta name="email" content="abc@abc.abc">
<meta name="author" content="it's me 나요">

레이아웃 페이지 
<br>메타 태그로 값 받기 meta.author : <decorator:getProperty property="meta.author"/>
<br>메타 태그로 값 받기 meta.email : <decorator:getProperty property="meta.email"/>

layout 정의 된 title에 값 넣기 
해당페이지
<title>학교종이 땡땡땡</title>

레이아웃 페이지 
이렇게 하면 html 태그를 읽어서 <decorator:title default="Welcome!" /> 이곳에 값을 넣어준다.


layout에 인클루드한 값 공유하기

request.setAttribute(key, valuel);
이렇게 하면 해당값에서 공유된다. 
body 페이지 처리하고 그결과를 layout 페이지에서 처리하기 때문에 가능함

layout 페이지에 넘어온 값을 동적으로 처리하기

<decorator:useHtmlPage id="html"/>
<%
    String tmpVal = html.getProperty("meta.author");
%>
<br>
<jsp:include page="/common/head.gs">
<jsp:param name="kkaok" value="<%=tmpVal %>" />
</jsp:include>


mapper들 정리

PrintableDecoratorMapper
특정 페이지를 예외적으로 적용하고자 할때 사용 
sitemesh.xml
<decorator-mappers>
  <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>
</decorator-mappers>
여기 보면 파라미터 명이 "printable"이고 value가 "true"면 decorator의 printable을 매핑해라라는 의미이다. 

decorator.xml
<decorators defaultdir="/decorators">
    <decorator name="printable" page="printable.jsp"/>
</decorators>

PageDecoratorMapper
페이지 단위로 처리하고자 할때 사용 
sitemesh.xml
  <mapper class="com.opensymphony.module.sitemesh.mapper.PageDecoratorMapper" >
   <param name="property" value="meta.decorator" />
  </mapper>

적용하고자 하는 페이지에 아래 처럼 선언되어 있다면
<meta name="decorator" content="kkaok">
decorator.xml에 정의되어 있는 레이아웃 페이지가 적용된다. 
    <decorator name="kkaok" page="panel.jsp"/>

출처 - http://devkkaok.tistory.com/17

'FRAMEWORK > SITEMESH' 카테고리의 다른 글

SiteMash 적용  (0) 2014.11.04
Tag References  (0) 2014.11.04
sitemesh mapper  (0) 2014.09.25
sitemesh 예제  (0) 2014.09.25
:

sitemesh mapper

FRAMEWORK/SITEMESH 2014. 9. 25. 11:12

                                               Mapper의 종류

Mapper 종류내용
AgentDecoratorMapperbrowser에 따른 decorator를 선택할 수 있도록 한다. 
browser 타입은 일반적인 경우와 같이 request.getHeader("User-Agent")를 통해 구해온다. 
다른 mapper들이 특정 decorator를 지칭하여 반환하는 것과 달리 AgentDecoratorMapper는 적용될 decorator의 decorator page이름을 browser에 따라 수정한다.
예를 들어 decorator mapper가 main decorator를 선정했다면 decorator 페이지는 /decorators/main.jsp가 적용될 것이다. 하지만 http 클라이언트가 익스플러라면 main decorator에 /decorators/main-ie.jsp 장식자 페이지를 적용하게 된다. 
모질라 기반 browser라면 /decorators/main-ns.jsp가 decorator page로 결정된다. 
만약 선정된 decorator page를 찾는데 실패하면 기본 decorator page인 main.jsp가 적용될 것이다.
<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>
ConfigDecoratorMapperDecoratorMapper의 디폴트 구현으로서, decorators.xml 파일을 읽어 decorator와 mapping된 데이터들을 읽는다.
<mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
    <param name="config" value="/WEB-INF/decorators.xml" />
</mapper>
CookieDecoratorMapper쿠키값을 바탕으로 하는 decorator를 선정할 수 있다.
EnvEntryDecoratorMapperdecorator 이름으로 web-app 환경 entry에 대한 레퍼런스를 허락한다.
FileDecoratorMapper파일 이름을 주어 decorator의 이름을 취급한다.
<mapper class="com.opensymphony.module.sitemesh.mapper.FileDecoratorMapper">
</mapper>
FrameSetDecoratorMapperpage가 HTMLPage나 isFrameSet()의 리턴값이 true일 때, 특정 decorator를 선정할 수 있도록 해준다. 그 decorator의 이름은 주어진 property에서 지정할 수 있다. 
<mapper class="com.opensymphony.module.sitemesh.mapper.FrameSetDecoratorMapper">
</mapper>
InlineDecoratorMapperinline decorator를 사용할 때, 올바른 decoraotor가 무엇인지 사용할 때 선정할 수 있다.
LanguageDecoratorMapperbrowser에서 page 요청에 대해 "Accept-Language" HTTP 헤더를 이용하여 language 페이지를 결정할 때 선정할 수 있다. 
locale에 따라서 decorator의 파일의 이름에 '-en'에 붙여져서 사용될 수 있도록 지정할 수 있다.
<mapper class="com.opensymphony.module.sitemesh.mapper.LanguageDecoratorMapper">
  <param name="match.en" value="en" />
  <param name="match.zh" value="zh" />
</mapper>
PageDecoratorMapper메타 태그에 decorator 항목이 있을 때 장식자를 리턴한다. 
PageDecoratorMapper는 여러 파라미터를 받는다. 밑의 예를 보면, PageDecoratorMapper는 첫번째 파라미터로 meta.decorator 프로퍼티를 받는다. 이 의미는 decorator의 META 프로퍼티의 값이 decorator 이름으로 쓰여질 수 있다는 것을 의미한다. decorator_test라는 이름의 장식자를 특정페이지에 적용하고 싶다면 <META name="decorator" content="decorator_test">와 같이 페이지에 메타 태그를 추가하거나 또는 <HTML decorator="decorator_test">와 같이 <HTML> 태그를 수정하여 사용한다. 
<mapper class="com.opensymphony.module.sitemesh.mapper.PageDecoratorMapper">
    <param name="property.1" value="meta.decorator" />
    <param name="property.2" value="decorator" />
</mapper>
decorators.xml에서 decorator_test decoration을 미리 정의
<decorator name="decorator" page="tv.jsp">
</decorator>
ParameterDecoratorMapper설정에 정의된 파라미터와 동일한 스트링이 URL 쿼리 스트링에 존재할 때 정의해 놓은 decorator를 선정하도록 되어 있다. 
<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는 3개의 parameter가 존재한다. 
decorator.parameter : 특정 decorator의 이름을 지칭하는 리쿼스트 파라미터의 이름 
parameter.name : 특정 리쿼스트 파라미터를 confirm하는데 사용하는 리쿼스트 파라미터의 이름
parameter.value : 특정 decorator 파라미터를 confirm하는데 사용하는 리쿼스트 파라미터의 값
만약 help.jsp 파일에 이 mapper에 test decorator를 적용하려면 다음의 코드로 호출하면 된다.

help.jsp
help.jsp?decorator=test&confirm=true
SessionDecoratorMappersession 어트리부트에서 지정한 decorator를 선정하도록 되어 있다. 
디폴트로 decorator를 session 속성에서 찾지만, decorator.parameter 속성을 통해서 오버라이드 될 수 있다.
PrintableDecoratorMapperURL 쿼리 스트링의 printable=true라는 문자열에 반응한다. 
decorators.xml에 정의된 decorator중 printable decorator를 리턴할 것이다.
아래의 예는 다음을 의미한다. printable로 정의된 decoraotr는 printable=true 라는 리쿼스트가 들어올 때 해당 jsp가 적용된다.
<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>
RobotDecoratorMapper검색엔진 로봇에서 식별되어 지는 특정 decorator를 선정하도록 되어 있다. 
<mapper class="com.opensymphony.module.sitemesh.mapper.RobotDecoratorMapper">
    <param name="decorator" value="robot" />
</mapper>

사용자 정의 mapper 환경 설정

sitemesh.xml

요청에 따라 적용될수 있는 mapper를 정의하기 위해서는 sitemesh.xml파일을 생성한다.

sitemesh.xml
<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.HTMLPageParser" />
        <parser content-type="text/html;charset=ISO-8859-1"
            class="com.opensymphony.module.sitemesh.parser.HTMLPageParser" />
    </page-parsers>

    <decorator-mappers>
        <mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
            <param name="config" value="${decorators-file}" />
        </mapper>
    </decorator-mappers>
</sitemesh>

이 예에서 유일하게 적용된 mapper는 ConfigDecoratorMapper이다. 이 mapper는 웹페이지의 content-type이 text/html 이거나 text/html;charset=ISO-8859-1인 경우일때만 적용될 것이다. 다른 content-type(예, image/gif)의 page는 적용되지 않는다.

decorators.xml

부가적으로 패턴 매치를 이용하여 특정 파일들을 exclude하여 Sitemesh가 처리하지 않게 할 수 있다.
<excludes /> block을 이용하여 exlcude해야할 파일을 설정할 수 있다.

decorators.xml
<decorators>
    <excludes>
        <pattern>/plainPage.jsp</pattern>
        <pattern>/plain/*.jsp</pattern>
    </excludes>
</decorators>

/plainPage.jps와 /plain 디렉토리의 jsp 페이지는 장식이 전혀 되지 않는다. (패턴 매칭은 ConfigDecoratorMapper에서 사용되는 decorator 매핑처럼 정확하게 같은 룰을 따른다. )

일반적으로 <excludes /> 블럭은 decorators.xml 파일의 시작에서 추가되지만, 다른 XML 파일에서 정의할 수 있다.

디폴트 mapper 환경설정

만약 WEB-INF 디렉토리에서 sitemesh.xml이 발견되지 않으면, 디폴트 mapper 설정 화일이 사용되어 질 수 있다. 디폴트 mapper 환경설정파일의 정의는 sitemesh.jar안에 있는 sitemesh-default.xml의 설정파일이 적용된다. 그리고, 다음의 mapper들로 구성되어 진다.

  • PageDecoratorMapper
  • FrameSetDecoratorMapper
  • PrintableDecoratorMapper
  • FileDecoratorMapper
  • ConfigDecoratorMapper

디폴트로 오직 text/html 컨텐트 타입만 Sitemesh에 의해 decoration된다.


출처 - http://knight76.tistory.com/entry/30021375445

'FRAMEWORK > SITEMESH' 카테고리의 다른 글

SiteMash 적용  (0) 2014.11.04
Tag References  (0) 2014.11.04
sitemesh 정리  (0) 2014.09.25
sitemesh 예제  (0) 2014.09.25
:

sitemesh 예제

FRAMEWORK/SITEMESH 2014. 9. 25. 10:38

코드

공통 설정 및 자바 코드

 - web.xml 추가 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<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>
   
  <jsp-config>
      <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>
  </jsp-config>

 

- sitemesh.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
<?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>

 

- decorators.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
<decorators defaultdir="/WEB-INF/views/deco">
 
    <decorator name="top" page="top.jsp"/>
    <decorator name="left" page="left.jsp"/>
    <decorator name="right" page="right.jsp"/>
    <decorator name="bottom" page="bottom.jsp"/>
     
    <decorator name="layout" page="decolayout.jsp">
        <pattern>*layout*</pattern>
    </decorator>
     
</decorators>

 

- SiteMeshContoller.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
package com.fbwotjq;
 
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
 
@Controller
public class SiteMeshContoller {
     
    @RequestMapping(value = "/applyDecorator" , method = RequestMethod.GET)   
    public String applyDecorator(){
        return "applyDecorator";
    }
     
    @RequestMapping(value = "/layoutCall" , method = RequestMethod.GET)   
    public String notApplyDecorator(){
        return "layoutCall";
    }
     
}

 


첫번쨰 방법 화면 관련 코드 

 - applyDecorator.jsp

 



 

 - bottom.jsp

 



 

 - left.jsp

 



 

 - right.jsp

 



 

 - top.jsp

 



 

두번째 방법 화면 관련 코드  

-  layoutCall.jsp(호출 페이지)

 



 

- decolayout.jsp(레이아웃페이지)

 




결과

- 첫번쨰 결과

 



- 두번쨰 결과

 



 


출처 - http://wannastop.tistory.com/409



sitemesh.xml

sitemesh.xml은 decorator mapper 리스트가 설정되어 있다. 만일 Sitemesh가 해당 경로에서 설정 파일을 찾는데 실패하면sitemesh.jar 에 패키징 되어 있는 sitemesh-default.xml 파일로 대체된다.

sitemesh.xml
<sitemesh>
    <property name="decorators-file" value="/WEB-INF/decorators.xml" />

    <page-parsers>
         <parser content-type="text/html" class="com.opensymphony.module.sitemesh.parser.FastPageParser" />
    </page-parsers>

    <excludes file="${decorators-file}" />

    <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.RobotDecoratorMapper">
		<param name="decorator" value="robot" />
	</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.FileDecoratorMapper">
	</mapper>

	<mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
		<param name="config" value="${decorators-file}" />
	</mapper>

	</decorator-mappers>
</sitemesh>
  • page parsers
    <page-parsers> 엘리먼트는 content-type에 따라 적용할 파서를 정의한다. SiteMesh는 현재 text/html을 파싱할 때 사용되는 FastPage Parser만 구현되어 있다. 나머지에 대해서는 디폴트로 DefaultPageParser가 사용가능하다.
    <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>
  • decorator mapper
    decorator mapper는 Sitemesh에게 장식에 사용될 적합한 decorator를 설정해주는 역할을 한다. <decorator-mapper> 엘리먼트는 decorator mapper들을 정의한다. decorator mapper 추상 클래스는 링크드 리스트로 정의되어 있고, 적혀진 순서에 따라 decorator 체인으로 만들어진다.
    <decorator-mappers>
    	<mapper class="com.opensymphony.module.sitemesh.mapper.PageDecoratorMapper">
    		<param name="property.1" value="meta.decorator" />
    		<param name="property.2" value="decorator" />
    	</mapper>
    </decorator-mappers>
    ....
  • excludes
    특정 웹 페이지(jsp)들을 모아 decoration이 적용되지 않도록 하는 설정파일을 지정한다.
    <excludes file="/WEB-INF/decorators.xml"/>
  • property
    변수화하여 쉽게 사용할 수 있도록 한다.
    <property name="decorators-file" value="/WEB-INF/decorators.xml" />
    ...
    <excludes file="${decorators-file}" />
    ...
    <mapper class="com.opensymphony.module.sitemesh.mapper.ConfigDecoratorMapper">
    	<param name="config" value="${decorators-file}" />
    </mapper>

ConfigDecoratorMapper는 decorator 파일들을 config로 지정할 수 있음을 의미하며, 여러 개의 config 파일을 포함할 수 있다.



SiteMesh 구조와 흐름

  1. request 단계
    모든 request는 PageFilter에서 가로채어진다. PageFilter는 Context 초기화 시점에 decorator.xml에 정의된 <exclude> 태그에 따라 요청된 request의 url-pattern에 따라 장식을 수행할지 여부를 결정한다.
  2. paring 단계
    PageFilter는 요청된 자원에 대한 웹 어플리케이션의 수행결과를 do(request, respose) 메소드를 호출하여 받아낸다. 응답 파라미터에는 ServletResponse가 아닌 HttpServletResponseWrapper를 상속받아 확장한 PageResponseWrapper 객체를 사용한다.
    따라서 페이지 아웃풋은 writer로 보내지 않고 content-type에 따라 선택된 파서가 PageResponseWrapper에서 캡처된 page 아웃풋 데이터를 파싱한다. 현재는 반환 page의 content-type이 text/html일 경우만 FastPageParser가 작동한다.
  3. decorator 선정 단계
    적합한 decorator를 결정한다. 이 과정은 mapper 클래스의 getDecorator()에 의해서 이뤄진다. 처음 decorator 선정을 시도한 mapper 클래스가 적합한 decorator를 얻어낸다면 리턴하고, 아니면 decorator 체인상의 상위 링크의 getDecorator() 메소들르 호출하게 된다. 정확한 decorator가 결정될 때까지 반복된다.
  4. decorator 단계
    decorator를 얻오고, decorator로부터 decorator page를 구해 올 수 있다면, PageFilter는 applyDecorator()내에서 decorator 페이지에 대한 요청을 생성하고, decorator page는 FastPageParser에 의해 파싱된 결과 page의 적절한 부분들을 커스텀 태그를 통해 가져와 출력 페이지를 작성한다.

출처 - http://knight76.tistory.com/entry/30021375355


'FRAMEWORK > SITEMESH' 카테고리의 다른 글

SiteMash 적용  (0) 2014.11.04
Tag References  (0) 2014.11.04
sitemesh 정리  (0) 2014.09.25
sitemesh mapper  (0) 2014.09.25
: