用Struts實現模板

如果不用框架來開發一個門戶站點將會是一件很困難的事。使用模版可以減少些麻煩。他可以讓你在眨眼之間方便的更新與部署站點上的內容。用Struts模版標籤可以幫助你開發以模版爲基礎的門戶站點。
這篇文章解釋了與門戶有關的一些基本的模版思想,介紹了Struts對於模版的支持,圍繞着Struts模版標籤進行了討論。本文還闡述了其他的一些模版機制。

獲得Struts
網絡應用程序框架使用MVC模式,能簡化網絡站點的開發。Struts正是這樣的一個框架。它提供了類集、標籤庫和一些能作爲Web開發基礎的接口。Struts是Jakarta-Apache論壇下的一個開源項目。

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

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

模板基礎
我們通過模版可以創建很多結構相似的東西。模版幫助我們將會改變的東西歸檔打包,避免許多重複的工作。這對創建網絡應用程序的確是一件很方便的事情。

在大多數的網絡應用程序中,經常需要更換的是內容。JSP很容易做到這一點。因爲JSP默認提供一個include機制——<jsp:include>標籤。因此一個標準頁面可以通過改變include文件來改變它的內容。但是我們怎麼能如此方便的改變一個頁面的佈局呢?當我們需要改變的不僅僅是頁面的內容,還包括這個頁面的佈局時情況會怎麼樣呢?我們等會就會回答這些問題。

用Java提供的佈局管理機制可以幫我們更形象的理解這些問題。Java提出了佈局管理器、組件、容器的概念來創建圖形界面的應用程序。

當容器中的組件改變時,佈局管理器會決定怎麼樣將新的組件部署到容器中。此外,容器本身也可以做爲其他容器的組件從而實現了嵌套。在一些簡單的情況下,JSP就可以做爲一個網絡應用程序的模版,其功能就等價於佈局管理器。模版隱藏了web頁面佈局的實現方法。換句話說,它隱藏了佈局的法則。假如佈局法則需要改變,那麼這些改變將回受限於模版。Web頁面通過實現這個模版來做其內容上的改變。

如果模版等價於佈局管理器,那相應的容器和組件又是什麼呢?相應的組件就是實際的內容文件:JSP文件、HTML文件、圖象文件等等。容器將這些可見的組件聚集在一個單元裏。一個JSP文件就是一個容器。容器需要關於模版的信息來部署這些組件。用Java GUI舉例來說,一個面板(容器,集合單元)可以包含按鈕和文本區(組件和內容),使用一個網格佈局管理器(GridLayout)來部署這些組件。

現在我們可以來回答先前提出的那個問題了。我們知道模版集成了佈局法則,當要改變佈局是,我們要做的僅僅改變模版。這些改變會一起相關頁面佈局的改變,而不需要去改變這些頁面本身。在門戶應用程序中,這就意味着當大量頁面需要採用同樣佈局時在時間上的節省。

Struts用三個模版標籤來實現模版。

插入標籤InsertTag——<template:insert>。
  在容器/集合單元文件(collecting unit file)中使用。它定義了當前容器要使用的模版。類似於Java GUI中的container.setLayout(layout)方法。在它之後用<template:put>標籤定義組件。

放入標籤PutTag——<template:put>。
  在容器/集合單元文件(collecting unit file)中使用。他定義了組成容器/集合單元的組件/內容。它類似於Java GUI中的container.add(component)方法。每個PutTag標籤必須有一個相關組件的名稱。

獲得標籤GetTag——<template:get>。
  在模版文件中使用。它告訴模版由PutTag標籤定義的不同組件的名稱。它類似於Java GUI中的layout.addLayoutComponent(componentName, component)方法。
一個簡單的例子

你可以下載這個例子。我們將要創建兩套內容文件、容器(集合單元)文件以及模版文件。當我們有了這些文件後,就可以就可以互換他們的模版,看到他們在佈局上的改變。
複製Struts-blank.war到Tomcat的webapps目錄並且將他改名爲template-example.war。重起Tomcat。template-example會由Tomcat自動部署。刪除pages目錄和index.jsp文件。他們與我們的討論暫時無關。

讓我們定義又定義我們自己的內容文件做爲一個開始。在template-example下建立一個名爲content的目錄,並且在其中創建六個文件:top1.htm, top2.htm, bottom1.htm, bottom2.htm, middle1.jsp, and middle2.jsp。
放入什麼文件是取決於你的,但是對於初學者,靜態的.htm文件更容易理解。舉個例子來說,top.htm包括以下的內容:

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



類似的,middle1.jsp包括如下內容:

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() %>



定義了內容之後,讓我們來定義兩個模版。
在template-example下建立名爲templates的目錄,並在其下創建兩個文件template1.jsp和template2.jsp。
這些模版定義了兩種佈局方式,如下圖所示。
按此在新窗口瀏覽圖片
按此在新窗口瀏覽圖片

我們如下來定義這兩個模版:


<%@ 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>
</table>
</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>
</table>
</body>
</html>
定義 Template 2


注意到這兩個模版定義了兩種佈局方式,換句話說,它們定義了兩種不同的佈局法則。
我們已經有了我們自己的內容和模版。現在我們需要的是容器文件。在tomcat-example目錄下創建兩個容器文件分別名爲container1.jsp和container2.jsp。容器文件需要包含組件(內容)。同樣,容器文件利用template insert和put tags標籤來逐個定義使用和加入的組件(內容)。

讓我們帶着這些概念看一下其中的一個容器文件(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看看這個文件的實際輸出。你會看到如下的頁面:
按此在新窗口瀏覽圖片
     在這個頁面的後面,container1.jsp使用模版template1.jsp來定義輸出頁面的佈局並且從不同的組件中包含內容。注意這裏屬性direct的用法<template:put name='title' content='Templates' direct='true'/>。當direct設置爲true時,content標籤定義的內容將會被直接調用。它不尋找一個外部的文件。(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.有點疑問,翻的不好)

Container2類似,所不同的只是他使用template2,頁面輸出如下:
按此在新窗口瀏覽圖片

我們到目前位置所做的工作的優點是顯而易見的。舉例來說,我們可以用template2替換template1(通過簡單的複製和粘貼用template2.jsp替換template2.js1)。之後container1.jsp會馬上變成如下的模樣。我們改變了容器的佈局卻沒有碰container1!這就是模版的作用。
按此在新窗口瀏覽圖片
Struts Template vs. Tiles

從Struts 1.1開始,引入了另一種模版機制——Tiles。現在它已經成爲了模版機制的一個主要分支。Tiles機制定義與Tiles網絡站點中,並且與Struts定義的模版標籤兼容。事實上,Tiles是模版標籤的一個擴展集。那爲什麼我們要要Tiles來替代模版呢?

Tiles允許我們傳遞參數,從而對容器有更多的控制權。當我想使模版和容器具有動態特性時變的非常有用。此外,Tiles與Struts動作組件(Struts action components)結合的更爲緊密。

但是,Tiles會使代碼變的更爲複雜。而且更爲重要的是我們還要花更多的時間來掌握它。

結語
使用模版可以方便你管理網絡應用程序。這篇文章是理解Struts模版的開始。這裏只介紹了關於模版的很少的一部分知識,還有很多比如基於角色(role-based)和可選內容(optional content)的知識要靠大家自己去學習。希望我的這篇文章能激勵大家去探索更多的關於模版的特點。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章