一.指令元素
1.page指令
import
session
contentType
buffer
isTreadSafe
info
errorPage
isErrorPage
2.include指令
3.taglib指令
二.指令碼元素
1.聲明元素
2.運算式元素
3.指令碼元素
4.注釋元素
三.標準動作元素
1.<jsp:param>
2.<jsp:include>
3.<jsp:forward>
4.<jsp:plugin>
5.<jsp:useBean>
6.<jsp:setProperty>
7.<jsp:getProperty>
四.內建對象
1.request
2.response
3.out
4.session
5.pageContext
6.application
7.config
8.page
9.exception
五.JavaBeans的使用
1.JavaBeans在JSP中的基本使用格式
2.scope範圍的具體設定
3.session事件的運用
4.Bean的儲存與讀取
六.JSP中的檔案操作
七.JSP運行原理剖析
-------------------------------------------------
在早期,開發網路資料庫應用程式主要採用CGI(Common Gateway Interface)技術。編寫CGI程式可以使用不同的程式語言,如Perl、Visual Basic、Delphi或C/C++等。雖然CGI技術已經發展成熟而且功能強大,但由於其編程困難、效率低下、修改複雜等缺陷,所以有被新技術取代的 技術。
在這樣的背景下,新的技術紛紛面世,如ASP(Active Server Page)、PHP(Personal Home Page)、JSP(Java Server Page)等。其中,JSP被許多人認為是未來最有發展前途的動態網站技術。
JSP頁面一般由HTML標籤和JSP元素構成,其中的JSP元素則又是由“指令元素”、“指令碼元素” 、“標準動作元素” 、“內建對象”四個部分組成。下面,就讓我們一起來探究JSP的奧秘吧……
一. 指令元素
可以把JSP理解為用來通知JSP引擎的訊息。JSP不直接產生可見的輸出,用JSP指令設定JSP引擎處理JSP頁面的機制。
一般JSP 指令用標籤<%@…%>表示,JSP指令包括page、include和taglib。page指令是針對當前頁面的指令,而include 指令用來指定如何包含另外一個檔案,taglib指令用來定義和訪問自訂標籤庫。這三種指令通常都有預設值,這樣開發人員就不必顯式的使用每一個指令予 以確認。
1. page指令
page指令的設定文法格式是:<%@ page attribute1=”value1” attribute2=”value2”…%>
下面介紹指令中包括的幾個常用屬性,並作簡要說明。
l import
import指令是所有page指令中,唯一可以多次設定的指令,而且累加每個設定。它用來指定jsp網頁中所需要使用到的一些類。例如:
<%@ page import=”java.io.*,java.util.Date”%>
l session
定義當前頁面是否參與http會話。當設定為”true”時,可以獲得隱含名為session的對象,為”false”時,則不能。預設設定為”true”。
l contentType
設定jsp網頁輸出時資料時,所使用的字元壓縮方式,以及所使用的字元集,當編寫中文網頁時,設定如下:
<%@page contentType=”text/html;charset=Gb2312”%>
此屬性的預設值為”text/html;charset=ISO-8859-1”。
l buffer
設定jsp網頁的緩衝區大小,預設為”8k”,如果設定為”none”,則表示不使用緩衝,所有的響應輸出都將被PrintWriter直接寫到ServletResponse中。
l isTreadSafe
定義當前頁面是否支援安全執行緒。如果為”true”,則該頁面可能同時收到jsp引擎發出的多個請求,反之,jsp引擎會對收到的請求進行排隊,當前頁面在同一時刻只能處理一個請求。預設為”true”。
l info
設定頁面的文本資訊,可以通過Servlet.getServletInfo()的方法獲得該字串。
l errorPage
定義指向另一個jsp頁面的URL。當頁面出現一個沒有被捕獲的異常時,錯誤資訊將以throw語句拋出,而被設定為錯誤資訊網頁的jsp頁面,將利用exception隱含對象,取得錯誤資訊。
預設沒有錯誤處理頁面。
l isErrorPage
設定此jsp網頁是否為錯誤處理頁面。預設值為”false”。當設定為”true”時,jsp頁面將可存取隱含的exception對象,並通過該對象取得從發生錯誤之網頁所傳出的錯誤資訊。取得錯誤資訊的文法如下:
<% =exception.getMessage()%>
² 一個分頁錯誤處理的例子
產生錯誤的分頁檔為MakeError.jsp,處理錯誤的分頁檔為ErrorPage.jsp,它們的來源程式如下:
MakeError.jsp
<%@ page errorPage="ErrorPage.jsp"%>
<html>
<head>
<title>產生錯誤頁面</title>
</head>
<body>
<%
int i=8,j=0;
out.println(ij);
%>
</body>
</html>
ErrorPage.jsp
<%@ page isErrorPage="true"%>
<html>
<head>
<title>錯誤處理頁面</title>
</head>
<body>
<font color=red>
錯誤原因:<%=exception.getMessage()%>
</font>
</body>
</html>
運行程式MakeError.jsp的結果如下:
2. include指令
使用include指令可以把其他的文字檔加入到當前的jsp頁面,格式如下:
<%@ include file=”header.inc”%>
如此,則在當前頁面中加入header.inc原始碼然後再編譯整個檔案。
可以使用include指令把一個頁面分成不同的部分,最後合成一個完整的檔案,使用jsp的include指令有助於實現jsp頁面的模組化。
3. taglib指令
(略)
二. 指令碼元素
JSP規格提供了四種類型的指令碼元素,包括:
l 聲明
l 運算式
l 指令碼
l 注釋
下面分別對它們進行詳細敘述。
1. 聲明元素
聲明用於定義jsp頁面中的變數與函數,這些經過定義的變數和函數,將成為Servlet類的屬性與方法(關於Servlet請參看後文)。聲明並不會產生任何的資料輸出,聲明時可同時設定初始值,提供給其他的聲明、運算式或指令碼使用。
聲明的文法格式為:
<%!
//聲明語句
%>
舉例:
<%!
//此處定義的變數將成為此jsp頁面的全域變數
int i = 0;
static int j=100;
String s = “注意”;
%>
<%!
//此處定義的函數將成為此jsp頁面的公用函數
Public int square(int i)
{
return(i*i);
}
%>
² jspInit函數與jspDestroy函數
若要在jsp頁面開始執行時進行某些資料的初始化,可以利用jspInit函數完 成。此函數將在jsp頁面被執行時調用,且當jsp頁面重新整理時,並不會被再度執行。當關閉伺服器時,jspDestroy函數將被執行,可以利用該函 數進行資料的善後處理工作。下面舉個簡單的例子說明,檔案InitDes.jsp代碼如下:
<%@ page contentType="text/html; charset=GB2312"%>
<%!
public void jspInit()
{
System.out.println("jspInit is called!");
}
public void jspDestroy()
{
System.out.println("jspDestroy is called!");
}
%>
<HTML>
<HEAD><TITLE>jspInit函數與jspDestroy函數的使用</TITLE></HEAD>
<BODY>
<CENTER>
<FONT SIZE = 5 COLOR = blue>jspInit函數與jspDestroy函數的使用</FONT>
</CENTER>
<HR><BR>
</BODY>
</HTML>
首次執行此頁面時,Resin伺服器輸出如下:
Resin 1.2.2 -- Tue Jan 16 09:53:18 PST 2001
http listening to *:8080
srun listening to 127.0.0.1:6802
jspInit is called!
重新整理此頁面數次後,Resin伺服器輸出仍然如上。
此時,如果關閉伺服器,則輸出如下:
Resin 1.2.2 -- Tue Jan 16 09:53:18 PST 2001
http listening to *:8080
srun listening to 127.0.0.1:6802
jspInit is called!
closing server
jspDestroy is called!
由此,我們得到啟發,在資料庫的開發過程中,可以利用jspInit函數來進行資料庫的串連工作,用jspDestroy函數來進行資料庫的關畢工作。下面以一個分頁顯示資料庫內容的程式為例子,讓讀者進一步體會jspInit與jspDestroy的功用與好處。
在Pages.jsp這個分頁程式中,我們把資料庫連接的動作寫在jspInit函數中,這樣,每一次重新整理頁面時,就可以避免重新執行資料庫的串連動作。如下:
<%@ page contentType="text/html; charset=GB2312"
import="java.sql.*"%>
<%!
int PageSize = 2; //設定每張網頁顯示兩筆記錄
int ShowPage = 1; //設定欲顯示的頁數
int RowCount = 0; //ResultSet的記錄筆數
int PageCount = 0; //ResultSet分頁後的總頁數
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
public void jspInit() //執行資料庫與相關資料的初始化
{
try
{
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//載入驅動程式類別
con = DriverManager.getConnection("jdbc:odbc:test");
//建立資料庫連結
stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
//建立Statement對象, 並設定記錄指標類型為可前後移動
rs = stmt.executeQuery("SELECT * FROM products");
//建立ResultSet(結果集)對象,並執行SQL語句
rs.last(); //將指標移至最後一筆記錄
RowCount = rs.getRow(); //取得ResultSet中記錄的筆數
PageCount = ((RowCount % PageSize) == 0 ?
(RowCountPageSize) : (RowCountPageSize)+1);
//計算顯示的頁數
}
catch(Exception ex)
{
System.out.println(ex.toString());
}
}
public void jspDestroy() //執行關閉各種對象的操作
{
try
{
rs.close(); //關閉ResultSet對象
stmt.close(); //關閉Statement對象
con.close(); //關閉資料庫連結化物件
}
catch(Exception ex)
{
System.out.println(ex.toString());
}
}
%>
<HTML>
<HEAD>
<TITLE>記錄的分頁顯示</TITLE>
</HEAD>
<BODY>
<CENTER>
<FONT SIZE = 5 COLOR = blue>記錄的分頁顯示</FONT>
</CENTER>
<HR>
<P></P>
<CENTER>
<%
String ToPage = request.getParameter("ToPage");
//判斷是否可正確取得ToPage參數,
//可取得則表示JSP網頁應顯示特定分頁記錄的語句
if(ToPage != null)
{
ShowPage = Integer.parseInt(ToPage); //取得指定顯示的分頁頁數
//下面的if語句將判斷使用者輸入的頁數是否正確
if(ShowPage > PageCount)
{ //判斷指定頁數是否大於總頁數, 是則設定顯示最後一頁
ShowPage = PageCount;
}
else if(ShowPage <= 0)
{ //若指定頁數小於0, 則設定顯示第一頁的記錄
ShowPage = 1;
}
}
rs.absolute((ShowPage - 1) * PageSize + 1);
//計算欲顯示頁的第一筆記錄位置
%>
<H3>目前在第<FONT SIZE = 4 COLOR = red>
<%= ShowPage %></FONT>頁, 共有
<FONT SIZE = 4 COLOR = red>
<%= PageCount %></FONT>頁</H3>
<P></P>
<%
//利用For迴圈配合PageSize屬性輸出一頁中的記錄
for(int i = 1; i <= PageSize; i++)
{
%>
<TABLE border=1 bordercolor=RoyalBlue bgcolor=LightBlue>
<TR><TD bgcolor=LightYellow width= 100>
<B>商品名</B></TD>
<TD width= 100><B><%= rs.getString("product_name") %>
</B></TD>
<TD bgcolor=LightYellow width= 100>
<B>價格</B></TD>
<TD width= 100><B><%= rs.getInt("price") %>
</B></TD>
<TD bgcolor=LightYellow width= 100>
<B>描述</B></TD>
<TD width= 100><B><%= rs.getString("description") %>
</B></TD>
</TR>
</TABLE><BR>
<%
//下面的if判斷語句用於防止輸出最後一頁記錄時,
//將記錄指標移至最後一筆記錄之後
if(!rs.next()) //判斷是否到達最後一筆記錄
break; //跳出for迴圈
}
%>
<TABLE>
<TR valign=baseline align=center>
<%
//判斷目前所在分頁是否為第一頁,
//不是則顯示到第一頁與上一頁的超連結
if(ShowPage != 1)
{
//下面建立的各超連結將連結至自己,
//並將欲顯示的分頁以ToPage參數傳遞給自己
%>
<TD Width=150>
<A Href=Pages.jsp?ToPage=<%= 1 %>>到第一頁</A>
</TD>
<TD Width=150>
<A Href=Pages.jsp?ToPage=<%= ShowPage - 1 %>>到上一頁</A>
</TD>
<%
}
//判斷目前所在分頁是否為最後一頁,
//不是則顯示到最後一頁與下一頁的超連結
if(ShowPage != PageCount)
{
//下面建立的各超連結將連結至自己,
//並將欲顯示的分頁以ToPage參數傳遞自己
%>
<TD Width=150>
<A Href=Pages.jsp?ToPage=<%= ShowPage + 1%>>到下一頁</A>
</TD>
<TD Width=150>
<A Href=Pages.jsp?ToPage=<%= PageCount %>>到最後一頁</A>
</TD>
<%
}
%>
<TD Width=150>
<FORM action=Pages.jsp method=POST>
到
<!--
供使用者輸入欲查看頁數的文字方塊, 預設值為目前所在的分頁,
當使用者在此文字方塊中完成資料輸入後按下 Enter 即可將資料送出,
相當於按下Submit按鈕, 因此此表單中將省略Submit按鈕
-->
<INPUT type="text" name=ToPage style="HEIGHT: 25px; WIDTH: 40px"
value=<%= ShowPage%> > 頁
</FORM></TD></TR>
</TABLE>
</CENTER>
</BODY>
</HTML>