一個開發人員眼中的JSP技術(上)
來源:互聯網
上載者:User
js JavaServerTM Pages(JSP)技術為我們提供了一種建立動態網頁的簡單方法,而且也簡化了構造web程式的工作。本文從一個開發人員的角度對JSP技術做了一個全面介紹(並提供了一些JSP執行個體程式)。
前言
JavaServer Pages技術可以讓web開發人員和設計人員非常容易的建立和維護動態網頁,特別是目前的商業系統。作為JavaTM技術的一部分,JSP能夠快速開發出基於web、獨立於平台的應用程式。JSP 把使用者介面從系統內容中分離開來,使得設計人員能夠在不改變底層動態內容的前提下改變整個網頁布局。
那麼什麼是JavaServer Page呢?簡單的說,一個JSP網頁就是在HTML網頁中包含了能夠產生動態內容的可執行應用程式代碼。此應用程式可能包含JavaBeanTM,JDBCTM對象,Enterprise Java BeanTM (EJB)和Remote Method Invocation (RMI)對象,所有的部分都可以非常容易的從JSP網頁上訪問到。例如,一個JSP網頁可以包含 HTML代碼所顯示的靜態文本和映像,也可以調用一個JDBC對象來訪問資料庫;當網頁顯示到使用者介面上以後,它將包含靜態HTML內容和從資料庫中找到相應的動態資訊。
在JSP網頁中,要把使用者介面和應用程式分開可以考慮在網頁設計人員和開發人員之間執行一個非常方便的授權任務。它也允許開發人員去建立靈活的代碼,從而非常容易的進行更新和重複利用。由於JSP網頁能夠根據需要自動進行編譯,web設計人員無須重新編譯應用程式邏輯就可以改變表述代碼。這也使得JSP與Java servlet(它是JavaSever Pages功能的擴充)相比成為一種可以更靈活產生動態web內容的方法。
JSP和Servlet
如果你已經用過Java servlet,那麼你就會知道servlet可以讓你建立動態產生的網頁,而網頁中包含有從伺服器方的Java對象中所獲得的資料。但是你也得知道servlet 產生網頁的方法就是在Java類中嵌入HTML標籤和表述代碼。這就意味著改變表述代碼需要修改和重新編譯servlet源檔案。因為設計HTML頁面的設計人員可能與編寫servlet代碼的開發人員不是同一個人,更新基於servlet的web應用程式就成了一件非常棘手的事情。
Enter JavaServer Page是Servlet API的一個擴充。事實上,JSP網頁在編譯成servlet之前也可以使用,所以它們也具有servlet的所有優勢,包括訪問Java API。由於JSP 是嵌入到servlet中關於應用程式的一般表述代碼,所以他們能夠被看成一種“徹底”的servlet。
JSP網頁主要提供了一種建立servlet的高水平方法,它還帶來了其他的優點。即使你已經為web應用程式編寫了servlet,使用JSP仍然有很多優勢:
JSP網頁可以非常容易的與靜態模板結合,包括HTML 或XML 片段,以及產生動態內容的代碼。
JSP網頁可以在被請求的時候動態編譯成servlet,所以網頁的設計人員可以非常容易的對錶述代碼進行更新。如果需要的話,JSP網頁還可以進行先行編譯。
為了調用JavaBean組件,JSP標籤可以完全管理這些組件,避免網頁設計人員複雜化應用程式。
開發人員可以提供定製化的JSP標籤庫。
網頁設計人員能夠改變和編輯網頁的固定模板部分而不影響應用程式。同樣,開發人員也無須一個個編輯頁面而只須對組件進行合理的改變。
通常,JSP允許開發人員向許多網頁設計人員分發功能性應用程式。這些設計人員也不必知道Java程式設計語言或任何servlet代碼,所以他們能夠集中精力去編寫HTML代碼,而編程人員就可以集中精力去建立對象和應用程式。
建立JSP頁面
粗略看來,JSP網頁和HTML (或XML)網頁非常相似——都包含用標籤封裝的文本(在“<>”之間被定義)。當HTML標籤被使用者的瀏覽器處理以顯示網頁的時候,JSP標籤能夠通過web伺服器的處理來產生動態內容。這些JSP標籤能夠定義個別的操作,比如說用一個方法來調用JavaBean,或者包含標準的Java代碼塊(也就是所謂的scriptlet),這些代碼塊能夠在網頁被訪問的時候被執行。
為了瞭解它們如何使用,下面我們介紹了一個JSP網頁的簡單例子,在這個JSP網頁中包含了靜態HTML內容和從JavaBean產生的動態資料。當使用者訪問這個網頁的時候,它可以顯示當前的日期,並根據當前的時間增加相應的問候語(例如“早上好”和“下午好”)。為簡單起見,JSP標籤顯示在塊中:
<HTML>
<%@ page language="java" imports="java.util.*" %>
<H1>Welcome</H1>
<P>Today is </P>
<jsp:useBean id="clock" class="jspCalendar" />
<UL>
<LI>Day: <%= clock.getDayOfMonth() %>
<LI>Year: <%= clock.getYear() %>
</UL>
<%-- Check for AM or PM --%>
<%! int time = Calendar.getInstance().get(Calendar.AM_PM); %>
<%
if (time == Calendar.AM) {
%>
早上好
<%
}
else {
%>
下午好
<%
}
%>
<%@ include file="copyright.html" %>
</HTML>
上面的JSP例子是不是很簡單?我們在JSP網頁中使用了幾個不同的組件。這些組件包括下面的內容:
JSP action (或JSP標籤)使用了多種函數並擴充了JSP的功能。JSP action使用的是一種類似XML的文法,並且被用來處理JavaBean組件。在上面的例子中,jsp:useBean action初始化了一個JavaBean ,JavaBean將在網頁的後面部分被用到:
<jsp:useBean id=="clock" class=="jspCalendar" />
如果在網頁中需要獲得和設定這個Bean的屬性,另一個JSP action將被給出,使用的是下面的文法:
<jsp:getProperty name="bean" property="property" />
<jsp:setProperty name="bean" property="property" value="value" />
當網頁被編譯成一個servlet的時候,Directive將被JSP引擎處理。Directive被用來設定頁面級的指令、從外部檔案插入資料以及制定定製的標籤庫。Directive被定義在<%@ 和 %>之間。 在上面的例子中,Directive定義了頁面所使用的語言(Java),為了關聯Java類需要植入代碼並指定一個將要插入頁面底部的HTML檔案內容:
<%@ page language=="java" imports=="java.util.*" %>
<%@ include file=="copyright.html" %>
聲明與Java中的變數聲明相似,它也是為了後面運算式或scriptlet的需要來定義變數。聲明被定義在<%! 和 %>之間。在上面的例子中,“int”聲明並給出了一個目前時間的相應值 (AM 或 PM):
<%! int time = Calendar.getInstance().get(Calendar.AM_PM); %>
運算式可以是變數或常量,它插在由web伺服器所返回的資料裡,並?lt;%= 和 %>來定義。在上面的例子中,運算式將調用JavaBean組件並在頁面中插入結果資料:
<%= clock.getDayOfMonth() %>
<%= clock.getYear() %>
Scriptlet將作為一個Java代碼塊植入JSP頁面中。Scriptlet代碼被一一插入由頁面所產生的servlet中,它被定義在<% 和%>之間。上面例子中的scriptlet可以根據目前使用者產生相應的時間和問候語:
<%
if (time == Calendar.AM) {
%>
早上好
<%
}
else {
%>
下午好
<%
}
%>
注釋部分和HTML的⑹拖嗨疲痹諡蔥械氖焙騄SP引擎將去掉對注釋的解釋。這就意味著JSP注釋並不返回到使用者的瀏覽器中。不象HTML注釋被定義在<!-和 -->標籤之間,JSP注釋被定義在<%--和 --%>之間。例如:
<%-- Check for AM or PM --%>