servlet是服務器端的程序,動態生成html頁面發到客戶端,但是這樣
程序里有許多out.println(),java和html語言混在一起很亂。所以
后來推出了jsp。其實jsp就是servlet,每一個jsp在第一次運行時被
轉換成servlet文件,再編譯成.class來運行。
有了jsp,因此在MVC模式中servlet不再負責生成html頁面,轉而擔任
控制程序邏輯的作用,控制jsp和javabean之間的流轉。
Servlet與Jsp的區別
* Servlet中沒有內置對象,原來Jsp中的內置對象都是必須通過HttpServletRequest對象,或由
HttpServletResponse對象生成。
* 對於靜態的HTML標簽,Servlet都必須使用頁面輸出流諑行輸出。
總之,Jsp是Servlet的一種簡化,使用Jsp只需要完成程序員需要輸出到客戶端的內容,至於Jsp中的
Java腳本如何鑲嵌到一個類中,由Jsp容器完成。而Servlet則是個完整的Java類,這個類的Service
方法用於生成對客戶端的響應。
jsp和servlet的實質是一樣的,jsp最終還是編譯成servlet
一、jsp最終還是編譯成servlet,所以jsp比servlet慢。
二、jsp負責前台頁面顯示,servlet負責業務控制。
1、jsp是由servlet發展演變而來的,jsp在運行的時候最終將會被轉譯成一個servlet。
2、在jsp中可以使用的存值對象在servlet中大多數都能使用。
3、jsp能夠實現的功能servlet都能實現。
4、一般情況下,我們在注重頁面顯示的時候使用jsp,在注重跳轉控制的時候使用servlet。
來歷:首先sun提出的是Servlet體系,這個體系使得使用JAVA的程序員也能開發基於B/S架構的WEB應用程序,使用Servlet類將HTTP請求和響應封裝在標准JAVA類中來實現各種WEB應用方案。這一步也是sun的J2EE架構中的最關鍵的一步。
隨着大量的B/S架構程序開發出來以后,人們發現Servlet類的編寫是非常繁瑣的,主要集中在幾個問題上:首先有大量冗余代碼,這些代碼在每個servlet類中都是一模一樣或者基本近似的,其次是開發Servlet的程序員很少有精通美工的,導致使用Servlet開發無法方便的做到各種頁面效果和豐富多彩的風格,這個時候sun借鑒了微軟的ASP方式,正式提出JSP(也就是Servlet 1.1),JSP推出后,JAVA程序員也能象ASP的程序員那樣將服務端代碼添加在已經由美工設計好的靜態頁面上,經過一個JSP容器對JSP文件進行自動解析並轉換成Servlet類來交給WEB服務器運行。這么一來,極大的提高了工作效率。
人的渴望總是無止境的~~,隨着JSP的廣泛應用和各種設計模式的盛行,人們發現JSP也暴露了大量的問題:首先,夾雜服務端代碼的JSP文件給后期維護和頁面風格再設計帶來大量阻礙,美工在修改頁面的時候不得不面對大量看不懂的服務端代碼,程序員在修改邏輯的時候經常會被復雜的客戶端代碼搞昏。交叉的工作流使得JSP面臨大量的困境。這直接導致了servlet1.2的出台,sun在這一版中充分倡導了MVC的概念,大量頁面標簽的使用使得交叉工作流變的稍微的容易了,服務端標簽的兼容性使得美工也可以直接隨意移動這些標簽而得到對應的效果。但是又暴露了一些問題:設計的差的標簽使得程序的錯誤得不到檢測,不成熟的代碼導致無法真正的使服務端標簽可以和客戶端標簽那樣隨意移動而不會導致邏輯錯誤。這些都有待我們去解決~
-Servlet的開發
Servlet通常稱為服務器端小程序,用於處理和響應客戶端的請求。
Servlet是個特殊的Java類,這個Java類必須繼承HttpServlet。每個Servlet可以響應客戶端的請求。
Servlet提供了不同的方法用於響應客戶端請求。
* doGet : 用於響應客戶端的get請求
* doPost : 用於響應客戶端的post請求
* doPut : 用於響應客戶端的put請求
* doDelete: 用於響應客戶端的delete請求
* service(HttpServletRequest request, [可以響應客戶端所有類型的請求]
HttpServletResponse response)
throws ServletException,java.io.IOException
其他方法
* init(Servletconfig config) : 創建Servlet實例時,調用的初始化方法。
* destory() : 銷毀Servlet實例時,自動調用的資源回收方法。
-Servlet的配置
編譯好的Servlet源文件並不能響應用戶請求,還必須將其編譯成class文件。將編譯后的.class
文件放在WEB-INF/classes路徑下,如果Servlet有包,則還應該將class文件放在對應的包路徑下。
為了讓Servlet能響應用戶請求,還必須將Servlet配置在Web應用中。配置Servlet時,需要修改
web.xml文件。
配置Servlet需要配置兩個部分:
* 配置Servlet的名字:對應web.xml中的元素
* 配置Servlet的URL :對應web.xml中的元素
-Servlet的生命周期
Servlet在容器中運行,其實例的創建以及銷毀等都不是由程序員決定的,而是由容器進行控制的。
Servlet的創建有兩個選擇:
*客戶端請求對應的Servlet時,創建Servlet實例:大部分的Servlet都是這種Servlet
*Web應用啟動時,立刻創建Servlet實例:即load-on-startup Servlet
Servlet的生命周期:
Begin
---> 創建實例完成
---> 初始化[init]
---> 響應客戶端請求[doGet,doPost,service]
---> 被銷毀[destroy] --->
End
-使用Servlet作為控制器
使用Servlet作為表現層的工作量太大,所有的HTML標簽都需要使用頁面輸出流生成。
因此使用Servlet作為表現層有如下三個劣勢:
* 開發效率低,所有的HTML標簽都需使用頁面輸出流完成
* 不利於團隊協作,美工人員無法參與Servlet界面的開發
* 程序可維護性差,即使修改一個按鈕的標題,讀需要重新編輯Java代碼,並重新編譯
使用Servlet的MVC的架構實現:
Jsp頁面--> Servlet程序 --> Servlet根據條件轉發新的Jsp頁面
-load-on-startup Servlet
Servlet實例化的時機還有在Web應用啟動時,即load-on-startup Servlet
應用啟動時就啟動的Servlet,通常是用於某些后台服務的Servlet,或者攔截很多請求的Servlet;
這種Servlet通常作為基礎的Servlet使用,提供重要的后台服務。
web.xml中的配置:
在元素中增加元素
1
-訪問Servlet的配置參數
配置Servlet時,還可以增加附加的配置參數,通過使用配置參數,可以實現更好的解除耦合,
避免將所有的參數以硬編碼方式寫在程序中。
訪問Servlet配置參數要通過ServletConfig類的實例完成,ServletConfig提供如下方法:
java.lang.String getInitParameter(java.lang.String name) [獲取初始化參數]