Tiles是一個分割網頁的Library,提供了一個除了使用<jsp:include>之外的JSP組合工具;
透過xml設定檔,將重覆不需變動的頁面分割後定為Template,讓開發人員專注在各個模組中不同的頁面並使其具有組合性。
通常一個頁面基本的格局大概如下圖
這次的Demo就以table來分割而不以div方式來制定,簡單的html如下
<html> <head> <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" /> <title></title> </head> <body> <table> <tr> <td colspan="2">Header</td> </tr> <tr> <td>Menu</td><td>Body</td> </tr> <tr> <td colspan="2">Footer</td> </tr> </table> </body> </html>
寫成JSP的include大概會變成下面這樣
<%@ page language="java" pageEncoding="UTF-8"%> <html> <head> <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" /> <title></title> </head> <body> <table> <tr> <td colspan="2"><jsp:include file="/WEB-INF/jsp/common/header.jsp"></jsp:include></td> </tr> <tr> <td><jsp:include file="/WEB-INF/jsp/common/menu.jsp"></jsp:include></td><td>Body</td> </tr> <tr> <td colspan="2"><jsp:include file="/WEB-INF/jsp/common/footer.jsp"></jsp:include></td> </tr> </table> </body> </html>
看起來還不錯,但是個一個jsp都必需重覆include header,menu,footer這三個jsp,而且萬一哪天出了什麼事,例如要加個ad在畫面的最右側,那所有的jsp都必需要被修正.....嗯,如果以部份認為PG死不完,班是應該的管理人員來看,也許也不是什麼大事吧....
但是Tiles提供了一個反其道而行的方式,先要求我們產生一個基本的jsp做為layout,將header,menu,body,footer當成是變數,再利用xml設定每個變數是要指到哪一個jsp,就讓我們一步一步看下去(。。。有點藍色xx網的感覺
(1)Library
先在pom.xml中加入要使用的library,如果僅是使用基本的tiles功能,只要加入一項即可
<dependency>
<dependency> <groupid>org.apache.tiles</groupid> <artifactid>tiles-jsp</artifactid> <version>2.2.2</version> </dependency>
(2)建立Template Layout JSP -- layout.jsp
簡單來說,就是利用tiles:insertAttribute來取代jsp:include
加入ignore="true"代表可以不給值。
<%@ include file="/WEB-INF/jsp/common/base.jsp"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta content="text/html; charset=UTF-8" http-equiv="Content-Type" /> <title><tiles:insertattribute ignore="true" name="title"></tiles:insertattribute></title> </head> <body> <table> <tr> <td colspan="2"><tiles:insertattribute name="header"> </tiles:insertattribute></td> </tr> <tr> <td><tiles:insertattribute name="menu"></tiles:insertattribute></td><td><tiles:insertattribute name="body"></tiles:insertattribute></td> </tr> <tr> <td colspan="2"><tiles:insertattribute name="footer"></tiles:insertattribute></td> </tr> </table> </body> </html>
(3)設定Tiles的Template XML -- 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> <!--採用/WEB-INF/jsp/common/layout.jsp做為基本版型,--> <definition name="base.definition" template="/WEB-INF/jsp/common/layout.jsp"> <put-attribute name="title" value=""> </put-attribute><put-attribute name="header" value="/WEB-INF/jsp/common/header.jsp"> </put-attribute><put-attribute name="menu" value="/WEB-INF/jsp/common/menu.jsp"> </put-attribute><put-attribute name="body" value=""> </put-attribute><put-attribute name="footer" value="/WEB-INF/jsp/common/footer.jsp"> </put-attribute></definition> <!-- 延用基本版型,改變title與body的值 --> <definition name="hello" extends="base.definition"> <put-attribute name="title" value="Say Hello to Tiles"> </put-attribute><put-attribute name="body" value="/WEB-INF/jsp/helloTiles.jsp"> </put-attribute></definition> </tiles-definitions>
而其中/WEB-INF/jsp/common/下的header.jsp,menu.jsp,footer.jsp,helloTiles.jsp就隨你寫入內容囉
(4)更改SpringMVC 的ViewReslover -- spring-servlet.xml
將先前採用的JstlView改為TilesView,並加入tilesConfigurer指定tiles設定檔
<bean class="org.springframework.web.servlet.view.UrlBasedViewResolver" id="viewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView"> </property></bean> <bean class="org.springframework.web.servlet.view.tiles2.TilesConfigurer" id="tilesConfigurer"> <property name="definitions"> <list> <value>/WEB-INF/tiles.xml</value> </list> </property> </bean>
這樣就完成最簡單的SpringMVC與Tiles設定囉
沒有留言:
張貼留言