用Struts完成模板
發表時間:2024-02-11 來源:明輝站整理相關軟件相關文章人氣:
[摘要]如果不用框架來開發一個門戶站點將會是一件很困難的事。使用模版可以減少些麻煩。他可以讓你在眨眼之間方便的更新與部署站點上的內容。用Struts模版標簽可以幫助你開發以模版為基礎的門戶站點。這篇文章解釋了與門戶有關的一些基本的模版思想,介紹了Struts對于模版的支持,圍繞著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。
這些模版定義了兩種布局方式,如下圖所示。
screen.width-430)this.width=screen.width-430" align=center border=0>
screen.width-430)this.width=screen.width-430" align=center border=0>
我們如下來定義這兩個模版:
<%@ 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
注意到這兩個模版定義了兩種布局方式,換句話說,它們定義了兩種不同的布局法則。
我們已經有了我們自己的內容和模版�,F在我們需要的是容器文件。在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看看這個文件的實際輸出。你會看到如下的頁面:
screen.width-430)this.width=screen.width-430" align=center border=0>
在這個頁面的后面,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,頁面輸出如下:
screen.width-430)this.width=screen.width-430" align=center border=0 dypop="按此在新窗口瀏覽圖片">
我們到目前位置所做的工作的優點是顯而易見的。舉例來說,我們可以用template2替換template1(通過簡單的復制和粘貼用template2.jsp替換template2.js1)。之后container1.jsp會馬上變成如下的模樣。我們改變了容器的布局卻沒有碰container1!這就是模版的作用。
screen.width-430)this.width=screen.width-430" align=center border=0 dypop="按此在新窗口瀏覽圖片">
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)的知識要靠大家自己去學習。希望我的這篇文章能激勵大家去探索更多的關于模版的特點。