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. 필요 라이브러리
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>
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}&searchKey=${searchKey}&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}&searchKey=${searchKey}&searchValue=${searchValue}</result> </action> <!-- 게시글삭제 --> <action name="deleted" method="deleted" class="com.board.BoardAction"> <result name="success" type="redirectAction">list?pageNum=${dto.pageNum}&searchKey=${searchKey}&searchValue=${searchValue}</result> </action> </package> </struts> |
출력
참고
자바는 인터프리터 언어면서 컴파일러 언어이기 때문에 동일한 이름의 스타일시트를 2개를 적용하게 되면 순차적으로 실행되므로
항상 마지막의 스타일이 반영된다. tiles 를 활용하여 작성될 경우 중복되는 html태그와 스타일시트 링크를 확인해야 한다!!
'Dev > Struts' 카테고리의 다른 글
Struts2/Spring2.5/iBatis/Ajax - 댓글 기능을 제공하는 게시판 만들기 (0) | 2019.04.04 |
---|---|
Struts2/Spring2.5/iBatis 셋팅 (0) | 2019.03.28 |
Struts2/iBatis - 이미지 게시판 구현 (0) | 2019.03.26 |
Struts2/iBatis - 회원가입, 로그인, 비밀번호찾기 기능 구현 (0) | 2019.03.26 |
Struts2 - 파일업로드/다운로드/보기 기능 구현 (1) | 2019.03.26 |