用Struts完成模板
發(fā)表時(shí)間:2024-06-13 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]如果不用框架來開發(fā)一個(gè)門戶站點(diǎn)將會(huì)是一件很困難的事。使用模版可以減少些麻煩。他可以讓你在眨眼之間方便的更新與部署站點(diǎn)上的內(nèi)容。用Struts模版標(biāo)簽可以幫助你開發(fā)以模版為基礎(chǔ)的門戶站點(diǎn)。這篇文章解釋了與門戶有關(guān)的一些基本的模版思想,介紹了Struts對(duì)于模版的支持,圍繞著Struts模版標(biāo)簽進(jìn)行了...
如果不用框架來開發(fā)一個(gè)門戶站點(diǎn)將會(huì)是一件很困難的事。使用模版可以減少些麻煩。他可以讓你在眨眼之間方便的更新與部署站點(diǎn)上的內(nèi)容。用Struts模版標(biāo)簽可以幫助你開發(fā)以模版為基礎(chǔ)的門戶站點(diǎn)。
這篇文章解釋了與門戶有關(guān)的一些基本的模版思想,介紹了Struts對(duì)于模版的支持,圍繞著Struts模版標(biāo)簽進(jìn)行了討論。本文還闡述了其他的一些模版機(jī)制。
獲得Struts
網(wǎng)絡(luò)應(yīng)用程序框架使用MVC模式,能簡(jiǎn)化網(wǎng)絡(luò)站點(diǎn)的開發(fā)。Struts正是這樣的一個(gè)框架。它提供了類集、標(biāo)簽庫和一些能作為Web開發(fā)基礎(chǔ)的接口。Struts是Jakarta-Apache論壇下的一個(gè)開源項(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目錄包含我們所需要的所有庫、DTD文件、TLD文件(標(biāo)簽庫定義),我們需要把它們添加到應(yīng)用程序的classpath中。Webapps目錄包含了許多.war(web程序包)文件。這些可安裝運(yùn)行的war文件可以放到任意servlet容器的webapps目錄中。我們使用Tomcat作為servlet容器。
模板基礎(chǔ)
我們通過模版可以創(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)頁面可以通過改變include文件來改變它的內(nèi)容。但是我們?cè)趺茨苋绱朔奖愕母淖円粋(gè)頁面的布局呢?當(dāng)我們需要改變的不僅僅是頁面的內(nèi)容,還包括這個(gè)頁面的布局時(shí)情況會(huì)怎么樣呢?我們等會(huì)就會(huì)回答這些問題。
用Java提供的布局管理機(jī)制可以幫我們更形象的理解這些問題。Java提出了布局管理器、組件、容器的概念來創(chuàng)建圖形界面的應(yīng)用程序。
當(dāng)容器中的組件改變時(shí),布局管理器會(huì)決定怎么樣將新的組件部署到容器中。此外,容器本身也可以做為其他容器的組件從而實(shí)現(xiàn)了嵌套。在一些簡(jiǎn)單的情況下,JSP就可以做為一個(gè)網(wǎng)絡(luò)應(yīng)用程序的模版,其功能就等價(jià)于布局管理器。模版隱藏了web頁面布局的實(shí)現(xiàn)方法。換句話說,它隱藏了布局的法則。假如布局法則需要改變,那么這些改變將回受限于模版。Web頁面通過實(shí)現(xiàn)這個(gè)模版來做其內(nèi)容上的改變。
如果模版等價(jià)于布局管理器,那相應(yīng)的容器和組件又是什么呢?相應(yīng)的組件就是實(shí)際的內(nèi)容文件:JSP文件、HTML文件、圖象文件等等。容器將這些可見的組件聚集在一個(gè)單元里。一個(gè)JSP文件就是一個(gè)容器。容器需要關(guān)于模版的信息來部署這些組件。用Java GUI舉例來說,一個(gè)面板(容器,集合單元)可以包含按鈕和文本區(qū)(組件和內(nèi)容),使用一個(gè)網(wǎng)格布局管理器(GridLayout)來部署這些組件。
現(xiàn)在我們可以來回答先前提出的那個(gè)問題了。我們知道模版集成了布局法則,當(dāng)要改變布局是,我們要做的僅僅改變模版。這些改變會(huì)一起相關(guān)頁面布局的改變,而不需要去改變這些頁面本身。在門戶應(yīng)用程序中,這就意味著當(dāng)大量頁面需要采用同樣布局時(shí)在時(shí)間上的節(jié)省。
Struts用三個(gè)模版標(biāo)簽來實(shí)現(xiàn)模版。
插入標(biāo)簽InsertTag——<template:insert>。
在容器/集合單元文件(collecting unit file)中使用。它定義了當(dāng)前容器要使用的模版。類似于Java GUI中的container.setLayout(layout)方法。在它之后用<template:put>標(biāo)簽定義組件。
放入標(biāo)簽PutTag——<template:put>。
在容器/集合單元文件(collecting unit file)中使用。他定義了組成容器/集合單元的組件/內(nèi)容。它類似于Java GUI中的container.add(component)方法。每個(gè)PutTag標(biāo)簽必須有一個(gè)相關(guān)組件的名稱。
獲得標(biāo)簽GetTag——<template:get>。
在模版文件中使用。它告訴模版由PutTag標(biāo)簽定義的不同組件的名稱。它類似于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í)無關(guān)。
讓我們定義又定義我們自己的內(nèi)容文件做為一個(gè)開始。在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è)例子來說,top.htm包括以下的內(nèi)容:
This is the <b>TOP</b> Content for the <b>First</b>
example. This is a static html file.
類似的,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)容之后,讓我們來定義兩個(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)缦聛矶x這兩個(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è)模版定義了兩種布局方式,換句話說,它們定義了兩種不同的布局法則。
我們已經(jīng)有了我們自己的內(nèi)容和模版,F(xiàn)在我們需要的是容器文件。在tomcat-example目錄下創(chuàng)建兩個(gè)容器文件分別名為container1.jsp和container2.jsp。容器文件需要包含組件(內(nèi)容)。同樣,容器文件利用template insert和put tags標(biāo)簽來逐個(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>
我們可以打開瀏覽器,輸入http://localhost:8080/template-example/container1.jsp看看這個(gè)文件的實(shí)際輸出。你會(huì)看到如下的頁面:
screen.width-430)this.width=screen.width-430" align=center border=0>
在這個(gè)頁面的后面,container1.jsp使用模版template1.jsp來定義輸出頁面的布局并且從不同的組件中包含內(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)疑問,翻的不好)
Container2類似,所不同的只是他使用template2,頁面輸出如下:
screen.width-430)this.width=screen.width-430" align=center border=0 dypop="按此在新窗口瀏覽圖片">
我們到目前位置所做的工作的優(yōu)點(diǎn)是顯而易見的。舉例來說,我們可以用template2替換template1(通過簡(jiǎn)單的復(fù)制和粘貼用template2.jsp替換template2.js1)。之后container1.jsp會(huì)馬上變成如下的模樣。我們改變了容器的布局卻沒有碰container1!這就是模版的作用。
screen.width-430)this.width=screen.width-430" align=center border=0 dypop="按此在新窗口瀏覽圖片">
Struts Template vs. Tiles
從Struts 1.1開始,引入了另一種模版機(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來替代模版呢?
Tiles允許我們傳遞參數(shù),從而對(duì)容器有更多的控制權(quán)。當(dāng)我想使模版和容器具有動(dòng)態(tài)特性時(shí)變的非常有用。此外,Tiles與Struts動(dòng)作組件(Struts action components)結(jié)合的更為緊密。
但是,Tiles會(huì)使代碼變的更為復(fù)雜。而且更為重要的是我們還要花更多的時(shí)間來掌握它。
結(jié)語
使用模版可以方便你管理網(wǎng)絡(luò)應(yīng)用程序。這篇文章是理解Struts模版的開始。這里只介紹了關(guān)于模版的很少的一部分知識(shí),還有很多比如基于角色(role-based)和可選內(nèi)容(optional content)的知識(shí)要靠大家自己去學(xué)習(xí)。希望我的這篇文章能激勵(lì)大家去探索更多的關(guān)于模版的特點(diǎn)。