JSP與Servlet

tonyscau發表於2008-04-15

課前索引

1 動態網頁和靜態網頁有什麼區別?
2
什麼是Web應用程式?
3
什麼是Servlet,和一般Java程式有什麼區別?
4
什麼是JSP,和Java是什麼關係?
5
JSPServlet有哪些異同點?
6
JSPServlet的主要用途?
101 Servlet的概念、配置與執行

10.1.1 Java Servlet的概念  Java Servlet是一個專門用於編寫網路伺服器應用程式的Java元件。所有基於Java的伺服器端程式設計都是構建在Servlet之上的。在J2EEServlet已經是一個標準的元件。

J2EE中跟Servlet相關的一個包是javax.servlet,其中最基本的Servlet被宣告為一個介面javax.servlet: Interface Servlet,這是Servlet最高層次的一個抽象,它是和網路協議無關的。同樣在javax.servlet中,實現了一個類 javax.servlet: class GenericServlet,這個類實現了Servlet介面,也是和協議無關的。而這個類是構建其他和協議相關的Servlet子型別的通用的父類(至少HttpServlet是從它繼承而來的,從它的名字也能看出這一點)。

也就是說Servlet所適用的網路協議可以是多種多樣的,比如HTTPFTPSMTPTELNET等,但是就目前而言,只有HTTP服務已經形成了標準的Java元件。對應的軟體包有兩個javax.servlet.httpjavax.servlet.jsp,分別對應我們要講解的ServletJSP程式設計。我們通常所說的Servlet程式設計主要就是指標對HTTPServlet程式設計,用到的就是javax.servlet.http包中的類(典型的就是HttpServlet類),實際上Java Servlet程式設計的概念要更廣一些,在這裡我們也就約定俗成的使用Servlet來指代HTTP Servlet的程式設計,這點讀者是需要了解的。由於JSP最終都是要經過JSP引擎轉換成Servlet程式碼的,而且Servlet程式設計和一般的Java程式設計是沒有大的區別的,只需要瞭解一定的規範即可,所以我們在這裡先講解Servlet的程式設計,這樣對以後理解JSP是很大的有好處的,儘管在使用的時候可能JSP更為簡單一些。  目前,Servlet引擎一般是第三方的外掛,它透過一定的方法連線到Web伺服器,Servlet引擎把它識別為Servlet請求的那些HTTP請求截獲下來處理,而其他的HTTP請求由Web伺服器按照通常的方式來處理,Servlet引擎會裝載合適的Servlet到記憶體中,如果Servlet還沒有執行的話,會分配一個可以使用的執行緒來處理請求,再把Servlet的輸出返回到發出請求的Web客戶機。  Java ServletJava Applet正好是相對應的兩種程式型別,Applet執行在客戶端,在瀏覽器內執行,而Servlet在伺服器內部執行,透過客戶端提交的請求啟動執行,讀者在學習過程可以作簡單的比較。

由於Servlet是用Java編寫的,所以它與生俱來就有跨平臺的特性,因此Servlet程式的設計完全和平臺是無關的,同樣的Servlet完全可以在ApacheIIS等不同Web伺服器上執行,不管底層的作業系統是WindowsSolarisMacLinux還是其他的能支援Java的作業系統。  Servlet是跟普通的Java程式一樣,是被編譯成位元組碼後由JVM執行的。相比傳統的CGI,儘管CGI是用原生程式碼直接執行的,但是由於每次客戶端發出請求,伺服器必須啟動一個新的程式來處理請求,這就把高負載強加給了伺服器資源,尤其如果CGI使用指令碼語言編寫時,如perl,伺服器還必須啟動語言解釋程式,程式越多,佔用的記憶體就越多,消耗CPU也越多,嚴重影響系統效能。  Servlet執行於Servlet引擎管理的Java虛擬機器中,被來自客戶機的請求所喚醒,與CGI不同的是,在虛擬機器中只要裝載一個Servlet就能夠處理新的請求,每個新請求使用記憶體中那個Servlet的相同副本,所以效率比CGI來得高。如果採用伺服器端指令碼,如ASPPHP,語言解釋程式是內建程式,因此可以加快伺服器的執行,但是效率還是比不上準編譯的Servlet。實際的使用也已經證明,Servlet是效率很高的伺服器端程式,很適合用來開發Web伺服器應用程式。  Java Servlet有著十分廣泛的應用。不光能簡單的處理客戶端的請求,藉助Java的強大的功能,使用Servlet還可以實現大量的伺服器端的管理維護功能,以及各種特殊的任務,比如,併發處理多個請求,轉送請求,代理等

10.1.3 Servlet的執行環境

典型的Servlet執行環境有JSWDKTomcatResin等,這幾個都是免費的軟體,適合用來學習ServletJSP。它們都自帶一個簡單的HTTP Server,只需簡單配置即可投入使用,你也可以把它們繫結到常用的Web伺服器上,如ApacheIIS等,提供小規模的Web服務。還有一些商業的大中型的支援ServletJSPWeb伺服器,如JRunWeb SphereWeb Logic等等,配置比較複雜,並不適合初學者。但是功能較為強大,有條件的讀者可以一試。

10.1.7 Servlet的編譯

Servlet的編譯和一般的Java程式是完全一樣的,在使用javac編譯的時候不需要任何特殊的引數。只要Servlet的編寫是正確的,編譯完後生成的Class檔案就可以做為Servlet來執行了。簡單示例:

import java.io.*;
   import java.util.*;
   import javax.servlet.http.*;
   import javax.servlet.*;
   
//匯入必要的包

   public class HelloServlet extends HttpServlet {
          
//所有Servlet必須從HttpServlet派生
     public void doGet (HttpServletRequest req, HttpServletResponse res)
     throws ServletException, IOException
     
//doGet()是這個Servlet的核心,真正處理請求的地方
   {
   res.setContentType("text/html");
     
//設定相應的型別為text/html
   PrintWriter pw = res.getWriter();
     
//從HttpServletResponse得到輸出流

   pw.println("");
   pw.println("");
   pw.println("");
   pw.println("<!-- The Servlet expression tags interpolate script variables into the HTML --&gt");
   pw.println("Hello, world!");
   pw.println("");
   pw.println("");
   pw.println("

Hello, world!

");
   pw.println("");
   
//上面的語句都是向客戶端列印HTML文字
   pw.close();
   
//關閉HttpServletResponse,使Web伺服器知道相應結束
  }
  public HelloServlet() {}
//建構函式,可以不要
 }

102 Servlet的應用例項

10.2.1 Servlet與表單互動的方法

表單是HTML中使用最廣泛的傳遞資訊的手段。搞清楚Servlet與表單的互動,就在客戶端與伺服器之間架起了一座橋樑。Servlet使用HttpServlet類中的方法與表單進行互動。在HttpServlet類中有幾個未完全實現的方法,你可以自己定義方法的內容,但是必須正確使用方法名稱以使HTTP Server把客戶請求正確的對映到相應的函式上。  doHeader 用於處理HEADER請求  doGet 用於處理GET請求,也可以自動的支援HEADER請求  doPost 用於處理POST請求  doPut 用於處理PUT請求  doDelete 用於處理DELETE請求  HttpServletService方法,當它接收到一個OPTIONS請求時,它會自動呼叫doOptions方法,當接收到一個TRACE請求時呼叫doTraceDoOptions預設執行方式是自動決定什麼樣的HTTP被選擇並返回哪個資訊。  在使用這些方法時必須帶兩個引數。第一個包含來自客戶端的資料HttpServletRequest。第二個引數包含客戶端的相應HttpServletResponse

一個HttpServletRequest物件提供請求HTTP頭部資料,也允許獲取客戶端的資料。怎樣獲取這些資料取決於HTTP請求方法。  不管何種HTTP方式,都可以用getParameterValues方法返回特定名稱的引數值。

HttpServletRequest,HttpServletResponse介面分別繼承於ServletRequestServletResponse介面,getParameterValuesgetWriter方法都是其祖先介面中的方法)  對於HTTP GET請求的方式,getQueryString方法將會返回一個可以用來解剖分析的引數值。  對於用HTTP POSTPUTDELETE請求的方式,HttpServletRequest有兩種方法可以選擇:如果是文字資料,你能透過getReader的方法得到BufferedReader獲取資料;如果是二進位制資料,可以透過getInputStream方法得到ServletInputStream獲取資料。  為了相應客戶端,一個HttpServletResponse物件提供返回資料給使用者的兩個方法:一種是用getWriter方法得到一個PrintWriter,用於返回文字資料;另一種方法是用getOutputStream方法得到ServletOutputStream,用於返回二進位制資料。在使用WriterOutputStream之前應先設定頭部(HttpServletResponse中有相應的方法),然後用WriterOutputStream將相應的主體部分發給使用者。完成後要關閉WriterOutputStream以便讓伺服器知道相應已經結束。

例:PrintWriter out = response.getWriter();     out.println("Request URI: " + request.getRequestURI()+"
");
      

我們知道在同一臺機器上,所有的編碼方式都是一樣的,一般中文平臺是gb2312,英文平臺是ISO-8859-1,但是網路上的兩臺機器並不能保證他們的編碼方式都是一樣的,這時候就有可能出現亂碼的問題。在進行HTTP網路傳輸的時候,統一採用的編碼方式是ISO-8859-1,這時候如果還是按照本地編碼來傳輸就會出現問題,這也是Servlet在實現網路傳輸的時候一個不完美的地方,它不會自動進行本地編碼到ISO-8859-1的轉換,所以直接列印的話就會出現亂碼。原理上講任何出現列印字串的地方,都是需要進行編碼轉換的,但是西文字元在不同字符集下對應相同的編碼,以在列印西文字元的時候就不需要轉換了。在Servlet後繼的規範中可能會改變這種麻煩的狀況。不同的是,從網路提交的表單資料,Servlet是自動把它轉換成本地編碼的,所以程式中得到的name字串變數是gb2312編碼的,同樣需要進行轉換後才能在客戶端正確列印。  字元編碼轉換常用的方法是  String native_encoded = "中文字串";             //本地編碼的字串  Byte[] byte_array = native_encoded.getBytes();             //得到本地編碼的位元組陣列  String net_encoded = new String(native_encoded, "ISO-8859-1");             //生成ISO-8859-1編碼的字串

例:out.println(new String(new String("

你的姓名:").getBytes(),"ISO-8859-1"));

10.2.3 Servlet控制會話

會話狀態的維持是開發Web應用所必須面對的問題,有多種方法可以來解決這個問題,如使用Cookieshidden型別的表單域,或直接把狀態資訊加到URL中等,還有Servlet本身提供了一個HttpSession介面來支援會話狀態的維持,在這裡我們主要介紹基於這個介面的會話狀態的管理。

Session的發明是為了填補HTTP協議的侷限。請注意HTTP協議是如何工作的--使用者發出請求,伺服器作出響應,這種使用者端和伺服器端的聯絡就是離散的,非連續的。HTTP協議不能提供允許伺服器跟蹤使用者請求的功能。在伺服器端完成響應使用者的請求之後,伺服器不能繼續與該瀏覽器繼續保持連線。從伺服器這端來看,每一個請求都是獨立的,因此HTTP協議被認為是無狀態協議,當使用者在多個主頁間切換時,伺服器無法知道他的身份。Session的出現就是為了彌補這個侷限。利用Session,您就可以當一個使用者在多個主頁間切換的時候也能儲存他的資訊。這樣很多以前根本無法去做的事情就變得簡單多了。
在訪問者從到達某個特定的主頁到離開為止的那段時間,每個訪問者都會單獨獲得一個Session  Java Servlet定義了一個HttpSession介面,實現的Session的功能,在Servlet中使用Session的過程如下:   1

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7558084/viewspace-1002580/,如需轉載,請註明出處,否則將追究法律責任。

相關文章