本篇文章簡單地介紹一下在struts中使用tiles的問題。
1、tiles框架簡介:
大家在編程實踐中都會對代碼重用有一些切身體會,Web頁面的制作當然也不例外。比如:做一個網站,大部分頁面都是由頁頭、主體頁及版權頁組成。其中,頁頭及版權頁的內容是不變的,而每頁的主體內容頁則是不相同的。根據代碼重用的要求,我們不應該在每頁重寫頁頭及版權頁的代碼。Jsp也的確給我們提供了靜態和動態包含的方式讓我們來重用這些代碼,也就是通過
和
的形式來達到代碼重用的目的。但不幸的是:無論采用上述那種形式,都存在一些不盡如人意的地方。如,你如果用這些方式從事過國際化編程,你將會為字符集的問題搞得無所適從。為了解決這些問題,一個名為tiles的框架應運而生。所謂tile,其實就是網頁中的一個區域。Tiles框架有如下一些特點:
具有模板能力
能動態構建和裝載頁面
屏幕定義
對tile和布局的重用支持
支持國際化
從tiles框架的發展歷史來看,它開始并不是struts的組成部分。正如我們在本系列的第一篇所說的那樣:"它對其他技術和框架顯示出很好的融合性"。現在,它已經成為struts的基本組成部分之一。
2、在struts中使用tiles框架的條件
首先,確保如下一些文件在應用程序的WEB-INF/lib目錄中:
commons-digester.jar
commons-beanutils.jar
commons-collections.jar
commons-logging.jar |
其次,還要將tiles的tld文件struts-tiles.tld以及struts-template.tld放在應用程序的WEB-INF目錄中。這里順便對本系列前面一些文章中讀者提出的問題做一些解釋:
本系列文章的每個選題都是根據筆者在論壇中收集的一些熱點問題,結合自己開發的一些項目(有很多就是為了便于初學者的理解將實際項目做一些適當的簡化)寫成的。因為對那些包之類的文件對那個主題是必須的往往沒有足夠的時間來一一加以驗證,有時寫多了,有時又寫掉了。
所以,有些讀者反映照著文章介紹的步驟不能得到正確的結果。首先,在此向這些讀者表示歉意,筆者以后會盡量注意一些。說實在的,要完全避免也有困難,畢竟寫這些東西只是業余的事情,筆者還有許多本職工作要干,請大家原諒。有一個折中的方案就是:讀者在明白基本原理之后采用諸如jbx之類的開發工具,這樣在很大程度上可以避免這些問題的干擾,畢竟正常開發大多還是要使用這些工具的,熟悉它們也沒有什么壞處。
3、使用tiles構建網頁的過程
下面,我們通過構建一個本篇開頭提及的那種簡單頁面來體會一下tiles構建網頁的過程。
首先,在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> |
其次,創建tiles-defs.xml文件,并把它放在應用程序的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> |
再次,創建一個名為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 標簽中的attribute屬性值
是由tiles-defs.xml中定義的邏輯名來表示的 |
這為基于該模板的網頁動態地裝入tile奠定了基礎。最后,創建幾個用于實驗的.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> |
這是頁頭部分
body.jsp的代碼如下:
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<title>
body
</title>
</head>
<body bgcolor="#ffffff">
<h1> |
這是內容部分
body2.jsp的代碼如下:
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<title>
body
</title>
</head>
<body bgcolor="#ffffff">
<h1> |
這是內容部分2
right.jsp的代碼如下:
<%@ page contentType="text/html; charset=UTF-8" %>
<html>
<head>
<title>
right
</title>
</head>
<body bgcolor="#ffffff">
<h1> |
這是版權頁
4、演示tiles的使用效果
為此,我們還要建兩個.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> |
從這兩個文件可以看出:
文件的布局是與模板相對應,而這兩個文件的body部分則對應著不同的.jsp文件。可以想象,如果要對頁頭和版權信息做修改,只要對header.jsp和right.jsp做相應的修改,則修改的結果則會反映到page1.jsp和page2.jsp頁面上。
以上,只是對tiles的使用做了一個簡單的介紹,它還有其他一些特征如:tile的定義可以擴展等等,值得大家深入探討。至于上面各種文件中出現的一些標簽,大多可以從標簽本身看出其含義,實在不清楚的也可以參考這方面的有關資料,如果詳細在這里講解這些東西會顯得冗長乏味。
現在,如果您在瀏覽器中輸入:http://127.0.0.1:8080/mystruts/page1.jsp就可以看到網頁效果了;對比輸入:http://127.0.0.1:8080/mystruts/page2.jsp 看看網頁的變化。就可以體會到使用tiles框架的作用了。
下一篇文章,筆者準備介紹一下用tiles框架構建frame形式的網頁的問題。之所以準備寫它們是因為frame形式的網頁應用還是比較廣泛,而且筆者發現這方面的參考文獻比較少見。另外,本系列第八篇發表后,就有讀者來信提出過這樣的要求,希望整理出來的東西能對這部分讀者有所幫助。
參考文獻:
《Programming Jakarta Struts》Chuck Cavaness著