Whiteship's Note

스프링 MVC에서 타일즈 2 사용하기

Good Tools : 2009. 5. 1. 19:10


참조: http://richardbarabe.wordpress.com/2009/02/23/apache-tiles-2-integration-with-spring-mvc/

오늘은 노동자의 날(?)이라 쉬는 사람들이 많은데도 출근한 성윤군이랑 열심히 타일즈를 적용하고 있습니다. 아파치 타일즈 2 홈페이지, 프로 스프링 2.5, 스프링 3.0 레퍼런스를 보면서 적용했지만... 잘 안되더군요.  결국은 위 블로거가 제공하는 패치를 사용해서 해결했습니다.

0. pom.xml에 Tiles 라이브러리 추가하기

        <!-- tiles -->
        <dependency>
            <groupId>org.apache.tiles</groupId>
            <artifactId>com.springsource.org.apache.tiles</artifactId>
            <version>2.1.2.osgi</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tiles</groupId>
            <artifactId>com.springsource.org.apache.tiles.core</artifactId>
            <version>2.1.2.osgi</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tiles</groupId>
            <artifactId>com.springsource.org.apache.tiles.servlet</artifactId>
            <version>2.1.2</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tiles</groupId>
            <artifactId>com.springsource.org.apache.tiles.jsp</artifactId>
            <version>2.1.2</version>
        </dependency>

1. xxx-servlet.xml에 TilesConfigurer 추가하기

    <!-- ============================================================= -->
    <!--  Tiles                                                        -->
    <!-- ============================================================= -->
    <bean id="tilesConfigurer" class="springsprout.web.SpringTilesConfigurer">
        <property name="definitions">
            <list>
                <value>/WEB-INF/tiles/general-layout.xml</value>
                <value>/WEB-INF/tiles/tiles-content.xml</value>
            </list>
        </property>
    </bean>

2. xxx-servlet.xml에 뷰 리졸버 추가하기

    <bean id="tilesViewResolver"
        class="org.springframework.web.servlet.view.UrlBasedViewResolver"
        p:viewClass="org.springframework.web.servlet.view.tiles2.TilesView" />

3. 타일즈 설정 파일 추가하기

위 설정대로 /WEB-INF/ 밑에 tiles라는 폴더를 만들고 그 안에 파일 두 개를 만들어 줍니다.

저희는 제일 간단한 3단 구조로 설정했습니다.

general-layout.xml
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
       "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
<tiles-definitions>
    <definition name=".root" template="jsp/root.jsp">
        <put-attribute name="header" value="/jsp/layout/header.jsp" />
        <put-attribute name="footer" value="/jsp/layout/footer.jsp" />
    </definition>
</tiles-definitions>

tiles-content.xml
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE tiles-definitions PUBLIC
       "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN"
       "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
<tiles-definitions>
    <definition name="index" extends=".root">
        <put-attribute name="content" value="/jsp/index.jsp" />
    </definition>

    <definition name="login" extends=".root">
        <put-attribute name="content" value="/jsp/login/login.jsp" />
    </definition>
</tiles-definitions>

general-layout.xml은 그야말로 템플릿 레이아웃이고 이 레이아웃을 tiles-context.xml에 상속 받아서 사용합니다. 이렇게 해야 설정을 최소화 할 수 있겠죠. 불편한 거 하나는.. 모든 뷰를 명시적으로 저렇게 설정이 한 덩어리씩 추가가 되어야 한다는 거죠. 이걸 CoC로 어떻게 간편화 할 수 없을지 고민입니다. 타일즈에서 만들어 주세요~

4. 템플릿 만들기

general-layout.xml에 정의한 root.jsp, header,jsp, footer.jsp, empty.jsp 파일을 만듭니다. 이 JSP 페이지가 기본 레이아웃을 그리는 JSP 페이지입니다.

roo.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml" lang="en">
  <head>
    <meta http-equiv="content-type" content="text/html; charset=UTF-8" />
    <title>SpringSprout</title>
    <link href="/css/main.css" media="screen" rel="stylesheet" type="text/css" />
  </head>
<body>
    <div id="main">
        <tiles:insertAttribute name="header"/>
        <tiles:insertAttribute name="content"/>
    </div>
    <tiles:insertAttribute name="footer"/>
</body>
</html>

header.jsp
<div id="header" class="basic">
    <div class="site">
         <div class="logo">
             <a href="/"><img src="images/logo.png" alt="springsprout" /></a>
         </div>
         <div class="actions">
             <a href="/">Home</a>
             <a href="/">Studies</a>
             <a href="/">Seminars</a>
             <a href="/">Blog</a>
             <a href="/">Wiki</a>
             <a href="/">Signup</a>
             <a href="/login.do">Login</a>
         </div>
    </div>
</div>

footer.jsp
<div id="footer">
    <div class="site">
        <h2>Good Bye ~~~!!</h2>
    </div>
</div>

empty.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
<tiles:insertAttribute name="content"/>

끝입니다. 이제 새로운 페이지를 만들 때 마다 헤더와 푸터를 제외하고 몸통 부분만 만들면 됩니다.

5. 패치

1번에서 설정한 tilesConfigurer를 등록하시려면 아래 파일이 필요하실 겁니다.


이 파일을 사용하지 않고 스프링이 제공하는 클래스를 사용하시면 맨 위 링크의 글에 나타나 있는 에러가 발생할 겁니다.

top

  1. Favicon of https://slothink.tistory.com BlogIcon 편현장 2012.06.08 14:44 신고 PERM. MOD/DEL REPLY

    모든 뷰를 명시적으로 저렇게 설정이 한 덩어리씩 추가가 되어야 하는거, 아직도 해결이 안되었을라나요?

  2. 그걸 쓰고 해봤지만 2012.06.21 14:51 PERM. MOD/DEL REPLY

    에러가 결국은 나더라구요 ^^. 아무래도 제 설정의 잘못일 수도 있겠지만 일단은 기존 방식과 같은 에러 메세지이기에 안됐다고 보는걸 1가정으로 두게 되더군요.

    그리고 맞다. tile2 컨트롤 단내에서 sql문 관련에서 db값을 가져올때 주소부터 sql 문까지 안에서만 하면 (가장 원시적인 방법) 문제없이 돌아가지만, 외부에서 선언하여 메소드문만 따올경우나 xml에서 선언한 경우 문제가 발생하더군요.

    뭔가 좋은 방법이 없는지 궁금합니다.

Write a comment.




: 1 : ··· : 533 : 534 : 535 : 536 : 537 : 538 : 539 : 540 : 541 : ··· : 2638 :