本篇文章簡(jiǎn)單地介紹一下在struts中使用tiles的問題。
1、tiles框架簡(jiǎn)介:
大家在編程實(shí)踐中都會(huì)對(duì)代碼重用有一些切身體會(huì),Web頁(yè)面的制作當(dāng)然也不例外。比如:做一個(gè)網(wǎng)站,大部分頁(yè)面都是由頁(yè)頭、主體頁(yè)及版權(quán)頁(yè)組成。其中,頁(yè)頭及版權(quán)頁(yè)的內(nèi)容是不變的,而每頁(yè)的主體內(nèi)容頁(yè)則是不相同的。根據(jù)代碼重用的要求,我們不應(yīng)該在每頁(yè)重寫頁(yè)頭及版權(quán)頁(yè)的代碼。Jsp也的確給我們提供了靜態(tài)和動(dòng)態(tài)包含的方式讓我們來重用這些代碼,也就是通過
和
的形式來達(dá)到代碼重用的目的。但不幸的是:無論采用上述那種形式,都存在一些不盡如人意的地方。如,你如果用這些方式從事過國(guó)際化編程,你將會(huì)為字符集的問題搞得無所適從。為了解決這些問題,一個(gè)名為tiles的框架應(yīng)運(yùn)而生。所謂tile,其實(shí)就是網(wǎng)頁(yè)中的一個(gè)區(qū)域。Tiles框架有如下一些特點(diǎn):
具有模板能力
能動(dòng)態(tài)構(gòu)建和裝載頁(yè)面
屏幕定義
對(duì)tile和布局的重用支持
支持國(guó)際化
從tiles框架的發(fā)展歷史來看,它開始并不是struts的組成部分。正如我們?cè)诒鞠盗械牡谝黄f的那樣:"它對(duì)其他技術(shù)和框架顯示出很好的融合性"。現(xiàn)在,它已經(jīng)成為struts的基本組成部分之一。
2、在struts中使用tiles框架的條件
首先,確保如下一些文件在應(yīng)用程序的WEB-INF/lib目錄中:
commons-digester.jar
commons-beanutils.jar
commons-collections.jar
commons-logging.jar |
其次,還要將tiles的tld文件struts-tiles.tld以及struts-template.tld放在應(yīng)用程序的WEB-INF目錄中。這里順便對(duì)本系列前面一些文章中讀者提出的問題做一些解釋:
本系列文章的每個(gè)選題都是根據(jù)筆者在論壇中收集的一些熱點(diǎn)問題,結(jié)合自己開發(fā)的一些項(xiàng)目(有很多就是為了便于初學(xué)者的理解將實(shí)際項(xiàng)目做一些適當(dāng)?shù)暮?jiǎn)化)寫成的。因?yàn)閷?duì)那些包之類的文件對(duì)那個(gè)主題是必須的往往沒有足夠的時(shí)間來一一加以驗(yàn)證,有時(shí)寫多了,有時(shí)又寫掉了。
所以,有些讀者反映照著文章介紹的步驟不能得到正確的結(jié)果。首先,在此向這些讀者表示歉意,筆者以后會(huì)盡量注意一些。說實(shí)在的,要完全避免也有困難,畢竟寫這些東西只是業(yè)余的事情,筆者還有許多本職工作要干,請(qǐng)大家原諒。有一個(gè)折中的方案就是:讀者在明白基本原理之后采用諸如jbx之類的開發(fā)工具,這樣在很大程度上可以避免這些問題的干擾,畢竟正常開發(fā)大多還是要使用這些工具的,熟悉它們也沒有什么壞處。
3、使用tiles構(gòu)建網(wǎng)頁(yè)的過程
下面,我們通過構(gòu)建一個(gè)本篇開頭提及的那種簡(jiǎn)單頁(yè)面來體會(huì)一下tiles構(gòu)建網(wǎng)頁(yè)的過程。
首先,在struts-config.xml中加入tiles插件,代碼如下:
<plug-in className="org.apache.struts.tiles.TilesPlugin">
<set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml" />
</plug-in> |
其次,創(chuàng)建tiles-defs.xml文件,并把它放在應(yīng)用程序的WEB-INF目錄下,其代碼如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tiles-definitions PUBLIC "-
//Apache Software Foundation
//DTD Tiles Configuration 1.1
//EN" "http://jakarta.apache.org/struts/dtds/tiles-config_1_1.dtd">
<tiles-definitions>
<definition name="testLayout" path="/testLayout.jsp">
<put name="title" value="my tiles test" />
<put name="header" value="/header.jsp" />
<put name="body" value="/body.jsp" />
<put name="footer" value="/right.jsp" />
</definition>
</tiles-definitions> |
再次,創(chuàng)建一個(gè)名為testLayout.jsp的布局模板文件,代碼如下:
<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles"%>
<html>
<head>
<title><tiles:get name="title"/>
</title>
</head>
<body>
<table>
<tr>
<td height="80" width="778" bgcolor="#aa0000">
<tiles:insert attribute="header"/>
</td>
</tr>
<tr>
<td height="360" width="778" bgcolor="#00aa00">
<tiles:insert attribute="body"/>
</td>
</tr>
<tr>
<td height="80" width="778" bgcolor="#0000aa">
<tiles:insert attribute="footer"/>
</td>
</tr>
</table>
</body>
</html> |
從該文件的代碼可以看出:
<tiles:insert 標(biāo)簽中的attribute屬性值
是由tiles-defs.xml中定義的邏輯名來表示的 |
這為基于該模板的網(wǎng)頁(yè)動(dòng)態(tài)地裝入tile奠定了基礎(chǔ)。最后,創(chuàng)建幾個(gè)用于實(shí)驗(yàn)的.jsp文件,它們包括header.jsp、body.jsp、body2.jsp以及right.jsp。
header.jsp的代碼如下:
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<title>
header
</title>
</head>
<body bgcolor="#ffffff">
<h1> |
這是頁(yè)頭部分
body.jsp的代碼如下:
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<title>
body
</title>
</head>
<body bgcolor="#ffffff">
<h1> |
這是內(nèi)容部分
body2.jsp的代碼如下:
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<title>
body
</title>
</head>
<body bgcolor="#ffffff">
<h1> |
這是內(nèi)容部分2
right.jsp的代碼如下:
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<title>
right
</title>
</head>
<body bgcolor="#ffffff">
<h1> |
這是版權(quán)頁(yè)
4、演示tiles的使用效果
為此,我們還要建兩個(gè).jsp文件,它們分別名為:page1.jsp和page2.jsp
其中,page1.jsp的代碼如下:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %>
<tiles:insert page="/testLayout.jsp" flush="true">
<tiles:put name="title" content="My first page" direct="true"/>
<tiles:put name="header" value="/header.jsp"/>
<tiles:put name="body" value="/body.jsp"/>
<tiles:put name="footer" value="/right.jsp"/>
</tiles:insert> |
page2.jsp的代碼如下:
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib uri="/WEB-INF/struts-tiles.tld" prefix="tiles" %>
<tiles:insert page="/testLayout.jsp" flush="true">
<tiles:put name="title" content="My second page" direct="true"/>
<tiles:put name="header" value="/header.jsp"/>
<tiles:put name="body" value="/body2.jsp"/>
<tiles:put name="footer" value="/right.jsp"/>
</tiles:insert> |
從這兩個(gè)文件可以看出:
文件的布局是與模板相對(duì)應(yīng),而這兩個(gè)文件的body部分則對(duì)應(yīng)著不同的.jsp文件。可以想象,如果要對(duì)頁(yè)頭和版權(quán)信息做修改,只要對(duì)header.jsp和right.jsp做相應(yīng)的修改,則修改的結(jié)果則會(huì)反映到page1.jsp和page2.jsp頁(yè)面上。
以上,只是對(duì)tiles的使用做了一個(gè)簡(jiǎn)單的介紹,它還有其他一些特征如:tile的定義可以擴(kuò)展等等,值得大家深入探討。至于上面各種文件中出現(xiàn)的一些標(biāo)簽,大多可以從標(biāo)簽本身看出其含義,實(shí)在不清楚的也可以參考這方面的有關(guān)資料,如果詳細(xì)在這里講解這些東西會(huì)顯得冗長(zhǎng)乏味。
現(xiàn)在,如果您在瀏覽器中輸入:http://127.0.0.1:8080/mystruts/page1.jsp就可以看到網(wǎng)頁(yè)效果了;對(duì)比輸入:http://127.0.0.1:8080/mystruts/page2.jsp 看看網(wǎng)頁(yè)的變化。就可以體會(huì)到使用tiles框架的作用了。
下一篇文章,筆者準(zhǔn)備介紹一下用tiles框架構(gòu)建frame形式的網(wǎng)頁(yè)的問題。之所以準(zhǔn)備寫它們是因?yàn)閒rame形式的網(wǎng)頁(yè)應(yīng)用還是比較廣泛,而且筆者發(fā)現(xiàn)這方面的參考文獻(xiàn)比較少見。另外,本系列第八篇發(fā)表后,就有讀者來信提出過這樣的要求,希望整理出來的東西能對(duì)這部分讀者有所幫助。
參考文獻(xiàn):
《Programming Jakarta Struts》Chuck Cavaness著