JSP與Servlet
1. 動態網頁和靜態網頁有什麼區別?
2. 什麼是Web應用程式?
3. 什麼是Servlet,和一般Java程式有什麼區別?
4. 什麼是JSP,和Java是什麼關係?
5. JSP和Servlet有哪些異同點?
6. JSP和Servlet的主要用途?
10.1 Servlet的概念、配置與執行
10.1.1 Java Servlet的概念 Java Servlet是一個專門用於編寫網路伺服器應用程式的Java元件。所有基於Java的伺服器端程式設計都是構建在Servlet之上的。在J2EE中Servlet已經是一個標準的元件。
在J2EE中跟Servlet相關的一個包是javax.servlet,其中最基本的Servlet被宣告為一個介面javax.servlet: Interface Servlet,這是Servlet最高層次的一個抽象,它是和網路協議無關的。同樣在javax.servlet中,實現了一個類 javax.servlet: class GenericServlet,這個類實現了Servlet介面,也是和協議無關的。而這個類是構建其他和協議相關的Servlet子型別的通用的父類(至少HttpServlet是從它繼承而來的,從它的名字也能看出這一點)。
也就是說Servlet所適用的網路協議可以是多種多樣的,比如HTTP,FTP,SMTP,TELNET等,但是就目前而言,只有HTTP服務已經形成了標準的Java元件。對應的軟體包有兩個javax.servlet.http和javax.servlet.jsp,分別對應我們要講解的Servlet和JSP程式設計。我們通常所說的Servlet程式設計主要就是指標對HTTP的Servlet程式設計,用到的就是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 Servlet和Java Applet正好是相對應的兩種程式型別,Applet執行在客戶端,在瀏覽器內執行,而Servlet在伺服器內部執行,透過客戶端提交的請求啟動執行,讀者在學習過程可以作簡單的比較。
由於Servlet是用Java編寫的,所以它與生俱來就有跨平臺的特性,因此Servlet程式的設計完全和平臺是無關的,同樣的Servlet完全可以在Apache,IIS等不同Web伺服器上執行,不管底層的作業系統是Windows,Solaris,Mac,Linux還是其他的能支援Java的作業系統。 Servlet是跟普通的Java程式一樣,是被編譯成位元組碼後由JVM執行的。相比傳統的CGI,儘管CGI是用原生程式碼直接執行的,但是由於每次客戶端發出請求,伺服器必須啟動一個新的程式來處理請求,這就把高負載強加給了伺服器資源,尤其如果CGI使用指令碼語言編寫時,如perl,伺服器還必須啟動語言解釋程式,程式越多,佔用的記憶體就越多,消耗CPU也越多,嚴重影響系統效能。 Servlet執行於Servlet引擎管理的Java虛擬機器中,被來自客戶機的請求所喚醒,與CGI不同的是,在虛擬機器中只要裝載一個Servlet就能夠處理新的請求,每個新請求使用記憶體中那個Servlet的相同副本,所以效率比CGI來得高。如果採用伺服器端指令碼,如ASP,PHP,語言解釋程式是內建程式,因此可以加快伺服器的執行,但是效率還是比不上準編譯的Servlet。實際的使用也已經證明,Servlet是效率很高的伺服器端程式,很適合用來開發Web伺服器應用程式。 Java Servlet有著十分廣泛的應用。不光能簡單的處理客戶端的請求,藉助Java的強大的功能,使用Servlet還可以實現大量的伺服器端的管理維護功能,以及各種特殊的任務,比如,併發處理多個請求,轉送請求,代理等
10.1.3 Servlet的執行環境
典型的Servlet執行環境有JSWDK,Tomcat,Resin等,這幾個都是免費的軟體,適合用來學習Servlet和JSP。它們都自帶一個簡單的HTTP Server,只需簡單配置即可投入使用,你也可以把它們繫結到常用的Web伺服器上,如Apache,IIS等,提供小規模的Web服務。還有一些商業的大中型的支援Servlet和JSP的Web伺服器,如JRun,Web Sphere,Web 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 -->");
pw.println("
pw.println("");
pw.println("");
pw.println("Hello, world!
");
pw.println("");
//上面的語句都是向客戶端列印HTML文字
pw.close();
//關閉HttpServletResponse,使Web伺服器知道相應結束
}
public HelloServlet() {} //建構函式,可以不要
}
10.2.1 Servlet與表單互動的方法
表單是HTML中使用最廣泛的傳遞資訊的手段。搞清楚Servlet與表單的互動,就在客戶端與伺服器之間架起了一座橋樑。Servlet使用HttpServlet類中的方法與表單進行互動。在HttpServlet類中有幾個未完全實現的方法,你可以自己定義方法的內容,但是必須正確使用方法名稱以使HTTP Server把客戶請求正確的對映到相應的函式上。 doHeader 用於處理HEADER請求 doGet 用於處理GET請求,也可以自動的支援HEADER請求 doPost 用於處理POST請求 doPut 用於處理PUT請求 doDelete 用於處理DELETE請求 HttpServlet的Service方法,當它接收到一個OPTIONS請求時,它會自動呼叫doOptions方法,當接收到一個TRACE請求時呼叫doTrace。DoOptions預設執行方式是自動決定什麼樣的HTTP被選擇並返回哪個資訊。 在使用這些方法時必須帶兩個引數。第一個包含來自客戶端的資料HttpServletRequest。第二個引數包含客戶端的相應HttpServletResponse。
一個HttpServletRequest物件提供請求HTTP頭部資料,也允許獲取客戶端的資料。怎樣獲取這些資料取決於HTTP請求方法。 不管何種HTTP方式,都可以用getParameterValues方法返回特定名稱的引數值。
(HttpServletRequest,HttpServletResponse介面分別繼承於ServletRequest和ServletResponse介面,getParameterValues和getWriter方法都是其祖先介面中的方法) 對於HTTP GET請求的方式,getQueryString方法將會返回一個可以用來解剖分析的引數值。 對於用HTTP POST,PUT和DELETE請求的方式,HttpServletRequest有兩種方法可以選擇:如果是文字資料,你能透過getReader的方法得到BufferedReader獲取資料;如果是二進位制資料,可以透過getInputStream方法得到ServletInputStream獲取資料。 為了相應客戶端,一個HttpServletResponse物件提供返回資料給使用者的兩個方法:一種是用getWriter方法得到一個PrintWriter,用於返回文字資料;另一種方法是用getOutputStream方法得到ServletOutputStream,用於返回二進位制資料。在使用Writer或OutputStream之前應先設定頭部(HttpServletResponse中有相應的方法),然後用Writer或OutputStream將相應的主體部分發給使用者。完成後要關閉Writer或OutputStream以便讓伺服器知道相應已經結束。
例: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("
10.2.3 用Servlet控制會話
會話狀態的維持是開發Web應用所必須面對的問題,有多種方法可以來解決這個問題,如使用Cookies,hidden型別的表單域,或直接把狀態資訊加到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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- jsp servlet javabeanJSServletJavaBean
- Servlet與JSP進階五:瀏覽器CookieServletJS瀏覽器Cookie
- JAVA基礎:JSP與Servlet的區別(轉)JavaJSServlet
- jsp+servlet 練習JSServlet
- EJB/JSP/Servlet Sequence GeneratorJSServlet
- Servlet.service() for Servlet jsp threw exception javax.servlet.ServletException:File "/pageFooServletJSExceptionJava
- Java學習筆記-Day53 Servlet與JSPJava筆記ServletJS
- 《Servlet與JSP核心程式設計》讀書筆記ServletJS程式設計筆記
- jsp隱式物件-Servlet物件JS物件Servlet
- jsp進階教程和ServletJSServlet
- JSP/Servlet基礎語法JSServlet
- 求助servlet&jsp問題ServletJS
- java servlet 與jsp幾種頁面跳轉的方法JavaServletJS
- Servlet與JSP專案實戰 — 部落格系統(下)ServletJS
- 請教高手servlet與JSP頁面的通訊問題?ServletJS
- Day91.Servlet基本內容① -Servlet、jsp和表示式ServletJS
- 如何得到javax.servlet.jsp包?JavaServletJS
- Java Servlet和JSP教程(6)(轉)JavaServletJS
- Java Servlet和JSP教程(7)(轉)JavaServletJS
- Java Servlet和JSP教程(8)(轉)JavaServletJS
- Java Servlet和JSP教程(9)(轉)JavaServletJS
- Java Servlet和JSP教程(10)(轉)JavaServletJS
- Java Servlet和JSP教程(11)(轉)JavaServletJS
- Java Servlet和JSP教程(12)(轉)JavaServletJS
- Java Servlet和JSP教程(13)(轉)JavaServletJS
- Java Servlet和JSP教程(1)(轉)JavaServletJS
- Java Servlet和JSP教程(2)(轉)JavaServletJS
- Java Servlet和JSP教程(3)(轉)JavaServletJS
- Java Servlet和JSP教程(4)(轉)JavaServletJS
- Java Servlet和JSP教程(5)(轉)JavaServletJS
- Jsp+JavaBean模式,Jsp+Servlet模式,MVC模式介紹JSJavaBean模式ServletMVC
- Jsp和Servlet有什麼區別?JSServlet
- maven中新增Servlet和jsp依賴MavenServletJS
- JSP規範、Servlet關係、基礎JSServlet
- 求教jetspeed servlet/jsp,萬分感謝!ServletJS
- 小米商城專案(JSP+Servlet專案)JSServlet
- javaweb關於jsp、servlet基礎筆記JavaWebJSServlet筆記
- jsp+servlet登入註冊頁面JSServlet