> Hello World !!!

     

@syaku

스트럿츠2 타일즈 동적으로 사용하기 : Tiles in Struts2

written by Seok Kyun. Choi. 최석균

 스트럿츠2 의 레이아웃을 타일즈로 이용하여 동적으로 구성하기


※ 자바버전 : 1.5
※ 톰캣버전 : 5.5
※ 필요 라이브러리 :
tiles-api-2.0.6.jar
tiles-core-2.0.6.jar
tiles-jsp-2.0.6.jar
struts2-tiles-plugin-2.1.8.1.jar

* 정확히 필요한 라이브러인지는 확인하지 않았지만, 제가 개발중인 라이브러리 폴더에는 위 jar 파일들이있네요.

최근 개인적으로 스트럿츠2를 이용하여 프로젝트를 하나 진행했었다. 지금은 잠시 중단중이지만, 어째든 레이아웃을 동적으로 구현하는 기능을 개발하기 위해 아파치 그룹의 오픈소스 타일즈를 사용하게 되었다. 짧은 지식과 영어 압박에 몇일 삽질했지만, 괜찮은 결과물을 얻은 것 같다.
하지만 내가 원하는 건, 레이아웃을 원하는 영역별로 나눠 유동적으로 호출할 수 있어야 한다는 것 인데. 쉽게 말해 개발자가 전체 레이아웃이 필요한 경우가 있고, 전체 레이아웃이 아닌 바디만 필요할 수도 있기 때문이다. 스트럿츠2와 연동되는 부분이라서 그런지 하나의 레이아웃을 통으로 호출하여 부분부분 가져올 수 가 없다. 음... 좀 더 찾아보면 해답을 얻을지도 모르지만, 현재는 그렇다. 삼천포로 빼졌네.

각 영역별로 유동적으로 변경할 수 있지만, 레이아웃 파일 자체를 바꾸는 건 아직 구현하지 못했다.

** 아래의 소스는 저의 프로젝트에 맞게 설계된 파일입니다. 똑같이 코딩하실 필요는 없습니다. 참고만 하세요.

 WEB-INF 타일즈 설정

  <context-param>
    <param-name> org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG </param-name> 
    <param-value>/WEB-INF/classes/tiles.xml</param-value> 
  </context-param>
  <listener>
    <listener-class>org.apache.struts2.tiles.StrutsTilesListener </listener-class> 
  </listener>


 타일즈 설정 파일 만들기

/WEB-INF/src/tiles.xml 위치한다.

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE tiles-definitions PUBLIC 
  "-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN" 
  "http://tiles.apache.org/dtds/tiles-config_2_0.dtd">


<tiles-definitions>

  <definition name="default" template="/syaku/layouts/default/main.jsp">
    <put-attribute name="title" value="default"/>
    <put-attribute name="init" value="/syaku/common/init.jsp"/>
    <put-attribute name="head" value=""/>
    <put-attribute name="foot" value=""/>
    <put-attribute name="module" value=""/>
    <put-attribute name="module.init" value=""/>
    <put-attribute name="module.js" value=""/>
    <put-attribute name="module.css" value=""/>
  </definition>

</tiles-definitions>

 스트럿츠2 액션에 타일즈 적용하기

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

  <package name="xs.board" extends="struts-default">

    <result-types>
      <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" />
    </result-types>

    <action name="dispBoardView" class="com.syaku.modules.board.BoardView">
      <result name="success" type="tiles">default</result>
    </action>

    <action name="dispBoardList" class="com.syaku.modules.board.BoardList">
      <result name="success" type="tiles">${tiles}</result>
    </action>

    <action name="dispBoardInput" class="com.syaku.modules.board.BoardInput">
      <result name="success" type="tiles">default</result>
    </action>

    <action name="procBoardInput" class="com.syaku.modules.board.BoardProc">
      <result name="success" type="tiles">default</result>
      <result type="stream">
        <param name="inputName">inputStream</param>
        <param name="contentType">text/xml</param>
        <param name="bufferSize">4096</param>
      </result>
    </action>

  </package>

</struts>

 동적 레이아웃 구현하는 클래스

/**
 * @class XSLayout
 * @brief 공용
 *
 * registered date 20090327
 * programmed by Seok Kyun. Choi. (최석균)
 * http://syaku.tistory.com
 */


package com.syaku.core.common;

import java.util.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;
import org.apache.tiles.*;
import org.apache.tiles.access.*;

public class XSLayout {
  private static Logger log = Logger.getLogger(XSLayout.class);

  public HttpServletRequest request;
  public HttpServletResponse response;
  public String layout = "default";

  public XSLayout(HttpServletRequest req,HttpServletResponse res) {
    request = req;
    response = res;
  }

  public void build(HashMap source) throws TilesException {

    TilesContainer container = TilesAccess.getContainer(request.getSession().getServletContext());
    AttributeContext attributeContext = (AttributeContext) container.startContext(request,response);

//    attributeContext.setTemplateAttribute(new Attribute("/syaku/layout/default/main.jsp"));

    Iterator iter = source.keySet().iterator();
    while(iter.hasNext()){
      String target = (String) iter.next();
      String path = (String) source.get(target);
      attributeContext.putAttribute(target, new Attribute(path));
    }

    container.render(layout, request, response);
    container.endContext(request, response);
  }

  public void setLayout(String layout) {
    this.layout = layout;
  }
}
 스트럿츠2 액션 클래스

/**
 * @class BoardAction
 * @brief 게시판 액션
 *
 * registered date 20090327
 * updated date 20090327
 * programmed by Seok Kyun. Choi. (최석균)
 * http://syaku.tistory.com
 */

package com.syaku.modules.board;

import java.util.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.syaku.core.common.*;
import com.syaku.core.process.XSHandler;
import com.syaku.core.util.*;

public class BoardList extends Global {
  // HttpServletRequest , HttpServletResponse 필요
  public XSLayout xsl = new XSLayout(getRequest(),getResponse());
  public HashMap display = new HashMap();

  public String execute() throws Exception {

    // 동적으로 각 영역에 삽입하면 됩니다.
    display.put("head","/syaku/layouts/default/head.jsp");
    display.put("foot","/syaku/layouts/default/foot.jsp");
    display.put("module","/syaku/skins/board/board.list.jsp");
    display.put("module.css","/syaku/skins/board/board.css.jsp");
    xsl.build(display);
    return "success";
  }
}
 html 레이아웃 뷰 파일

타일즈 설정파일 만들기에서 template="/syaku/layouts/default/main.jsp" 파일에 해당한다.
tiles:insertAttribute name="init" = 타일즈 설정파일 만들기의 put-attribute name 과 연관된다.

<%@ page language="java" pageEncoding="UTF-8"%>
<%@taglib uri="/struts-tags" prefix="s" %>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="ko" xml:lang="ko" xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <meta content="X Syaku" name="Generator" />
  <meta content="1.0.0" name="Version" />
  <meta content="Seok Kyun. Choi. (http://syaku.tistory.com)" name="Programmed" />
  <meta content="Copyright ⓒ 2010 Seok Kyun. Choi. All rights reserverd." name="Copyright" />
  <meta content="no" http-equiv="imagetoolbar" />
  
  <title></title>
  <tiles:insertAttribute name="init" />

  <tiles:insertAttribute name="module.js" />
  <tiles:insertAttribute name="module.css" />
</head>

<body>

  <div id="loading" class="loadingArea" style="position: absolute; display:none;">
    <div class="style">
      <div class="contents"></div>
    </div>
  </div>

</head>
<body id="index">
<div id="wrap">

  <div id="header">
    <tiles:insertAttribute name="head" />
  </div>

  <div id="container">

    <div class="snb">
    </div>

    <div id="content">
      <tiles:insertAttribute name="module" />
    </div>
    <div class="clear"></div>

  </div>
  <div id="footer">
    <tiles:insertAttribute name="foot" />
  </div>
</div>
</body>
</html>

posted syaku blog


http://syaku.tistory.com