JSP簡明教程 令人興奮的指令碼程式設計

2022-10-06 00:27:24 字數 4221 閱讀 9215

如果你是直接使用j**a servlets,那你將不得不在j**a類中處理http輸入和html輸出,你需要豐富的j**a程式設計經驗來構建複雜的應用程式。jsp的加入,使你可以把html的表達邏輯從植入servlets中的複雜的商務邏輯區分開來。這意味著可以由有經驗的指令碼編寫者來編寫表達層**,而高階的j**a開發者能夠集中精力去解決servlets和bean中更為複雜的問題。

不管你有沒有j**a程式設計知識,都能夠使用jsp。jsp包含了一些伺服器端的標籤,使得不用寫一行j**a**就能顯示動態資料。你可以直接訪問bean來www.cppcns.com完成操作,然後使用jsp標籤把結果顯示為動態內容。你還可以用servlets生成bean,servlets 操作的運算結果存於其中,然後再使用jsp標籤顯示結果,同樣不需要在jsp頁中寫j**a**。

有三種方式可以用來在你的網頁中加入j**a**:

1、使用declarations(宣告),可以定義全域性變數或是在頁內任何地方都可以訪問的j**a方法。宣告被包含在標記中。

2、使用scriptlets(指令碼片斷),你能書寫頁內處理所需的任何邏輯,它們包含在標記內。

3、expressions(表示式),包含於中。它提供一種簡單的方法來顯示j**a表示式的結果。被附加上的表示式將被計算並在頁面上顯示出來,就好像你已經在**中明確寫出了運算結果的數值一樣。

在你自己編寫的**中,可以使用一些隱含變數(implicit variables)――jsp提供的預定義的j**a物件。另外,通過使用jsp的指令(directives), 還可以包含非j**a**模組,比如來自其他檔案的html文字。

下面我們來仔細看一看這些指令碼元素,在編寫你自己的jsp指令碼時將會經常用到它們。

directives(指令)

jsp定義了三個頁內指令用於設定jsp引數或擴充**。它們是 page,include和taglib,必須寫在jsp頁的第一行。語法如下:

page指令允許你為網頁設定一些基本引數,包括設定所用指令碼語言的引數(預設為j**a)、你的指令碼片斷中引入的j**a類、設定輸出緩衝區等等。完整的page指令參數列見《jsp specification version 1.0》(《jsp規範1.0》)的2.8.1章。

使用include指令,可以包含其他檔案的內容,比如存於單獨檔案中的html報頭和頁程式設計客棧腳。

taglib指令用於擴充標準的jsp標籤集,這超出了本文的討論範圍。然而,了解jsp定義了一種擴充其標籤集的方法還是很有好處的,當你是乙個軟體商,想擴充jsp的原始功能而又不想破壞其相容性時,這一點尤為重要。

declarations(宣告)

使用declarations,你可以在jsp頁中定義方法或變數,它們可被同一頁中的其他**訪問。在大多數情況下,你可能會在自己的bean中定義方法。然而,有時候在網頁內定義方法可能更方便一些,尤其是當**只用於單一頁面時。不論定義方法還是變數,宣告都包含在標記內。

注意,宣告並不在jsp頁內產生任何輸出。它們僅僅用於定義,而不生成輸出結果。要生成輸出結果,你應該用jsp表示式或指令碼片斷。

expressions(表示式)

expressions是一種非常簡單的jsp標籤,它用來把在中定義的jsp表示式的值轉換成字串並將這個值以動態文字的形式送出。expression的確是一條生成文字的捷徑,有了它,你不必在每次要顯示一段動態文字的時候都去呼叫print()方法。典型的應用就是,你可以用expressions顯示簡單的變數值或bean中的方法的返回值。

例如,下面的**將會生成getname()方法的返回值:

事實上,在生成動態輸出之前,jsp必須把方法的返回值轉變為j**a中的string物件。jsp規範中詳細描述了在jsp表示式中,什麼樣的j**a型別和j**a類會被轉變成字串。

scriptlets(指令碼片斷)

到現在為止你已經學會了使用指令來引入任何j**a類或j**a包,你能定義頁面級的方法或變數並在頁中使用它們,你還可以使用提供普通web處理功能的隱含變數。還能在jsp頁內做些什麼就取決於你了,因為你可以在scriptlets(指令碼片斷)裡程式設計客棧編寫任何你想要的j**a**,如下所示:

通過在page指令中使用import引數,你可以從指令碼片斷內呼叫所有j**a api。因為你寫的所有jsp**實際上都被編譯構成j**a servlet,它本身就是乙個j**a類,所以你所用的語言本身就是j**a,而不是任何一種修改或整理過的版本。這就像在ssjs中你可以編寫任何**一樣。而與ssjs不同,在jsp中你有權使用整套豐富的j**a api,因此幾乎沒有任何侷限性。

implicit variables(隱含變數)

前面提到過,jsp定義了一些隱含變數(即j**a 物件)供你在表示式和指令碼片斷中使用。《jsp specification version 1.0》的表2-2列出了jsp1.0中可用的隱含變數。這裡列出一些常用的物件:

out物件,型別為j**ax.servlet.jsp.jspwriter,提供對方法(例如print()方法)的訪問,用來在指令碼片斷內生成輸出結果。

request物件直接與j**a中的j**ax.servlet.http.httpservletrequest類對應,具有該類的物件的一切屬性和方法。舉個例子,要獲取乙個從html表單或url查詢字串傳入的值,可以呼叫request.getparameter()方法,根據名字獲取參量。

response物件與j**a中的j**ax.servlet.http.httpservletresponse類對應,提供對你的網頁產生的html響應的引數的訪問權。因此,要在jsp頁返回的html響應報頭中加入乙個值,你就可以呼叫the response.setheader() 方法來實現。

另乙個簡單的例子

在下面的例子中,我們來看一看乙個表單和它的jsp表單控制代碼之間的互動過程。使用前面討論過的指令碼元素,我實現了乙個簡單的web站點回饋表單(見圖2)和乙個jsp表單控制代碼用來驗證輸入,然後有條件地地生成基於回饋的輸出。

圖2.乙個web站點回饋表單

圖中按鈕:submit query--提交;reset――重填

表單控制代碼將會檢驗名稱和意見欄以確定它們已被填寫,如果其中任何乙個或兩個是空白的,表單控制代碼會生成一條錯誤資訊;否則它將繼續檢視使用者意見是否與預先設定的字串匹配。如果匹配,它就輸出一條專門的資訊;否則輸出「thank you」。

例2 feedback results

// 姓名和意見欄不能為空白

// 檢查它們的值並返回結果

boolean validateinput(string name, string comment) // 結束輸入驗證validateinput

// 根據表單上的意見欄輸出結果

string getstringcheese (string comment) //結束 getstringcheese

%>

// 獲取通過表單提交的資料

string name = request.getparameter("name");

string age = request.getparameter("age");

string comment = request.getparameter("comment");

boolean isvalid;

isvalid = validateinput(name, comment);

// 根據使用者是否未填寫姓名或意見欄決定輸出內容

if (isvalid) //結束 else 程式段

%>

這個例子假定使用者輸入的意見是「i like cheese."(我喜歡乳酪)在**中可以看到,這一響應是為填寫這條意見的使用者定製的。表單控制代碼將會返回如圖3所示的頁面:

圖3.表單控制代碼輸出

圖中文字:謝謝你的反饋!我們也喜歡乳酪。

這個例子非常簡單易懂。即便你只是乙個j**ascript程式設計師,你也應該可以理解它。我還要指出這個例子中體現的在jsp規範中並不很明顯的一些特性。首先,請注意我在宣告部分(中的部分)定義了一些方法,與在j**a類中定義方法一模一樣。這是因為jsp引擎把這些方法轉變為底層的j**a servlets,在瀏覽器向網頁發出請求時由伺服器來執行它們。因此,任何變數和方法的定義都必須遵守標準的j**a語法。

還應注意到,在我的指令碼片斷的**中,我把乙個if...else語句分開了,它跨越了兩個不同的指令碼片斷段。這完全是合法的!不僅合法,而且把指令碼片斷**和靜態html交叉起來是有條件生成html的好辦法,就像我在本例中所做到的一樣。

最後,你可以看到我通過呼叫request.getparameter()方法取得表單元素的值並把它賦給乙個臨時變數。這是處理從表單或查詢字串輸入的值的標準方法。

本文位址:

JSP簡明教程(三) JSP隱含物件

所謂隱含物件就是已經被系統定義好的一些物件,可以直接使用。jsp中有以下幾個隱含物件 request response out 可以使用out.flush來將緩衝區中的資料全都傳送到客戶端。session config pagecontext 與jsp頁面的上下文有關。page 在jsp頁面中相當於...

C 8 0的三個令人興奮的新特性

c 語言是在2000發布的,至今已正式發布了7個版本,每個版本都包含了許多令人興奮的新特性和功能更新。同時,c 每個版本的發布都與同時期的 visual studio 以及 net 執行時版本高度耦合,這也有助於開發者更好的學習掌握 c 並將其與 visual studio 以及 net 的使用結合...

C 8 0的三個令人興奮的新特性

c 語言是在2000發布的,至今已正式發布了7個版本,每個版本都包含了許多令人興奮的新特性和功能更新。同時,c 每個版本的發布都與同時期的 visual studio 以及 net 執行時版本高度耦合,這也有助於開發者更好的學習掌握 c 並將其與 visual studio 以及 net 的使用結合...