1. 程式人生 > >java中 servlet和jsp的概念及區別

java中 servlet和jsp的概念及區別

目錄

一、瞭解Servlet的概念

        Servlet定義:Servlet是基於Java技術的Web元件,由容器管理併產生動態的內容。Servlet引擎作為WEB伺服器

的擴充套件提供支援Servlet的功能。Servlet與客戶端通過Servlet容器實現的請求/響應模型進行互動。

注意:Servlet不是從命令列啟動的,而是由包含Java虛擬機器的Web伺服器進行載入

1)Servlet是按照Servlet規範編寫的Java類。

2)Servlet應用請求/響應模型,擴充套件了伺服器的功能。

Servlet是WEB應用程式中的一個元件。

        Servlet是在JSP之前就存在的執行在服務端的一種Java技術,它是用Java語言編寫的伺服器端程式在JSP技術出

現之前,Servlet被廣泛地應用來開發動態的Web應用程式

.如今在J2EE專案的開發中,Servlet仍然被廣泛的使用。

       Servlet是一種獨立於平臺和協議的伺服器端的Java技術,可以用來生成動態的Web頁面與傳統的CGI(公共閘道器

介面)和許多其他類似CGI技術相比,Servlet具有更好的可移植性、更強大的功能,更少的投資,更高的效率,更好

的安全性等特點

二、Servlet技術功能

       Servlet通過建立一個框架來擴充套件伺服器的能力,以提供在Web上進行請求和響應的服務。當客戶機發送請求至服

務器時,伺服器可以將請求資訊傳送給Servlet,並讓Servlet建立起伺服器返回給客戶機的響應

當啟動Web伺服器或客戶機第一次請求服務時,可以自動裝入Servlet,之後,Servlet繼續執行直到其他客戶機發出請

求。Servlet的功能涉及範圍很廣

(1)建立並返回一個包含基於客戶請求性質的動態內容的完整的HTML頁面;

(2)建立可嵌入到現有HTML頁面中的一部分HTML頁面(HTML片段);

(3)與其他伺服器資源(包括資料庫和基於Java的應用程式)進行通訊;

(4)用多個客戶機處理連線,接收多個客戶機的輸入,並將結果傳遞到多個客戶機上,例如,Servlet可以是多參與者的

遊戲伺服器;

(5)當允許在單連線方式下傳送資料的情況下,在瀏覽器上開啟伺服器至applet的新連線,並將該連線保持在開啟狀

態;當允許客戶機和伺服器簡單、高效地執行會話的情況下,applet也可以啟動客戶瀏覽器和伺服器之間的連線,可

以通過定製協議進行通訊;

(6)將訂製的處理提供給所有伺服器的標準程式。

三、 Servlet技術特點

Servlet技術帶給程式設計師最大的優勢是它可以處理客戶端傳來的HTTP請求,並返回一個響應

Servlet是一個Java類,Java語言能夠實現的功能,Servlet基本上都可以實現(圖形介面除外)。總的來說,Servlet

技術具有以下特點

1.高效。在伺服器上僅有一個Java虛擬機器在執行,它的優勢在於當多個來自客戶端的請求進行訪問時,Servlet為每

個請求分配一個執行緒而不是程序。

2.方便。Servlet提供了大量的實用工具例程,例如處理很難完成的HTML表單資料、讀取和設定HTTP頭、處理Cook

ie和跟蹤會話等。

3.跨平臺。Servlet是用Java類編寫的,它可以在不同的作業系統平臺和不同的應用伺服器平臺下執行。

4.靈活性和可擴充套件性。採用Servlet開發的Web應用程式,由於Java類的繼承性、建構函式等特點,使得其應用靈

活,可隨意擴充套件。

6.共享資料。Servlet之間通過共享資料可以很容易地實現資料庫連線池。它能方便地實現管理使用者請求,簡化Sessi

on和獲取前一頁面資訊的操作。而在CGI之間通訊則很差。由於每個CGI程式的呼叫都開始一個新的程序,呼叫間通

信通常要通過檔案進行,因而相當緩慢。同一臺伺服器上的不同CGI程式之間的通訊也相當麻煩。

7.安全。有些CGI版本有明顯的安全弱點。即使是使用最新的標準和PERL等語言,系統也沒有基本安全框架。而Ja

va定義有完整的安全機制,包括SSL\CA認證、安全政策等規範。

四、 Servlet生命週期

跟客戶端的Applet相似,Servlet(這裡Servlet的概念又回到了最原始的含義)也遵循嚴格的生命週期。在每個Servlet例項的生命中有三種類型的事件,這三種事件分別對應於由Servlet引擎所喚醒的三個方法:
  1.init()。當Servlet第一次被裝載時,Servlet引擎呼叫這個Servlet的init()方法,只調用一次。如果某個Sevlet需要特殊的初始化需要。那麼Servlet編寫人員可以重寫該方法來執行初始化任務。這是一個可選的方法。如果某個Servlet不需要初始化,那麼預設情況下將呼叫它父類的init方法。系統保證,在init方法成功完成以前,是不會呼叫Servlet去處理任何請求的。
  2.service()。這是Servlet最重要的方法,是真正處理請求的地方。對於每個請求,Servlet引擎將呼叫Servlet的service方法,並把Servlet請求物件和Servlet響應物件最為引數傳遞給它。
  3.destroy()。這是相對於init的可選方法,當Servlet即將被解除安裝時由Servlet引擎來呼叫,這個方法用來清除並釋放在init方法中所分配的資源。

Servlet的生命週期可以被歸納為以下幾步:
  (1) 裝載Servlet,這一項操作一般是動態執行的。然而,Servlet通常會提供一個管理的選項,用於在Servlet啟動時強制裝載和初始化特定的Servlet
  (2) Server建立一個Servlet例項
  (3) Server呼叫Servlet的init方法
  (4) 一個客戶端請求到達Server
  (5) Server建立一個請求物件
  (6) Server建立一個響應物件
  (7) Server啟用Servlet的service方法,傳遞請求和響應物件作為引數
  (8) service方法獲得關於請求物件的資訊,處理請求,訪問其他資源,獲得需要的資訊
  (9) service方法使用響應物件的方法。將響應傳回Server,最終到達客戶端。Service方法可能啟用其他方法以處理請求。如doGet,doPost或其他程式設計師自己開發的方法
  (10) 對於更多的客戶端請求,Server建立新的請求和響應物件,仍然啟用此servlet的service方法,將這兩個物件作為引數傳遞給它,如此重複以上的迴圈,但無需再次呼叫init方法,Servlet一般只初始化一次
  (11) 當Server不再需要Servlet時,比如當Server要關閉時,Server呼叫Servlet的destroy


五、servlet工作過程

Web伺服器在與客戶端互動時.Servlet的工作過程是:

1.     在客戶端對web伺服器發出請求

2.     web伺服器接收到請求後將其傳送給Servlet

3.     Servlet容器為此產生一個例項物件並呼叫ServletAPI中相應的方法來對客戶端HTTP請求進行處理,然後將處理的響

應結果返回給WEB伺服器.

4.     web伺服器將從Servlet例項物件中收到的響應結構傳送回客戶端.


六 、Servlet與JSP區別

        簡單的說,SUN首先發展出SERVLET,其功能比較強勁,體系設計也很先進,只是,它輸出HTML語句還是採

用了老的CGI方式,是一句一句輸出,所以,編寫和修改HTML非常不方便。 後來SUN推出了類似於ASP的鑲嵌型的

JSP,把JSP TAG鑲嵌到HTML語句中,這樣,就大大簡化和方便了網頁的設計和修改。新型的網路語言如ASP,PH

P,JSP都是鑲嵌型的SCRIPT語言。

1、JSP在本質上就是SERVLET,但是兩者的建立方式不一樣.

2、Servlet完全是JAVA程式程式碼構成,擅長於流程控制和事務處理,通過Servlet來生成動態網頁很不直觀.

J3、SP由HTML程式碼和JSP標籤構成,可以方便地編寫動態網頁.

      因此在實際應用中採用Servlet來控制業務流程,而採用JSP來生成動態網頁.在struts框架中,JSP位於MVC設計

模式的檢視層,而Servlet位於控制層.

1、JSP是Servlet技術的擴充套件,本質上就是Servlet的簡易方式。

2、JSP編譯後是“類servlet”。

3、Servlet和JSP最主要的不同點在於,Servlet的應用邏輯是在Java檔案中,並且完全從表示層中的HTML裡分離開

來。而JSP是Java和HTML組合成一個副檔名為.jsp的檔案。

4、JSP側重於檢視,Servlet主要用於控制邏輯。

七、Servlet程式碼結構

        該Servlet處理的是get請求,如果讀者不理解HTTP,可以把它看成是當用戶在瀏覽器位址列輸入URL、單擊Web

頁面中的連結、提交沒有指定method的表單時瀏覽器所發出的請求

        Servlet也可以很方便地處理post請求。post請求是提交那些指定了method=“post”的表單時所發出的請求。若要

建立一個Servlet,則應使建立的類繼承HttpServlet類,並覆蓋doGet()、doPost()方法之一或全部。doGet()和doPost

()方法都有兩個引數,分別為HttpServletRequest型別和HttpServletResponse型別

         HttpServletRequest提供訪問有關請求的資訊的方法,例如表單資料、HTTP請求頭等。HttpServletResponse除

了提供用於指定HTTP應答狀態(200,404等)、應答頭(Content-Type,Set-Cookie等)的方法之外,最重要的是它提供

了一個用於向客戶端傳送資料的PrintWriter

         對於簡單的Servlet來說,它的大部分工作是通過println()方法生成向客戶端傳送的頁面

         注意:doGet()方法和doPost()方法丟擲兩個異常,因此必須在宣告中包含它們。另外還必須匯入java.io包(要用

到PrintWriter等類)、javax.servlet包(要用到HttpServlet等類)以及javax.servlet.http包要用到(HttpServlet Request類和

HttpServletResponse類)。doGet()和doPost()這兩個方法是由service()方法呼叫的,有時可能需要直接覆蓋service()

方法,比如Servlet要處理Get和Post兩種請求時

        如果要開發一個可以處理HTTP請求的Servlet程式,則肯定要繼承HttpServlet類,而且在自定義的Servlet類中還

要重寫HttpServlet類中提供的doGet()方法。Servlet程式本身也是按照請求和應答的方式進行的,所以在doGet()方法

中定義了兩個引數,即HttpServletRequest和HttpServletResponse,用來接收和迴應使用者的請求。


八、 Servlet第一個程式

新建一個工程,注意選擇的型別


好一後,一直next,或者直接finish

新建後的工程目錄

滑鼠放在src上,右建proporty,新建一個servlet,記得是web下的servlet

輸入包名和類名

選擇生成的一些方法,不般都不用修改,一直next

\

生成後的程式碼結構


現在我們要來輸入個helloworld:

在上面程式碼加上:

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		out.println("HelloWorld I am Servlet");
	
	}
主目錄下必須要有WEB-INF目錄,WEB-INF目錄下一定有一個符合j2ee標準的web.xml檔案,eclipse預設沒有生成,myeclipse預設是有生成 的,我們自己新建一個就行了。

選擇到它,然後右鍵,選擇proproty

新建一個XML,命名為web.xml

然後開啟新建好的web.xml,內容改成如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <servlet>
     <!-- 類名 -->
    <servlet-name>HelloWorld</servlet-name>
    <!-- 所在的包 -->
    <servlet-class>com.mucfc.chapter0.HelloWorld</servlet-class>
  </servlet>
  <servlet-mapping>
    <servlet-name>HelloWorld</servlet-name>
    <!-- 訪問的網址 -->
    <url-pattern>/servlet/HelloWorld</url-pattern>
    </servlet-mapping>
</web-app>
接下來就可以運行了:


注意,eclipse中要先配置好tomcat,配置方法網上有。



把要執行的web專案add到右邊過去就行,然後finsh,就運行了。注意這裡我先把之前tomcat給stop了!

然後在瀏覽器裡輸入:

http://localhost:8080/ServletLeaningChapter0/servlet/HelloWorld

結果:


結果出來了!


相關推薦

java servletjsp概念區別

目錄 一、瞭解Servlet的概念         Servlet定義:Servlet是基於Java技術的Web元件,由容器管理併產生動態的內容。Servlet引擎作為WEB伺服器 的擴充套件提供支援Servlet的功能。Servlet與客戶端通過Servlet

JavaPreparedStatementStatement的用法區別

aik txt 實例 什麽 一點 所有 一個 drop passwd Java中PreparedStatement和Statement的用法區別 (2012-08-01 11:06:44) 轉載▼ 標簽: 雜談 1、 PreparedStatem

Java過濾器攔截器的區別

區別 對象 pos ava 初始 反射機制 action 調用 反射 1.攔截器是基於java反射機制的,而過濾器是基於函數回調的。 2.過濾器依賴於servlet容器,而攔截器不依賴於servlet容器。 3.攔截器只對action起作用,而過濾器幾乎可以對所有請求起作用

Javawaitsleep方法的區別

lee join 告訴 inter art 過程 lam 兩個 一次 1、兩者的區別 這兩個方法來自不同的類分別是Thread和Object 最主要是sleep方法沒有釋放鎖,而wait方法釋放了鎖,使得其他線程可以使用同步控制塊或者方法(鎖代碼塊和方法鎖)。 w

java sendredirect()forward()方法的區別

rect 次數 報錯 nec 重定向 web服務 單獨 exception aca 一.文章1 HttpServletResponse.sendRedirect與RequestDispatcher.forward方法都可以實現獲取相應URL資源。 sendRedirect

java物件物件引用的區別

1.何謂物件?   在Java中有一句比較流行的話,叫做“萬物皆物件”,這是Java語言設計之初的理念之一。要理解什麼是物件,需要跟類一起結合起來理解。下面這段話引自《Java程式設計思想》中的一段原話:   “按照通俗的說法,每個物件都是某個類(class)的一個例項(instance),這裡,‘

javaheapstack有什麼區別

java的記憶體分為兩類,一類是棧記憶體,一類是堆記憶體。棧記憶體是指程式進入一個方法時,會為這個方法單獨分配一塊私屬儲存空間,用於儲存這個方法內部的區域性變數,當這個方法結束時,分配給這個方法的棧會釋放,這個棧中的變數也將隨之釋放。     &nbs

BaggingBoosting 概念區別

Bagging和Boosting都是將已有的分類或迴歸演算法通過一定方式組合起來,形成一個性能更加強大的分類器,更準確的說這是一種分類演算法的組裝方法。即將弱分類器組裝成強分類器的方法。 首先介紹Bootstraping,即自助法:它是一種有放回的抽樣方法(可能抽到重複

JavaDriverManager跟DataSource獲取getConnection有什麼不同(Java資料來源連線池的區別

一、理解什麼是資料來源和連線池 資料來源:資料的源頭,需要設定資料庫url,使用者名稱和密碼,此時就相當於一個代理資料庫;它包含連線池和連線池管理兩個部分;               Java中的資料來源就是javax.

【詳細】JAVA介面抽象類的區別

介面是常用的,在這裡都不舉例程式碼了 抽象類 介面 實現方式 實現方式 介面完全是抽象的。它根本不存在方法的實現 介面完全是抽象的。它根本不存在方法的實現 構造器 構造器 抽

Javanew不new的區別

例如以下兩種情況 1.ArrayList<BookInfo> InfoList=null; BookInfo bookinfo=null; bookinfo=test.getinfo(); 2.ArrayList<BookInfo&g

關於htmlsrchref使用區別

例子: <link href="" rel="stylesheet"> <script src="script.js"></script> <img src="image.jpg" alt="圖片無法顯示提示資訊"> href是Hy

Javathissuper關鍵字的區別

this強調的是物件的本身,通過this呼叫的屬性和方法都是它所屬於的那個類中的屬性和方法。屬於物件和類間的關係 super在子類中呼叫父類的方法和屬性。屬於子類和父類兩個類間的關係 //父類

JavalongLong有什麼區別 (轉載)

“Long is a class. long is a primitive. That means Long can be null, where long can't. Long can go anywhere that takes an Object, long can't (since i

Java forforeach迴圈的區別

foreach語句是java5中新增,在遍歷陣列、集合的時候效能比一般for迴圈能好一些。 foreach是for語句的簡化,foreach是for的充分不必要條件。任何foreach都能改寫為for迴圈,但是反之則行不通。但是foreach並不能替代for迴

javainit()clinit()方法的區別

<clinit>:在jvm第一次載入class檔案時呼叫,包括靜態變數初始化語句和靜態塊的執行 <init>:在例項創建出來的時候呼叫,包括呼叫new操作符;呼叫Class

JavaArrayArrayList之間的區別

簡單理解 ArrayList是一種可以自動擴充的Array。 Array型別的變數在宣告的同時必須進行例項化(至少得初始化陣列的大小),而ArrayList可以只是先宣告。 Array只能儲存同構的

java轉發重定向的區別

轉發是伺服器行為,重定向是客戶端行為1.轉發在伺服器端完成的;重定向是在客戶端完成的2.轉發的速度快;重定向速度慢3.轉發的是同一次請求;重定向是兩次不同請求4.轉發不會執行轉發後的程式碼;重定向會執行重定向之後的程式碼5.轉發位址列沒有變化;重定向位址列有變化6.轉發必須是

JavainstanceofisInstance的具體區別

在Think in Java泛型這一章遇到這個問題,一些部落格模糊提到了isInstance是instanceof的動態實現,查閱文件參考SOF上的一些回答如下: obj.instanceof(class) 表示物件obj是否是class類或其子類的物件 一個物件是自

JAVAisEmptynull以及""的區別

這是一個比較容易混淆的概念,為了弄清楚這個問題,最好的方法當然是寫程式來驗證,上程式碼吧~~: /** * */ package JavaTest; /** * @author wxwevenpc * @version 1.0 2012-11-25 */ pu