近日,看《林師傅在首爾》,感覺越看越餓。沒辦法,最後改成邊看邊吃了。本來胖胖的身體,因爲看這部連續劇的原因更胖了。哎。。。請大家記住,一定要吃飯時看,不然後悔呀。。。
言歸正傳,前兩章主要是 JSP 的一些簡單地介紹,從本章開始,我們要正式去學習 JSP 的具體知識。如果有過 Web 開發經歷的人員,可以依個人情況來想今後的章節,因爲有一些一看就懂,有一些可能與平常所用到的開發語言不太一樣。畢竟,所有學到的知識全都是爲了同一個目的——實用爲基礎建立起來的。如果不實用哪成呀。
古人有云,“不力行,但學文,長浮華,成何人。但力行,不學文,任己見,昧理真。讀書法,有三到,心眼口,信皆要”。所以,我們在今後的學習中,一定要用到實處,理論 + 實踐 = NB。
好了,我們開始今天的學習。
一、JSP 頁面之組成
JSP 常用的語句主要有以下六種類型:
1、註釋:<%--註釋內容--%>
2、聲明:<%! 預定義內容 %>
3、表達式:<% =表達式 %>
4、腳本段:<% 代碼 %>
5、指令:<%@ 指令 %>
6、動作:<jsp: 動作 %>
PS:JSP 代碼一定要用英文字符,不然的話可能會出現錯誤。當年,我在上學期間,一位同學本來寫得代碼沒有錯誤,但無法運行成功。老師也和他一起調試了 N 長時間。怎麼都不同。最後,偉大的老師大人問同學言,“你的,代碼是如何寫的,你打一遍給我看”。最後那位同學用搜狗輸入法打了一遍 JSP 代碼。最後,老師長舒一口氣來了句,請用純正的英文字符打。呵呵,好多這種輸入法會讓人錯誤認爲自己打得是純英文字符,其實全是中文的僞英文字符。由於我是用五筆打字,所以沒有發生過這類錯誤。
(一)註釋
註釋顧名思意,就是爲了幫助開發人員理解所寫代碼是幹什麼的小抄。當我們寫了一大堆代碼時,如果沒有註釋的話,隔了十天半個月後,再回過頭來再看時,八成都不知道這段代碼是幹什麼的(雖然是你寫的)。所以,註釋就是爲了解決這類問題而做的。有時,寫上註釋也是幫助大家注意一些問題。比如如下的註釋:
[java] view plaincopy
<%--
親愛的代碼維護人員:
當您嘗試優化這段代碼但發現這是一個極端錯誤的決定的時候,請修改下面的計時器,以便警示後人。
總計浪費在這段代碼的時間 = 16小時
--%>
[java] view plaincopy
<%--
你可能會認爲你讀得懂以下的代碼。但是你不會懂的,相信我吧。
要是你嘗試玩弄這段代碼的話,你將會在無盡的通宵中不斷地咒罵自己爲什麼會認爲自己聰明到可以優化這段代碼。
好了,現在請關閉這個文件去玩點別的吧。
--%>
[java] view plaincopy
<%--
程序員1(於2002年6月7日):在登陸界面臨時加入一些調試代碼
程序員2(於2007年5月22日):臨你個屁啊
--%>
呵呵,這是我在網上找到的一些好玩的註釋。大家可以學習一下。
JSP 代碼的註釋方法很簡單,就是在“<%--”和“--%>”加入註釋信息而已。但是,這些註釋與我們所見到的HTML中的“<!-- HTML註釋 -->”不太一樣。因爲 JSP 的註釋只顯示在服務器端,不會讓客戶看到。也就是像C語言那樣。編譯器會不會去編譯註釋中的內容,而將其跳過。我們可以通過下面的例子比較一下:
JSP 代碼段:
[html] view plaincopy
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<!-- 這是 HTML 的代碼註釋 -->
<%-- 這是 JSP 的代碼註釋 --%>
<h1>Hello World!</h1>
</body>
</html>
下面是客戶端訪問服務器時,通過查看源代碼看到的:
[html] view plaincopy
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<!-- 這是 HTML 的代碼註釋 -->
<h1>Hello World!</h1>
</body>
</html>
看吧,好像“<%-- 這是 JSP 的代碼註釋 --%>”這一行只顯示出了一個空間,內容消失了!!!
(二)聲明
聲明語句,是要將 JSP 中所要用到的變量以及方法進行聲明。比如,在 C/C++ 中的“int i;" ,在 ASP 中“Dim a”,在 JavaScript 中的“var a;”那樣。在 JSP 中的語法格式是:
[java] view plaincopy
<%! 聲明;[聲明];...%>
例如如下樣子:
[java] view plaincopy
<%! int i = 6; %>
<%! int a, b, c; double d; %>
<%! Image a = new Image(6, 0); %>
以上的例子就是聲明的使用。我們有沒有發現,如果你學過 Java 的話,基本上就是 Java 的語言。只不過前面多了個“<%!”,後面加了個“%>”。 其實沒有什麼大不了的。後面如果你看到 JSP 腳本段時,你會仰天長嘆,這不就是 Java 嗎?
(三)表達式
表達式是什麼,它是由變量、變量,或其它什麼亂七八糟組成的算式,用來計算並直接輸入結果值。
其語法格式如下:
[java] view plaincopy
<%= 表達式 %>
如果有過 ASP 開發的經驗話,就不會很難想到這到底是什麼了。因爲在 ASP 中常見到這個。這個就是用於向 HTML 頁面顯示結果。比如下面的例子,大家一看就明瞭:
[html] view plaincopy
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<%! int i = 1;%>
i = <%=i%>
<br />
i * 2 = <%= i * 2 %>
</body>
</html>
頁面顯示的結果:
(四)腳本段
JSP 腳本段可以包含任意且多行併合法的腳本語句。這些腳本語句其實就是 Java 代碼。只不過,這些代碼主要用於 Web 技術。而其語法是:
[java] view plaincopy
<%
腳本代碼1
腳本代碼2
……
腳本代碼N
%>
所執行後的結果將會顯示在 HTML 頁面當中。
好的,我們繼續看一個例子:
[html] view plaincopy
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<%
int i, sum = 0;
for(i = 1; i <= 10; i++){
sum += i;
}
out.println("Sum(1+2+...+10) = " + sum);
%>
</body>
</html>
結果:
(五)指令
JSP 指令是一些特殊的 JSP 語句,它是爲 JSP引擎設計的,用於通知 JSP 引擎如何處理 JSP 頁面,不直接產生任何可見輸出。其語法格式如下:
[java] view plaincopy
<%@ 指令 %>
我們在開發過程中主要會遇到以下幾種所需要的指令:
1、include指令
格式:
[java] view plaincopy
<%@ include file = "相對 / 絕對 路徑"%>
這是幹什麼的呢?這個是用來在 JSP 文件編譯之時,加載需要插入的文本或代碼。就如同 ASP 中的“<!-- include file = "index.asp"-->”,或者在 PHP 中的“<?php include("index.php"); ?>”一樣。
舉個栗子:
index.jsp
[html] view plaincopy
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<p>加載 head.jsp</p>
<%@include file = "head.jsp"%>
<p>完成 head.jsp</p>
<p>由於指令是用於通知 JSP 引擎如何 JSP 頁面,所以在編譯前,會先通過指令來決定如何編譯 JSP 頁面</p>
<p>取得 head.jsp 文件中的 i 的值:<%= i%></p>
</body>
</html>
head.jsp
[java] view plaincopy
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%
int i = 1;
%>
<p>這裏是 head.jsp</p>
執行結果:
我們可以看到,在 JSP 引擎編譯前,先會讀取指定,並通過 include 指令將兩個頁面合在一起。比如上例,index.jsp 使用 include 指令,將 head.jsp 加載到 include 指令所在處。
2、page指令
格式:
[java] view plaincopy
<%@ page
[language="java"]
[import="{package.class | package.*},……"]
[extends="package.class"]
[session="true | false"]
[buffer="none | 8Kb | sizeKb"]
[autoFlush="true | false"]
[isThreadSafe="true | false"]
[info="text"]
[errorPage="relativeURL"]
[contentType="mimeType[;pageEncode=encode]"|"text/html; charset=utf-8"]
[isErrorPage="true | false"]
%>
這個是不是看起來有點暈暈的。說實話,我也記不下來這麼多。這引起幹什麼的,我通過一個表格讓大家瞭解一下。累死我了。。。這打得。。。
屬性名 | 使用說明 | 範例 |
language | 定義要使用的腳本語言,默認是“Java”,也是目前惟一有效的設定值,故可以不設。該指令作用於整個文本。 | language="java" |
import | 用來導入在後面的代碼中將會乃至的一個或多個包/類。只有import可以在同一頁面,爲一個屬性多次設值。多個屬性請用“,”分開。說白了,就是和 Java 導入類包一個。只不過形式變了。 | import="java.util.*" |
extends | 定義 JSP 編譯時需要繼承的 Java 父類。 | extends="father.class" |
session | 設置在當前頁中是否允許有Session操作——也就是Session開關。true:允許(默認);false:算了吧。 | session="true" |
errorPage | 設定如果頁面出現異常,且沒有捕獲跳往何處? | errorPage="相對URL" |
isErrorPage | 當前頁是否可以作爲其它 JSP 頁面的異常處理頁?true:允許;false:算了吧(默認)。 | isErrorPage="false" |
contentType | 設定輸出的MIME類型和 JSP 文件編碼。默認是text/html,默認字符爲ISO-8859-1 | <%@page contentType="text/html" pageEncoding="UTF-8"%> |
isThreadsafe | 是否支持多線程?爲true,可以同時執行多個用戶請求,爲false就表明哥只能管一個人。默認爲大多數:true | isThreadsafe="true" |
buffer | 設定 JspWrite類型預定義對象 out 緩衝區大小。 | buffer="none" |
autoFlush | 設置緩衝區被填滿時是否自動刷新。 | autoFlush |
info | 用來定義一個將加入到已編譯成功的頁面中的字符串 | info="text" |
其實,在這裏面,我們基本上只用到 import、errorPage 還有 contentType,其它的很少用。
3、taglib指令
格式:
[java] view plaincopy
<%@ taglib uri="URIToTagLibrary" prefix="tagPrefix" %>
tablib 指令用於定義一個標記庫以及標記的前綴。什麼意思呢?這是教科書上給的定義。我也沒明白。最後,我查了一些書才明白什麼意思,這玩意就是用來定義和訪問自己所定義的標籤。相關的內容,我會在以後和大家談論。現在先給大家留個懸念(其實是手打字打麻了——一會兒老爸還要強制本少幹家務)。
(六)動作
在世紀中國武打片振撼了整個美國。最著名的,且幾乎無法超越的當屬李小龍。
大家別誤會,我不是要給大家放電影看。我只是想說,JSP 也是位動作迷。他爲自己也創造了一種叫“動作”的功能——還好沒叫功夫。
JSP 動作是用來控制 JSP 引擎行爲,執行一些標準常用的 JSP 頁面的動作。那具體什麼是動作呢?這個我在下次在“JSP基礎語法【二】”中,花一章節的內容來告訴大家。畢竟今天的內容太多了。如果消化不了可不成。呵呵,下次見。