明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線(xiàn)學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

用Struts完成模板

[摘要]如果不用框架來(lái)開(kāi)發(fā)一個(gè)門(mén)戶(hù)站點(diǎn)將會(huì)是一件很困難的事。使用模版可以減少些麻煩。他可以讓你在眨眼之間方便的更新與部署站點(diǎn)上的內(nèi)容。用Struts模版標(biāo)簽可以幫助你開(kāi)發(fā)以模版為基礎(chǔ)的門(mén)戶(hù)站點(diǎn)。這篇文章解釋了與門(mén)戶(hù)有關(guān)的一些基本的模版思想,介紹了Struts對(duì)于模版的支持,圍繞著Struts模版標(biāo)簽進(jìn)行了...
如果不用框架來(lái)開(kāi)發(fā)一個(gè)門(mén)戶(hù)站點(diǎn)將會(huì)是一件很困難的事。使用模版可以減少些麻煩。他可以讓你在眨眼之間方便的更新與部署站點(diǎn)上的內(nèi)容。用Struts模版標(biāo)簽可以幫助你開(kāi)發(fā)以模版為基礎(chǔ)的門(mén)戶(hù)站點(diǎn)。
這篇文章解釋了與門(mén)戶(hù)有關(guān)的一些基本的模版思想,介紹了Struts對(duì)于模版的支持,圍繞著Struts模版標(biāo)簽進(jìn)行了討論。本文還闡述了其他的一些模版機(jī)制。

獲得Struts
網(wǎng)絡(luò)應(yīng)用程序框架使用MVC模式,能簡(jiǎn)化網(wǎng)絡(luò)站點(diǎn)的開(kāi)發(fā)。Struts正是這樣的一個(gè)框架。它提供了類(lèi)集、標(biāo)簽庫(kù)和一些能作為Web開(kāi)發(fā)基礎(chǔ)的接口。Struts是Jakarta-Apache論壇下的一個(gè)開(kāi)源項(xiàng)目。

和所有Jakarta的項(xiàng)目一樣,Struts提供原代碼和二進(jìn)制程序的下載。這篇文章里,我們使用Struts的1.1b2版本。雖然這不是一個(gè)正式的版本,但這個(gè)版本比起1.0.2版有許多重大的改進(jìn)。

首先,解壓縮二進(jìn)制程序到你所指定的目錄。會(huì)有一個(gè)名為jakarta-struts-1.1-b2的目錄創(chuàng)建。在它之下有兩個(gè)子目錄,分別為lib和webapps。Lib目錄包含我們所需要的所有庫(kù)、DTD文件、TLD文件(標(biāo)簽庫(kù)定義),我們需要把它們添加到應(yīng)用程序的classpath中。Webapps目錄包含了許多.war(web程序包)文件。這些可安裝運(yùn)行的war文件可以放到任意servlet容器的webapps目錄中。我們使用Tomcat作為servlet容器。

模板基礎(chǔ)
我們通過(guò)模版可以創(chuàng)建很多結(jié)構(gòu)相似的東西。模版幫助我們將會(huì)改變的東西歸檔打包,避免許多重復(fù)的工作。這對(duì)創(chuàng)建網(wǎng)絡(luò)應(yīng)用程序的確是一件很方便的事情。

在大多數(shù)的網(wǎng)絡(luò)應(yīng)用程序中,經(jīng)常需要更換的是內(nèi)容。JSP很容易做到這一點(diǎn)。因?yàn)镴SP默認(rèn)提供一個(gè)include機(jī)制——<jsp:include>標(biāo)簽。因此一個(gè)標(biāo)準(zhǔn)頁(yè)面可以通過(guò)改變include文件來(lái)改變它的內(nèi)容。但是我們?cè)趺茨苋绱朔奖愕母淖円粋(gè)頁(yè)面的布局呢?當(dāng)我們需要改變的不僅僅是頁(yè)面的內(nèi)容,還包括這個(gè)頁(yè)面的布局時(shí)情況會(huì)怎么樣呢?我們等會(huì)就會(huì)回答這些問(wèn)題。

用Java提供的布局管理機(jī)制可以幫我們更形象的理解這些問(wèn)題。Java提出了布局管理器、組件、容器的概念來(lái)創(chuàng)建圖形界面的應(yīng)用程序。

當(dāng)容器中的組件改變時(shí),布局管理器會(huì)決定怎么樣將新的組件部署到容器中。此外,容器本身也可以做為其他容器的組件從而實(shí)現(xiàn)了嵌套。在一些簡(jiǎn)單的情況下,JSP就可以做為一個(gè)網(wǎng)絡(luò)應(yīng)用程序的模版,其功能就等價(jià)于布局管理器。模版隱藏了web頁(yè)面布局的實(shí)現(xiàn)方法。換句話(huà)說(shuō),它隱藏了布局的法則。假如布局法則需要改變,那么這些改變將回受限于模版。Web頁(yè)面通過(guò)實(shí)現(xiàn)這個(gè)模版來(lái)做其內(nèi)容上的改變。

如果模版等價(jià)于布局管理器,那相應(yīng)的容器和組件又是什么呢?相應(yīng)的組件就是實(shí)際的內(nèi)容文件:JSP文件、HTML文件、圖象文件等等。容器將這些可見(jiàn)的組件聚集在一個(gè)單元里。一個(gè)JSP文件就是一個(gè)容器。容器需要關(guān)于模版的信息來(lái)部署這些組件。用Java GUI舉例來(lái)說(shuō),一個(gè)面板(容器,集合單元)可以包含按鈕和文本區(qū)(組件和內(nèi)容),使用一個(gè)網(wǎng)格布局管理器(GridLayout)來(lái)部署這些組件。

現(xiàn)在我們可以來(lái)回答先前提出的那個(gè)問(wèn)題了。我們知道模版集成了布局法則,當(dāng)要改變布局是,我們要做的僅僅改變模版。這些改變會(huì)一起相關(guān)頁(yè)面布局的改變,而不需要去改變這些頁(yè)面本身。在門(mén)戶(hù)應(yīng)用程序中,這就意味著當(dāng)大量頁(yè)面需要采用同樣布局時(shí)在時(shí)間上的節(jié)省。

Struts用三個(gè)模版標(biāo)簽來(lái)實(shí)現(xiàn)模版。

插入標(biāo)簽InsertTag——<template:insert>。
在容器/集合單元文件(collecting unit file)中使用。它定義了當(dāng)前容器要使用的模版。類(lèi)似于Java GUI中的container.setLayout(layout)方法。在它之后用<template:put>標(biāo)簽定義組件。

放入標(biāo)簽PutTag——<template:put>。
在容器/集合單元文件(collecting unit file)中使用。他定義了組成容器/集合單元的組件/內(nèi)容。它類(lèi)似于Java GUI中的container.add(component)方法。每個(gè)PutTag標(biāo)簽必須有一個(gè)相關(guān)組件的名稱(chēng)。

獲得標(biāo)簽GetTag——<template:get>。
在模版文件中使用。它告訴模版由PutTag標(biāo)簽定義的不同組件的名稱(chēng)。它類(lèi)似于Java GUI中的layout.addLayoutComponent(componentName, component)方法。
一個(gè)簡(jiǎn)單的例子

你可以下載這個(gè)例子。我們將要?jiǎng)?chuàng)建兩套內(nèi)容文件、容器(集合單元)文件以及模版文件。當(dāng)我們有了這些文件后,就可以就可以互換他們的模版,看到他們?cè)诓季稚系母淖儭?br>復(fù)制Struts-blank.war到Tomcat的webapps目錄并且將他改名為template-example.war。重起Tomcat。template-example會(huì)由Tomcat自動(dòng)部署。刪除pages目錄和index.jsp文件。他們與我們的討論暫時(shí)無(wú)關(guān)。

讓我們定義又定義我們自己的內(nèi)容文件做為一個(gè)開(kāi)始。在template-example下建立一個(gè)名為content的目錄,并且在其中創(chuàng)建六個(gè)文件:top1.htm, top2.htm, bottom1.htm, bottom2.htm, middle1.jsp, and middle2.jsp。
放入什么文件是取決于你的,但是對(duì)于初學(xué)者,靜態(tài)的.htm文件更容易理解。舉個(gè)例子來(lái)說(shuō),top.htm包括以下的內(nèi)容:

This is the <b>TOP</b> Content for the <b>First</b>
example. This is a static html file.



類(lèi)似的,middle1.jsp包括如下內(nèi)容:

This is the <b>MIDDLE</b> Content for the <b>First</b>
example. This is a dynamic JSP file and the
current date and time is <%= new Date() %>



定義了內(nèi)容之后,讓我們來(lái)定義兩個(gè)模版。
在template-example下建立名為templates的目錄,并在其下創(chuàng)建兩個(gè)文件template1.jsp和template2.jsp。
這些模版定義了兩種布局方式,如下圖所示。
screen.width-430)this.width=screen.width-430" align=center border=0>
screen.width-430)this.width=screen.width-430" align=center border=0>

我們?nèi)缦聛?lái)定義這兩個(gè)模版:


<%@ taglib uri='/WEB-INF/struts-
template.tld' prefix='template' %>
<html>
<head>
<title><template:get name='title'/>
</title>
</head>
<body>
<table border=1>
<tr>
<td><template:get name='top'/></td>
</tr>
<tr>
<td bgcolor="#FF55FF">
<template:get name='middle'/></td>
</tr>
<tr>
<td><template:get name='bottom'/></td>
</tr>

</body>
</html>
定義 Template 1






<%@ taglib uri='/WEB-INF/struts-
template.tld' prefix='template' %>
<html>
<head>
<title><template:get name='title'/>
</title>
</head>
<body>
<table border=1>
<tr>
<td><template:get name='top'/></td>
<td bgcolor="#FF55FF">
<template:get name='middle'/></td>
<td><template:get name='bottom'/></td>
</tr>

</body>
</html>
定義 Template 2



注意到這兩個(gè)模版定義了兩種布局方式,換句話(huà)說(shuō),它們定義了兩種不同的布局法則。
我們已經(jīng)有了我們自己的內(nèi)容和模版。現(xiàn)在我們需要的是容器文件。在tomcat-example目錄下創(chuàng)建兩個(gè)容器文件分別名為container1.jsp和container2.jsp。容器文件需要包含組件(內(nèi)容)。同樣,容器文件利用template insert和put tags標(biāo)簽來(lái)逐個(gè)定義使用和加入的組件(內(nèi)容)。

讓我們帶著這些概念看一下其中的一個(gè)容器文件(container1.jsp)。

<%@ taglib uri='/WEB-INF/struts-template.tld' prefix='template' %>
<template:insert template='/templates/template1.jsp'>
<template:put name='title' content='Templates' direct='true'/>
<template:put name='top' content='/content/top1.htm' />
<template:put name='middle' content='/content/middle1.jsp' />
<template:put name='bottom' content='/content/bottom1.htm'/>
</template:insert>




我們可以打開(kāi)瀏覽器,輸入http://localhost:8080/template-example/container1.jsp看看這個(gè)文件的實(shí)際輸出。你會(huì)看到如下的頁(yè)面:
screen.width-430)this.width=screen.width-430" align=center border=0>
在這個(gè)頁(yè)面的后面,container1.jsp使用模版template1.jsp來(lái)定義輸出頁(yè)面的布局并且從不同的組件中包含內(nèi)容。注意這里屬性direct的用法<template:put name='title' content='Templates' direct='true'/>。當(dāng)direct設(shè)置為true時(shí),content標(biāo)簽定義的內(nèi)容將會(huì)被直接調(diào)用。它不尋找一個(gè)外部的文件。(When direct is set to true, the content specified by the content attribute is used directly. It is not looked up in an external file.有點(diǎn)疑問(wèn),翻的不好)

Container2類(lèi)似,所不同的只是他使用template2,頁(yè)面輸出如下:
screen.width-430)this.width=screen.width-430" align=center border=0 dypop="按此在新窗口瀏覽圖片">

我們到目前位置所做的工作的優(yōu)點(diǎn)是顯而易見(jiàn)的。舉例來(lái)說(shuō),我們可以用template2替換template1(通過(guò)簡(jiǎn)單的復(fù)制和粘貼用template2.jsp替換template2.js1)。之后container1.jsp會(huì)馬上變成如下的模樣。我們改變了容器的布局卻沒(méi)有碰container1!這就是模版的作用。
screen.width-430)this.width=screen.width-430" align=center border=0 dypop="按此在新窗口瀏覽圖片">
Struts Template vs. Tiles

從Struts 1.1開(kāi)始,引入了另一種模版機(jī)制——Tiles,F(xiàn)在它已經(jīng)成為了模版機(jī)制的一個(gè)主要分支。Tiles機(jī)制定義與Tiles網(wǎng)絡(luò)站點(diǎn)中,并且與Struts定義的模版標(biāo)簽兼容。事實(shí)上,Tiles是模版標(biāo)簽的一個(gè)擴(kuò)展集。那為什么我們要要Tiles來(lái)替代模版呢?

Tiles允許我們傳遞參數(shù),從而對(duì)容器有更多的控制權(quán)。當(dāng)我想使模版和容器具有動(dòng)態(tài)特性時(shí)變的非常有用。此外,Tiles與Struts動(dòng)作組件(Struts action components)結(jié)合的更為緊密。

但是,Tiles會(huì)使代碼變的更為復(fù)雜。而且更為重要的是我們還要花更多的時(shí)間來(lái)掌握它。

結(jié)語(yǔ)
使用模版可以方便你管理網(wǎng)絡(luò)應(yīng)用程序。這篇文章是理解Struts模版的開(kāi)始。這里只介紹了關(guān)于模版的很少的一部分知識(shí),還有很多比如基于角色(role-based)和可選內(nèi)容(optional content)的知識(shí)要靠大家自己去學(xué)習(xí)。希望我的這篇文章能激勵(lì)大家去探索更多的關(guān)于模版的特點(diǎn)。




標(biāo)簽:用Struts完成模板