前言
JavaServer Pages技術(shù)可以讓web開發(fā)人員和設(shè)計人員非常容易的創(chuàng)建和維護動態(tài)網(wǎng)頁,特別是目前的商
業(yè)系統(tǒng)。作為JavaTM技術(shù)的一部分,JSP能夠快速開發(fā)出基于web、獨立于平臺的應(yīng)用程序。JSP 把用戶界面從系統(tǒng)內(nèi)容中分離開來,使得設(shè)計人員能夠在不改變底層動態(tài)內(nèi)容的前提下改變整個網(wǎng)頁布局。
那么什么是JavaServer Page呢?簡單的說,一個JSP網(wǎng)頁就是在HTML網(wǎng)頁中包含了能夠生成動態(tài)內(nèi)容的可執(zhí)行應(yīng)用程序代碼。此應(yīng)用程序可能包含JavaBeanTM,JDBCTM對象,Enterprise Java BeanTM (EJB)和Remote Method Invocation (RMI)對象,所有的部分都可以非常容易的從JSP網(wǎng)頁上訪問到。例如,一個JSP網(wǎng)頁可以包含 HTML代碼所顯示的靜態(tài)文本和圖像,也可以調(diào)用一個JDBC對象來訪問數(shù)據(jù)庫;當網(wǎng)頁顯示到用戶界面上以后,它將包含靜態(tài)HTML內(nèi)容和從數(shù)據(jù)庫中找到相應(yīng)的動態(tài)信息。
在JSP網(wǎng)頁中,要把用戶界面和應(yīng)用程序分開可以考慮在網(wǎng)頁設(shè)計人員和開發(fā)人員之間執(zhí)行一個非常方便的授權(quán)任務(wù)。它也允許開發(fā)人員去建立靈活的代碼,從而非常容易的進行更新和重復(fù)利用。由于JSP網(wǎng)頁能夠根據(jù)需要自動進行編譯,web設(shè)計人員無須重新編譯應(yīng)用程序邏輯就可以改變表述代碼。這也使得JSP與Java servlet(它是JavaSever Pages功能的擴展)相比成為一種可以更靈活生成動態(tài)web內(nèi)容的方法。
JSP和Servlet
如果你已經(jīng)用過Java servlet,那么你就會知道servlet可以讓你建立動態(tài)生成的網(wǎng)頁,而網(wǎng)頁中包含有從服務(wù)器方的Java對象中所獲得的數(shù)據(jù)。但是你也得知道servlet 生成網(wǎng)頁的方法就是在Java類中嵌入HTML標簽和表述代碼。這就意味著改變表述代碼需要修改和重新編譯servlet源文件。因為設(shè)計HTML頁面的設(shè)計人員可能與編寫servlet代碼的開發(fā)人員不是同一個人,更新基于servlet的web應(yīng)用程序就成了一件非常棘手的事情。
Enter JavaServer Page是Servlet API的一個擴展。事實上,JSP網(wǎng)頁在編譯成servlet之前也可以使用,所以它們也具有servlet的所有優(yōu)勢,包括訪問Java API。由于JSP 是嵌入到servlet中關(guān)于應(yīng)用程序的一般表述代碼,所以他們能夠被看成一種“徹底”的servlet。
JSP網(wǎng)頁主要提供了一種建立servlet的高水平方法,它還帶來了其他的優(yōu)點。即使你已經(jīng)為web應(yīng)用程序編寫了servlet,使用JSP仍然有很多優(yōu)勢:
JSP網(wǎng)頁可以非常容易的與靜態(tài)模板結(jié)合,包括HTML 或XML 片段,以及生成動態(tài)內(nèi)容的代碼。
JSP網(wǎng)頁可以在被請求的時候動態(tài)的編譯成servlet,所以網(wǎng)頁的設(shè)計人員可以非常容易的對表述代碼進行更新。如果需要的話,JSP網(wǎng)頁還可以進行預(yù)編譯。
為了調(diào)用JavaBean組件,JSP標簽可以完全管理這些組件,避免網(wǎng)頁設(shè)計人員復(fù)雜化應(yīng)用程序。
開發(fā)人員可以提供定制化的JSP標簽庫。
網(wǎng)頁設(shè)計人員能夠改變和編輯網(wǎng)頁的固定模板部分而不影響應(yīng)用程序。同樣,開發(fā)人員也無須一個個編輯頁面而只須對組件進行合理的改變。
通常,JSP允許開發(fā)人員向許多網(wǎng)頁設(shè)計人員分發(fā)功能性應(yīng)用程序。這些設(shè)計人員也不必知道Java編程語言或任何servlet代碼,所以他們能夠集中精力去編寫HTML代碼,而編程人員就可以集中精力去建立對象和應(yīng)用程序。
建立JSP頁面
粗略看來,JSP網(wǎng)頁和HTML (或XML)網(wǎng)頁非常相似——都包含用標簽封裝的文本(在“<>”之間被定義)。當HTML標簽被用戶的瀏覽器處理以顯示網(wǎng)頁的時候,JSP標簽?zāi)軌蛲ㄟ^web服務(wù)器的處理來生成動態(tài)內(nèi)容。這些JSP標簽?zāi)軌蚨x個別的操作,比如說用一個方法來調(diào)用JavaBean,或者包含標準的Java代碼塊(也就是所謂的scriptlet),這些代碼塊能夠在網(wǎng)頁被訪問的時候被執(zhí)行。
為了了解它們?nèi)绾问褂?,下面我們介紹了一個JSP網(wǎng)頁的簡單例子,在這個JSP網(wǎng)頁中包含了靜態(tài)HTML內(nèi)容和從JavaBean生成的動態(tài)數(shù)據(jù)。當用戶訪問這個網(wǎng)頁的時候,它可以顯示當前的日期,并根據(jù)當前的時間增加相應(yīng)的問候語(例如“早上好”和“下午好”)。為簡單起見,JSP標簽顯示在塊中:
?。ㄎ赐辏?br>
<%@ page language="java" imports="java.util.*" %>
Welcome
Today is
- Day: <%= clock.getDayOfMonth() %>
- Year: <%= clock.getYear() %>
<%-- Check for AM or PM --%>
<%! int time = Calendar.getInstance().get(Calendar.AM_PM); %>
<%
if (time == Calendar.AM) {
%>
早上好
<%
}
else {
%>
下午好
<%
}
%>
<%@ include file="copyright.html" %>
上面的JSP例子是不是很簡單?我們在JSP網(wǎng)頁中使用了幾個不同的組件。這些組件包括下面的內(nèi)容:
JSP action (或JSP標簽)使用了多種函數(shù)并擴展了JSP的功能。JSP action使用的是一種類似XML的語法,并且被用來處理JavaBean組件。在上面的例子中,jsp:useBean action初始化了一個JavaBean ,JavaBean將在網(wǎng)頁的后面部分被用到:
如果在網(wǎng)頁中需要獲得和設(shè)置這個Bean的屬性,另一個JSP action將被給出,使用的是下面的語法:
當網(wǎng)頁被編譯成一個servlet的時候,Directive將被JSP引擎處理。Directive被用來設(shè)置頁面級的指令、從外部文件插入數(shù)據(jù)以及制定定制的標簽庫。Directive被定義在<%@ 和 %>之間。 在上面的例子中,Directive定義了頁面所使用的語言(Java),為了關(guān)聯(lián)Java類需要植入代碼并指定一個將要插入頁面底部的HTML文件內(nèi)容:
<%@ page language=="java" imports=="java.util.*" %>
<%@ include file=="copyright.html" %>
聲明與Java中的變量聲明相似,它也是為了后面表達式或scriptlet的需要來定義變量。聲明被定義在<%! 和 %>之間。在上面的例子中,“int”聲明并給出了一個當前時間的相應(yīng)值 (AM 或 PM):
<%! int time = Calendar.getInstance().get(Calendar.AM_PM); %>
表達式可以是變量或常量,它插在由web服務(wù)器所返回的數(shù)據(jù)里,并?lt;%= 和 %>來定義。在上面的例子中,表達式將調(diào)用JavaBean組件并在頁面中插入結(jié)果數(shù)據(jù):
<%= clock.getDayOfMonth() %>
<%= clock.getYear() %>
Scriptlet將作為一個Java代碼塊植入JSP頁面中。Scriptlet代碼被一一插入由頁面所產(chǎn)生的servlet中,它被定義在<% 和%>之間。上面例子中的scriptlet可以根據(jù)當前用戶產(chǎn)生相應(yīng)的時間和問候語:
<%
if (time == Calendar.AM) {
%>
早上好
<%
}
else {
%>
下午好
<%
}
%>
注釋部分和HTML的⑹拖嗨?,当灾u蔥械氖焙騄SP引擎將去掉對注釋的解釋。這就意味著JSP注釋并不返回到用戶的瀏覽器中。不象HTML注釋被定義在標簽之間,JSP注釋被定義在<%--和 --%>之間。例如:
<%-- Check for AM or PM --%>