JSP 入門

All examples are solely used for educational purposes. This document is provided as is. You are welcomed to use it for non-commercial purpose.

Written by: 國立中興大學資管系呂瑞麟 Eric Jui-Lin Lu 在以下的範例中,我們假設你已經在你自己的電腦上面安裝好了 Apache Tomcat 而且 port 為 8080。如果你還沒安裝好,你可以 參考 安裝 Tomcat 5.5.x

請勿轉貼

看其他教材


目錄

  1. Hello World -- JSP
  2. 互動式 Hello World -- JSP
  3. JSP 存取資料庫
  4. JSP 生命週期
    1. <%! %>
    2. <%@ include %>
  5. 從 web.xml 讀取初始值
  6. Cookie
  7. Session
  8. Custom Tag Library

這篇 JSP 入門的介紹非常精簡,它假設讀者已經熟悉了 Java 程式語言, 關聯性資料庫 SQL 語法,以及大概看過了Java Servlet 入門

Hello World -- JSP

JavaServer Page (JSP) 和 Java Servlet 一樣都是伺服器端的程式, 功能也差不多,只是語法與使用上比較像 PHP 和 ASP 之類的 script 語言。也因為如此,JSP 避免了許多在 Java Servlet 中必須出現的 println() 之類的敘述。可是 JSP 也跟 PHP 和 ASP 一樣比較難 debug。

首先我們先看一個小程式 -- Hello World -- JSP 版。請將這個網頁命名為 Hello.jsp 並將他 置放於 tomcat/webapps/test 的目錄內。為了能夠執行以下程式, 我們假設你們已經安裝好了 Apache Tomcat。

<html>
<head>
<title>
Hello World
</title>
</head>

<body>
<% String s = "Eric"; %>
<h1>Hello <%=s%></h1>
</body>
</html>
如果你能夠正確無誤的執行上面這一個範例,你可以檢查一下在 tomcat/work/DEFAULT 的目錄裡面有一個叫做 test 的子目錄,而這個子目錄裡面有 compile 好的 Hello_1.java 以及 Hello_1.class 檔。為什麼會有這兩個檔案呢?原來當使用者要求 Hello.jsp 的時候,Tomcat 會把 jsp 檔先轉換成 java 檔,然後再把 java compile 成 class 檔,最後才執行這個剛產生 的 class 檔。而這些新產生的 java 和 class 檔都會被放置在 tomcat/work 目錄之下。當這個 jsp 檔被再次呼叫的時候, Tomcat 會直接執行 tomcat/work 內的 class 檔。

互動式 Hello World -- JSP

以下只是使用 HTML 表格的部分元件範例,其他的元件請自行學習或者可以參考作者 非長久以前所寫的 Form Pages

JSP 存取資料庫

存取資料庫的常見方式有兩種,分別是利用 JDBC-ODBC 以及純 JDBC 驅動程式兩種。JDBC-ODBC 的好處在於不必另外安裝驅動程式以避免 不必要的麻煩,但是其事前的準備動作(例如設定 DSN 等)以及存取速度比 純 JDBC 慢則是它的缺點。在這一段文件,我們分別提供一個範例程式來說明 這兩種方式。
  1. JDBC-ODBC 驅動程式:
  2. 純 JDBC 驅動程式:

JSP 的生命週期

JSP 的生命週期跟 servelt 很像,根據 Sun 的文件:一旦 JSP 的網頁被轉換成 servlet(ie. translate)以及編譯之後,這個 JSP servlet 的生命週期基本上 就會遵循 servlet 的生命週期。JSP 生命週期如下所述:
  1. 如果 JSP 網頁的 servlet 物件不存在,那麼 tomcat 會:
    1. 載入這個 JSP servlet 的類別
    2. 產生並初始化這個類別的物件
    3. 一旦物件形成了之後,tomcat 會經由 jspInit 方法來呼叫這個物件
  2. 如果 JSP 網頁的 servlet 物件存在,那麼 tomcat 會呼叫這個物件的 _jspService 方法,並將 requestresponse 的物件傳遞給它。
如果 tomcat 需要移除某個JSP 網頁的 servlet 物件,它會呼叫該物件的 jspDestroy 方法。

在了解的 JSP 的生命週期之後,我們可以讓包含有資料庫連線的 JSP 網頁更有效率。 仔細觀察之前 JSP 與資料庫的範例:在該範例中(其實所有資料庫連線的 JSP 網頁 都可以檢查),每一次使用者要求執行該程式的時候,它都會產生 一個 connection 物件,這樣子一來,由於 (1) 產生 connection 的成本很高, 且 (2) 每一個資料庫伺服器能接受的 connection 數又有上限的限制, 這會造成這個程式非常沒有效率。根據之前所說明的 JSP 生命週期,我們能不能 重新修改這個程式使其更有效率?

從 web.xml 讀取初始值

在之前連結資料庫的範例中,我們都需要經由 HTML 表單元件中指定某些 參數(例如,表格或者 dsn 名稱)或者執行程式前的某些特定的初始值 (例如,JDBC 的驅動程式名稱)。這些初始值當然可以像之前的範例中 將它設定在程式碼中,但是這樣的作法不太有彈性。假設 dsn 或者 JDBC 驅動程式的名稱必須依據環境的變動而改變的時候,我們必須找出所有的程式碼, 然後在更改完正確的名稱之後,還要重新編譯程式,這樣一來非常沒效率; 更何況,如果漏了改幾個程式,這所衍生的麻煩不知道有多少。

為了解決這個問題,大多數系統開發人員會利用設定檔的方式來進行; 也就是說,我們把這些可能改變的資訊,放在一個設定檔中,然後每次執行 程式的時候,該程式會從設定檔讀取最新的資訊。Java 常用的設定檔 有兩個格式:一個是 使用 Properties 來初始化你的程式(Properties 是 java.util.Properties 物件), 另一個是 XML,而 tomcat 對於所有 JSP/servlet 的設定是由 web.xml 負責。

web.xml 內的資料分成兩種:一種是只能讓某些特定 JSP/servlet 讀取的資料 (在本範例中就是 HelloParam.jsp), 另一種是允許在某特定目錄(在本範例中就是 tomcat/webapps/test; 其實它比較正式的說法是"某特定 application"、"某特定 web application"、 或者"某特定 context")內所有 JSP/servlet 都能讀取的資料。 首先,我們先說明第一種資料的存取方式。

如果要讀取 web.xml 內設定給某特定 JSP/servlet(在本範例中為 HelloParam.jsp )的資料,我們利用 JSP 定義的一個內建物件 config, 而這個物件的類別是 javax.servlet.ServletConfig。

如果要讀取 web.xml 內設定給"該 application"的資料,我們可以利用 JSP 定義的一個內建物件 application,而這個物件的類別是 javax.servlet.ServletContext。

Cookie

The HTTP protocol does not support persistent information that could help a web server determine that a request is from a particular client. 例如,某些網頁需要知道使用者是否 已經登入,若已經登入便可以看網頁的內容,否則要求使用者登入。 一般來說,有兩種方式可以讓 web server 經由 persistent information 來判斷,而這兩種方法為 Cookie 和 Session。

Cookie 是儲存於客戶端(browser 內)的資料。由於這是一種由 伺服器端的程式傳送資料到客戶端的一種簡易的方式,因此被大量 的使用於 web 為主的系統中,例如客戶輸入的資料,客戶的偏好 等等。這些資料先由伺服器端的程式寫到客戶端,然後之後的聯繫便可以 從這些資料來提供不同的服務。例如我們可以將使用者的帳號以及 密碼存放在 cookie 內,下一次使用者要登入的時候,就可以從 cookie 來判斷,如果已經存在就不需要再輸入一次。

不過,cookie 也有一些限制,例如一個 cookie 不可以超過 4KB, 而瀏覽器也會對 cookie 的總數作限制,cookie 有可能會有不見的 時候,所以程式寫作的時候要謹慎。另外,由於 cookie 大家都能 讀取,因此也有安全上的考量。

Custom Tag Library

Custom Tag Library 是一種 JSP 的特殊使用的標籤,它允許開發人員 以自訂的標籤名稱來(如 XML )達成某些目標。為了達成上述之目標, 你需要定義一個 TLD 檔(tag library descriptor)來描述開發人員自訂 標籤的相關訊息,例如標籤名稱 name,tag 所符合的 tlibversionjspversion 等。除此之外,你也需要定義一個 tag 的處理器, 也就是說當 jsp engine 處理到這個自訂的 tag 之後,他所需要去呼叫 的程式,而由這個程式來處理這個 tag 的內容以及功能。

在以下的例子中,我們希望定義一個 hello 的標籤,而這個 標籤內有一個 name 的屬性,我們的 jsp engine 碰到 hello 時,就會把 name 的屬性以 table 的方式呈現。這個例題是從 Sue Spielman 的文章修改而成。


Last Updated: Monday, 30-May-2011 16:41:27 CST
Written by: 國立中興大學資管系呂瑞麟 Eric Jui-Lin Lu