Dev/Struts

Struts2 - tiles

창문닦이 2019. 3. 28. 10:41

 Tiles 

페이지 레이아웃을 위한 프레임워크. 스프링에서도 제공한다. 요새는 부트스트랩을 사용해서 틀을 가져다가 쓴다. 뜯어보면 다 tiles 를 사용하는 것이다. 반복적으로 사용되는 header와 footer를 매 페이지마다 include를 시키게 되면 나중에 그 파일이 변경되었을 때 오류가 발생할 수 있다. 이를 예방하기 위해 Tiles는 레이아웃을 지원해준다.



1. 클라이언트의 요청을 받아 컨트롤러가 어떤 Action의 메소드로 가야할지 알려준다.

2. 이 때, Action의 실행전/후 모두 Interceptor를 거치게 된다(filter와 같은 역할).

3. Action은 실행 후 결과를 반환하는데 Result type=”tiles”로 가라고 알려준다.

4. Interceptor에서 Plugin인 web.xml에 정의 되어있는 listener에게 이 이벤트(Result type=”tiles”)에 대하여 알려준다.

5. Listener는 현재 tiles.xml을 받아서 Plugin에게 알려준다.

6. 그 Plugin은 tiles.xml 에 정의 되어 있는 각각의 정의 문서를 통해서 적절할 페이지로 이동시킨다.

(web.xml에서 tiles-definitions으로 정의하고 있는 그 문서를 참조하기 위한 event listener를 반드시 정의해줘야 한다.)

참조: https://thinkingblog.tistory.com/19 [생각하는 블로그]

1. 필요 라이브러리

tiles는 구현할 모든 페이지를 다 만들어놓고 놓은 뒤 적용하는 것이 덜 복잡하다.

2. web.xml 에 리스너 등록

<listener>

<listener-class>org.apache.struts2.tiles.StrutsTilesListener</listener-class>

</listener>

3. jsp 파일 생성

1. data폴더 생성 후 공통적으로 적용될 스타일시트 생성

2. layout폴더 생성 후 jsp 생성

3. main.jsp생성

4. tiles.xml 생성

3-1. layout.jsp 생성

<%@ page contentType="text/html; charset=UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%@ taglib prefix="tiles" uri="http://tiles.apache.org/tags-tiles"%>

<%

request.setCharacterEncoding("UTF-8");

String cp = request.getContextPath();

%>

<!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>Insert title here</title>

<link rel="stylesheet" href="<%=cp %>/data/style.css" type="text/css" />

</head>

<body>

<table width="700" align="center">

<tr height="50">

<td><tiles:insertAttribute name="header"/></td>

</tr>

<tr height="350" valign="top">

<td><tiles:insertAttribute name="body"/></td>

</tr>

<tr height="50">

<td><tiles:insertAttribute name="footer"/></td>

</tr>

</table>

</body>

</html>

3-2. header.jsp 생성

<%@ page contentType="text/html; charset=UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%

request.setCharacterEncoding("UTF-8");

String cp = request.getContextPath();

%>

<a href="<%=cp%>/main.action">메인</a>

<a href="<%=cp%>/bbs/list.action">게시판</a>

3-3. footer.jsp 생성

<%@ page contentType="text/html; charset=UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<%

request.setCharacterEncoding("UTF-8");

String cp = request.getContextPath();

%>

<p align="center">

자바 프레임 워크

</p>

4. tiles.xml 등록 (web.xml 경로와 동일해야 함)

layout/layout.jsp가 기본 탬플릿에 해당한다. header, body, footer의 이름에 해당하는 곳에 각각의 jsp를 집어넣도록 정의

<?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="mainLayout" template="/layout/layout.jsp">

  <put-attribute name="header" value="/layout/header.jsp" />

  <put-attribute name="body" value="/main.jsp"/>

  <put-attribute name="footer" value="/layout/footer.jsp"/>

</definition>

</tiles-definitions>

5. struts.xml에 tiles.xml을 찾아가도록 경로 지정

namespace를 / 로 주어 주소작성시 /가 반드시 들어가므로 항상 실행이 되게 설정하였다.

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

 <!-- Configuration for the default package. -->

  <package name="default" extends="struts-default" namespace="" >       

      <global-results>

          <result name="error">/exception/error.jsp</result>

      </global-results>

 </package>

 <package name="main" extends="struts-default" namespace="/" >

 <result-types>

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

 </result-types>

 <action name="main">

  <result type="tiles">mainLayout</result><!-- 여기서 mainLayout은 tiles의 definition에 해당 -->

 </action>

 </package>  

 <include file="struts-test.xml"/>

 <include file="struts-board.xml"/>

 <include file="struts-inter.xml"/>

 <include file="struts-chain.xml"/>

 <include file="struts-fileTest.xml"/>

 <include file="struts-imageTest.xml"/>

 <include file="struts-member.xml"/>

</struts>

출력




1. struts-board.xml 등록

이번에는 게시판을 선택하면 ‘Main 화면’이 출력되는 body에 게시판 페이지가  출력되도록 하고자함

struts-board.xml에 tiles를 사용할 때 알려줘야 함

<?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="board" extends="struts-default" namespace="/bbs" >

<result-types>

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

</result-type>

</result-types>

</package>

</struts>

2. 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="mainLayout" template="/layout/layout.jsp">

  <put-attribute name="header" value="/layout/header.jsp" />

  <put-attribute name="body" value="/main.jsp"/>

  <put-attribute name="footer" value="/layout/footer.jsp"/>

</definition>

<!-- 확장판 -->

<definition name="bbs.listLayout" extends="mainLayout">

<put-attribute name="body" value="/board/list.jsp"/>

</definition>

<definition name="bbs.createdLayout" extends="mainLayout">

<put-attribute name="body" value="/board/created.jsp"/>

</definition>

<definition name="bbs.articleLayout" extends="mainLayout">

<put-attribute name="body" value="/board/article.jsp"/>

</definition>

</tiles-definitions>

3. struts-board.xml 수정

<?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="board" extends="struts-default" namespace="/bbs" >

<!-- tiles 설정 -->

<result-types>

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

</result-type>

</result-types>

   

<!-- 게시글 작성 -->

<action name="created" method="created" class="com.board.BoardAction">

<!-- tiles의 해당되는 name을 찾아가라 -->

<result name="input" type="tiles">bbs.createdLayout</result>

<!-- 작성완료시 반환값이 success -->

<result name="success" type="redirectAction">list</result>

</action>

<!-- 게시판리스트 -->

<action name="list" method="list" class="com.board.BoardAction">

<result name="success" type="tiles">bbs.listLayout</result>

</action>

<!-- 게시글조회 -->

<action name="article" method="article" class="com.board.BoardAction">

<result name="success" type="tiles">bbs.articleLayout</result>

</action>

<!-- 게시글수정 -->

<action name="updated" method="updated" class="com.board.BoardAction">

<result name="input" type="tiles">bbs.createdLayout</result>

<result name="success" type="redirectAction">list?pageNum=${dto.pageNum}&amp;searchKey=${searchKey}&amp;searchValue=${searchValue}</result>

</action>

<!-- 게시글답변 -->

<action name="reply" method="reply" class="com.board.BoardAction">

<result name="input" type="tiles">bbs.createdLayout</result>

<result name="success" type="redirectAction">list?pageNum=${dto.pageNum}&amp;searchKey=${searchKey}&amp;searchValue=${searchValue}</result>

</action>

<!-- 게시글삭제 -->

<action name="deleted" method="deleted" class="com.board.BoardAction">

<result name="success" type="redirectAction">list?pageNum=${dto.pageNum}&amp;searchKey=${searchKey}&amp;searchValue=${searchValue}</result>

</action>

</package>

</struts>


출력


참고

자바는 인터프리터 언어면서 컴파일러 언어이기 때문에 동일한 이름의 스타일시트를 2개를 적용하게 되면 순차적으로 실행되므로

항상 마지막의 스타일이 반영된다. tiles 를 활용하여 작성될 경우 중복되는 html태그와 스타일시트 링크를 확인해야 한다!!