java servlet和jsp區別

目前常見的動態網頁技術有CGI、ASP、PHP、JSP這幾種。
最早出現的技術是CGI(通用網關接口),原先的web服務器並不支持動態的訪問,即實時更新的網頁內容,所以出現了CGI,但是CGI運行效率低下,每次訪問就會創建一個進程,訪問結束就會關閉進程,這樣給服務器帶來了很大壓力,所以sun公司就根據java applet設計出了java servlet技術。
java servlet是獨立於平臺和協議的,由於java本身就是跨平臺,所以獨立於平臺就是自然而然的了,獨立於協議是指java servlet有一個GenericServlet(通用servlet),可以繼承該類,實現任何協議,包括ftp等等,由於我們最常用的是用java servlet開發web頁面,所以HttpServlet是我們最爲熟悉的一種協議實現,很多服務器也是實現了HttpServlet協議,如tomcat、jetty、weblogic等等。
首先sun提出的是Servlet體系,這個體系使得使用JAVA的程序員也能開發基於B/S架構的WEB應用程序,使用Servlet類將HTTP請求和響應封裝在標準JAVA類中來實現各種WEB應用方案。這一步也是sun的J2EE架構中的最關鍵的一步,只是,它輸出HTML語句還是採用了老的CGI方式,是一句一句輸出,所以,編寫和修改HTML非常不方便。導致使用Servlet開發無法方便的做到各種頁面效果和豐富多彩的風格,這個時候sun借鑑了微軟的ASP方式,正式提出JSP(也就是Servlet 1.1),JSP推出後,JAVA程序員也能象ASP的程序員那樣將服務端代碼添加在已經由美工設計好的靜態頁面上,經過一個JSP容器對JSP文件進行自動解析並轉換成Servlet類來交給WEB服務器運行。這麼一來,極大的提高了工作效率。
隨着JSP的廣泛應用和各種設計模式的盛行,人們發現JSP也暴露了大量的問題:首先,夾雜服務端代碼的JSP文件給後期維護和頁面風格再設計帶來大量阻礙,美工在修改頁面的時候不得不面對大量看不懂的服務端代碼,程序員在修改邏輯的時候經常會被複雜的客戶端代碼搞昏。交叉的工作流使得JSP面臨大量的困境。這直接導致了servlet1.2的出臺,sun在這一版中充分倡導了MVC的概念,大量頁面標籤的使用使得交叉工作流變的稍微的容易了,服務端標籤的兼容性使得美工也可以直接隨意移動這些標籤而得到對應的效果。但是又暴露了一些問題:設計的差的標籤使得程序的錯誤得不到檢測,不成熟的代碼導致無法真正的使服務端標籤可以和客戶端標籤那樣隨意移動而不會導致邏輯錯誤。
首先說下jsp引擎的運行原理,jsp本質上也是一個servlet,當第一次訪問jsp的時候,
(1)將JSP頁面翻譯成一個Servlet,這個Servlet是一個java文件,同時也是一個完整的java程序
(2)JSP引擎調用java編譯器對這個Servlet進行編譯,得到可執行文件class
(3)JSP引擎調用java虛擬機來解釋執行class文件,生成向客戶端發送的應答,然後發送給客戶端
以上三個步驟僅僅在JSP頁面第一次被訪問時纔會執行,以後的訪問速度會因爲class文件已經生成而大大提高。當JSP引擎街道一個客戶端的訪問請求時,首先判斷請求的JSP頁面是否比對應的Servlet新,如果新,對應的JSP需要重新編譯。
因爲JSP在編寫網頁方面具有優勢,而編寫處理代碼存在很多問題,所以產生了模型1,把JSP中的處理代碼使用JavaBean來實現。網站的輸入輸出、處理、控制全部夾雜在一起,維護不方便。當網站中需要進行大量的處理代碼的時候,JSP文件將很難維護,並且代碼也不容易共享。
模型1:JSP+JavaBean階段
JavaBean是使用Java語言編寫的組件,簡單的理解,可以認爲JavaBean是比較特殊的Java類。JavaBean會把網站中處理過程進行封裝,這樣的結果就是在JSP文件中僅僅是輸入輸出功能和控制功能,處理過程放在JavaBean中,然後在JSP中調用JavaBean的功能,此時的javaBean不僅僅是通常所說的POJO類,而是包括POJO類和業務處理,JSP提供了若干標籤支持調用。下面的例子展示了這種模型。

package test;
public class PrintMessage
{
   public String print()
   {
      return “使用JavaBean返回信息”;
   }
}

頁面文件:

<%@ page import=”test.*” %>
<jsp:useBean id=”printMessage” class=”test.PrintMessage” scope=”request”/>
<html>
   <head><title>測試</title></head>
   <body>
      第一階段<% out.print(printMessage.print()); %>
</body>
</html>

這種模型的優點是:業務處理由JavaBean完成,減少了頁面中的代碼。缺點是:頁面中仍然有用於控制的代碼。注意模型一隻使用了jsp+javaBean,並沒有直接使用servlet,雖說jsp本質上也是servlet,但在開發過程中,編碼和設計還是有區別的。
模型2:JSP+JavaBean+Servlet階段
在模型2中,把JSP中的控制功能提取出來使用Servlet實現。這樣,JavaBean強調的是功能,Servlet主要用於控制。從完成的功能來說,JSP和Servlet是相同的,但是JSP主要以標籤(HTML標籤和JSP標籤)爲主,Servlet是Java代碼。JavaBean和Servlet都是Java代碼,但是Servlet能夠接收請求,用戶能夠直接訪問,JavaBean不能接收請求,需要由JSP或者Servlet調用。
這種模型的特點:JSP完成輸入和輸出,主要使用HTML標籤和JSP標籤。Servlet主要完成控制,接收請求,調用業務處理(JavaBean),根據調用的結果找到一個JSP頁面對用戶進行響應。JavaBean完成所有的處理過程。
這種方式實際上是MVC模式的採用。MVC模式由3部分組成:M表示模型(模擬現實事物),主要用於處理過程;V表示視圖,實際上就是輸入和輸出功能;C表示控制器,主要控制程序的流程,此種方式完成了從URL的http世界向java世界的映射。這也是mvc的核心功能。
框架階段:
隨着Java Web應用技術的發展,出現了大量的框架包括Web層框架和持久層框架。
Web層框架通常可以提供一些Web應用的通用功能,用戶在編寫應用的時候只需要關注自己比較特殊的東西即可。例如,Servlet作爲控制器完成的功能包括:獲取用戶的輸入信息;對信息進行驗證、轉換;使用這些信息調用業務邏輯(JavaBean的方法);然後選擇界面對用戶響應。如果把獲取的信息設置成變量、要進行的驗證和轉換進行配置、要調用的方法進行配置、要響應的界面進行配置,這樣Servlet就可以通用了。
持久層框架,主要是解決數據庫訪問問題,同樣是把數據庫訪問中通用的內容提取出來,在編寫應用的時候只編寫特殊的東西。例如,要把用戶信息和圖書信息添加到數據庫中,採用JDBC技術,編寫的兩段代碼的區別是表名不同,列與屬性的對應關係不同。持久層框架就可以完成這個添加工程,用戶只需要提供表名並且提供列與屬性的對應關係。
jsp開發的兩種模型:
一、Browser——request——>JSP—call——>JavaBean—call—>DateBase
<——— <——— <—

二、
Browser—request—>model(Servlet)—–>javabeans—->database—->View(JSP)
<——————————————————————
Java Web基礎:第八講 Java Web的發展歷史
JAVA從零開始學:JSP, Servlet的發展歷史
java Servlet、Applet、JSP+Bean、CGI區別與聯繫
JSP開發的兩種模型

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章