3.1 servlet基本結構
下面的**顯示了乙個簡單servlet的基本結構。該servlet處理的是get請求,所謂的get請求,如果你不熟悉http,可以把它看成是當使用者在瀏覽器位址列輸入url、點選web頁面中的鏈結、提交沒有指定method的表單時瀏覽器所發出的請求。servlet也可以很方便地處理post請求。post請求是提交那些指定了method=「post」的表單時所發出的請求,具體請參見稍後幾節的討論。
} 如果某個類要成為servlet,則它應該從httpservlet 繼承,根據資料是通過get還是post傳送,覆蓋doget、dopost方法之一或全部。doget和dopost方法都有兩個引數,分別為httpservletrequest 型別和httpservletresponse 型別。httpservletrequest提供訪問有關請求的資訊的方法,例如表單資料、http請求頭等等。httpservletresponse除了提供用於指定http應答狀態(200,404等)、應答頭(content-type,set-cookie等)的方法之外,最重要的是它提供了乙個用於向客戶端傳送資料的printwriter 。對於簡單的servlet來說,它的大部分工作是通過println語句生成向客戶端傳送的頁面。
注意doget和dopost丟擲兩個異常,因此你必須在宣告中包含它們。另外,你還必須匯入j**a.io包(要用到printwriter等類)、j**ax.servlet包(要用到程式設計客棧httpservlet等類)以及j**ax.servlet.http包(要用到httpservletrequest類和httpservletresponse類)。
最後,doget和dopost這兩個方法是由service方法呼叫的,有時你可能需要直接覆蓋service方法,比如servlet要處理get和post兩種請求時。
3.2 輸出純文字的簡單servlet
下面是乙個輸出純文字的簡單servwww.cppcns.comlet。
} 3.2.2 servlet的編譯和安裝
不同的web伺服器上安裝servlet的具體細節可能不同,請參考web伺服器文件了解更權威的說明。假定使用j**a web server(jws)2.0,則servlet應該安裝到jws安裝目錄的servlets子目錄下。在本文中,為了避免同一伺服器上不同使用者的servlet命名衝突,我們把所有servlet都放入乙個獨立的包hall中;如果你和其他人共用乙個伺服器,而且該伺服器沒有「虛擬伺服器」機制來避免這種命名衝突,那麼最好也使用包。把servlet放入了包hall之後,helloworld.j**a實際上是放在servlets目錄的hall子目錄下。
大多數其他伺服器的配置方法也相似,除了jws之外,本文的servlet和jsp示例已經在bea weblogic和ibm websphere 3.0下經過測試。websphere具有優秀的虛擬伺服器機制,因此,如果只是為了避免命名衝突的話並非一定要用包。
對於沒有使用過包的初學者,下面我們介紹編譯包裡面的類的兩種方法。
一種方法是設定classpath,使其指向實際存放serv的目錄的上一級目錄(servlet主目錄),然後在該目錄中按正常的方式編譯。例如,如果servlet的主目錄是c:\j**awebserver\servlets,包的名字(即主目錄下的子目錄名字)是hall,在windows下,編譯過程如下:
dos> set classpath=c:\j**awebserver\servlets;%classpath%
dos> cd c:\j**awebserver\servlets\hall
dos> j**ac yourservlet.j**a
第二種編譯包裡面的servlet的方法是進入servlet主目錄,執行「j**ac directory\yourservlet.j**a」(windows)或者「j**ac directory/yourservlet.j**a」(unix)。例如,再次假定servlet主目錄是c:\j**awebserver\servlets,包的名字是hall,在windows中編譯過程如下:
dos> cd c:\j**awebserver\servlets
dos> j**ac hall\yourservlet.j**a
注意在windows下,大多數jdk 1.1版本的j**ac要求目錄名字後面加反斜槓(\)。jdk1.2已經改正這個問題,然而由於許多web伺服器仍舊使用jdk 1.1,因此大量的servlet開發者仍舊在使用jdk 1.1。
最後,j**ac還有乙個高階選項用於支援源**和.class檔案的分開放置,即你可以用j**ac的「-d」選項把.class檔案安裝到web伺服器所要求的目錄。
3.2.3 執行servlet
在j**a web server下,servlet應該放到jws安裝目錄的servlets子目錄下,而呼叫servlet的url是http://host/servlet/servletname。注意子目錄的名字是servlets(帶「s」),而url使用的是「servlet」。由於helloworld servlet放入包hall,因此呼叫它的url應該是http://host/servlet/hall.helloworld。在其他的伺服器上,安裝和呼叫servlet的方法可能略有不同。
大多數web伺服器還允許定義servlet的別名,因此servlet也可能用http://host/any-path/any-file.html形式的url呼叫。具體如何進行配置完全依賴於伺服器型別,請參考伺服器文件了解細節。
3.3 輸出html的servlet
大多數servlet都輸出html,而不象上例一樣輸出純文字。要輸出html還有兩個額外的步驟要做:告訴瀏覽器接下來傳送的是html;修改println語句構造出合法的html頁面。
第一步通過設定content-type(內容型別)應答頭完成。一般地,應答頭可以通過httpservletresponse的setheader方法設定,但由於設定內容型別是乙個很頻繁的操作,因此servlet api提供了乙個專用的方法setcontenttype。注意設定應答頭應該在通過printwriter傳送內容之前進行。下面是乙個例項:
} 3.4 幾個html工具函式
通過println語句輸出html並不方便,根本的解決方法是使用j**aserver pages(jsp)。然而,對於標準的servlet來說,由於web頁面中有兩個部分(doctype和head)一般不會改變,因此可以用工具函式來封裝生成這些內容的**。
雖然大多數主流瀏覽器都會忽略doctype行,但嚴格地說html規範是要求有doctype行的,它有助於html語法檢查器根據所宣告的html版本檢查html文件合法性。在許多web頁面中,head部分只包含<title>。雖然許多有經驗的編寫者都會在head中包含許多meta標記和樣式宣告,但這裡只考慮最簡單的情況。
下面的j**a方法只接受頁面標題為引數,然後輸出頁面的doctype、head、title部分。清單如下:
servletutilities.j**a
package hall;
public class servletutilities
// 其他工具函式的**在本文後面介紹
} hellowww2.j**a
下面是應用了servletutilities之後重寫hellowww類得到的hellowww2:
本文標題: 三、第乙個servlet
本文位址:
第乙個程式測試 三
第乙個程式就low一下點亮一下led為了測試開發環境準確無誤。先看一下原理圖 我們看到開發板有3個燈,nled 1 為低電平的時候亮。對應的分別為gpf4 gpf5 gpf6 gpio的控制方法在晶元的手冊的i o port這章。設定這兩個暫存器就可以了 port configuration reg...
python第乙個程式設計 第乙個 Python 程式
簡述 安裝完 python 後,windows 中 開始選單或安裝目錄下就會有 idle 開發 python 程式的基本 ide 整合開發環境 幫助手冊 模組文件等。linux 中 只需要在命令列中輸入 python 命令即可啟動互動式程式設計。互動式程式設計 互動式程式設計不需要建立指令碼檔案,是...
第乙個部落格
我不知道為什麼 我在csdn上創了乙個賬號,又開通了部落格。也許我不是名人,也許幻想著成為名人。在這裡 我不會給任何人許諾,這個部落格可能有乙個博文 有兩個博文 或者會有很多 很多 很多。不過讓我有個大膽的猜想,如果這個部落格在今後有很多很多自己寫的博文,說明我成功了 在自己眼裡 也說明這個方法時正...