A. 學java時,有個叫SERVLET是什麼東西
詞霸網上查詢 即小伺服器應用程序。
Servlet
Servlet是用Java編寫的Server端程序,它與協議和平台無關。Servlet運行於Java-enabled Web Server中。Java Servlet可以動態地擴展Server的能力,並採用請求-響應模式提供Web服務。
最早支持Servlet技術的是JavaSoft的Java Web Server。此後,一些其它的基於Java的Web Server開始支持標準的Servlet API。
一、Servlet的特點
Servlet是Java技術對CGI編程的回答。Servlet程序在伺服器端運行,動態地生成Web頁面。與傳統的CGI和許多其他類似CGI的技術相比,Java Servlet具有更高的效率,更容易使用,功能更強大,具有更好的可移植性,更節省投資(更重要的是, Servlet程序員收入要比Perl程序員高:-)
高效
在傳統的CGI中,每個請求都要啟動一個新的進程,如果CGI程序本身的執行時間較短,啟動進程所需要的開銷很可能反而超過實際執行時間。而在 Servlet中,每個請求由一個輕量級的Java線程處理(而不是重量級的操作系統進程)。在傳統CGI中,如果有N個並發的對同一CGI程序的請求,則該CGI程序的代碼在內存中重復裝載了N次;而對於Servlet,處理請求的是N個線程,只需要一份Servlet類代碼。在性能優化方面,Servlet也比CGI有著更多的選擇,比如緩沖以前的計算結果,保持資料庫連接的活動,等等。
方便
Servlet提供了大量的實用工具常式,例如自動地解析和解碼HTML表單數據、讀取和設置HTTP頭、處理Cookie、跟蹤會話狀態等。
功能強大
在Servlet中,許多使用傳統CGI程序很難完成的任務都可以輕松地完成。例如,Servlet能夠直接和Web伺服器交互,而普通的CGI程序不能。Servlet還能夠在各個程序之間共享數據,使得資料庫連接池之類的功能很容易實現。
可移植性好
Servlet用Java編寫,Servlet API具有完善的標准。因此,為I-Planet Enterprise Server寫的Servlet無需任何實質上的改動即可移植到Apache、Microsoft IIS或者WebStar。幾乎所有的主流伺服器都直接或通過插件支持Servlet。
節省投資
不僅有許多廉價甚至免費的Web伺服器可供個人或小規模網站使用,而且對於現有的伺服器,如果它不支持Servlet的話,要加上這部分功能也往往是免費的(或只需要極少的投資)。
二、Servlet的主要功能
Servlet的主要功能在於互動式地瀏覽和修改數據,生成動態Web內容。這個過程為:
客戶端發送請求至伺服器端;
伺服器將請求信息發送至Servlet
Servlet生成響應內容並將其傳給Server。響應內容動態生成,通常取決於客戶端的請求
伺服器將響應返回給客戶端
Servlet看起來像是通常的Java程序。Servlet導入特定的屬於Java Servlet API的包。因為是對象位元組碼,可動態地從網路載入,可以說Servlet對Server就如同Applet對Client一樣,但是,由於 Servlet運行於Server中,它們並不需要一個圖形用戶界面。從這個角度講,Servlet也被稱為Faceless Object。
三、JAVA Servlet的優勢
Servlet可以和其他資源(文件、資料庫、Applet、Java應用程序等)交互,以生成返回給客戶端的響應內容。如果需要,還可以保存請求-響應過程中的信息。
採用Servlet,伺服器可以完全授權對本地資源的訪問(如資料庫),並且Servlet自身將會控制外部用戶的訪問數量及訪問性質
Servlet可以是其它服務的客戶端程序,例如,它們可以用於分布式的應用系統中,可以從本地硬碟,或者通過網路從遠端硬碟激活Servlet。
Servlet可被鏈接(chain)。一個Servlet可以調用另一個或一系列Servlet,即成為它的客戶端。
採用Servlet Tag技術,可以在HTML頁面中動態調用Servlet。
Servlet API與協議無關。它並不對傳遞它的協議有任何假設。
像所有的Java程序一樣,Servlet擁有面向對象Java語言的所有優勢
Servlet提供了Java應用程序的所有優勢——可移植、穩健、易開發。使用Servlet 的Tag技術,Servlet能夠生成嵌於靜態HTML頁面中的動態內容。
一個Servlet被客戶端發送的第一個請求激活,然後它將繼續運行於後台,等待以後的請求。每個請求將生成一個新的線程,而不是一個完整的進程。多個客戶能夠在同一個進程中同時得到服務。一般來說,Servlet進程只是在Web Server卸載時被卸載。
四、Servlet生命周期
裝載Servlet。這項操作一般是動態執行的。然而,Server通常會提供一個管理的選項,用於在Server啟動時強制裝載和初始化特定的Servlet。
Server創建一個Servlet的實例
Server調用Servlet的init()方法
一個客戶端的請求到達Server
Server創建一個請求對象
Server創建一個響應對象
Server激活Servlet的service()方法,傳遞請求和響應對象作為參數
service()方法獲得關於請求對象的信息,處理請求,訪問其他資源,獲得需要的信息
service()方法使用響應對象的方法,將響應傳回Server,最終到達客戶端。service()方法可能激活其它方法以處理請求,如doGet()或doPost()或程序員自己開發的新的方法
對於更多的客戶端請求,Server創建新的請求和響應對象,仍然激活此Servlet的 service()方法,將這兩個對象作為參數傳遞給它。如此重復以上的循環,但無需再次調用init()方法。一般Servlet只初始化一次 ,當Server不再需要Servlet時(一般當Server關閉時),Server調用Servlet的Destroy()方法。
在美國,EJB+Servlet+JSP幾乎成為電子商務的開發標准。本來 ASP 也很有希望,但微軟最近可能把精力都集中在打官司和Win2000上, 因此電子商務發展得太少。PHP由於其模式和一些天生缺陷,毫無希望。 在美國,很少有商業站點用PHP的。
B. 什麼是servlet
1.什麼是SERVLET?
Servlet是用Java編寫的伺服器端程序, 其主要功能在於互動式地瀏覽和修改數據,生成動態Web內容.
狹義的Servlet是指Java語言實現的一個介面,廣義的Servlet是指任何實現了這個Servlet介面的類,一般情況下,我們一般將Servlet理解為後者。
這段話可能聽起來有些繞, 但如果大家把Servlet與Spring MVC 的前端控制器 DispatcherServlet
結合起來理解, 應該立馬就知道它是做什麼的了. Servlet 是Java JDK提供的一個介面, 所有的Servlet都繼承於它,
而DispatcherServlet是一個繼承了實現了Servlet介面的類的類.
2.知識剖析
Servlet 的生命周期
Servlet 的生命周期分為三個階段, 分別對應Servlet中的三個介面.
init() 初始化.
service() 處理客戶端的請求, 具體業務邏輯. ServletRequest 對象用於獲得客戶端信息,ServletResponse 對象用於向客戶端返回信息(客戶端可以理解為瀏覽器)
destroy() 結束時調用. 這個方法只有在servlet的service方法內的所有線程都退出的時候,或在超時的時候才會被調用。
init() 和 destroy() 都只會在Servlet創建和銷毀時調用一次, 而service() 則會在響應不同請求時多次調用.
注意Servlet是一個介面,實現了servlet的類,是不能直接處理請求的.
請求需要通過Servlet容器來發送到Servlet, Servlet是運行在Servlet容器中的.
Servlet容器是Web伺服器和servlet進行交互的必不可少的組件。常見Web伺服器有Tomcat, jetty, resin, 它們也可以稱為應用伺服器
3.常見問題
1. Servlet 如何接收才能接收到Servlet容器發來的請求?
2. Servlet 什麼時候被初始化?
3. DispatcherServlet 如何處理容器發來的請求?
4.解決方案
1. Servlet 容器通過監聽埠(8080)來接收用戶發送的請求, 然後通過web.xml中的 Servlet-mapping 配置, 來匹配到請求Heades中的url信息, 將其轉發到對應Servlet配置中的Servlet實現類完成請求接收.
2. Servlet 的初始化是由Web.xml 中的 loadOnStartup 配置控制的.
當 loadOnStartup < 0 或者不寫時, 接收到第一次請求的時候實例化.
當 loadOnStartup > 0 web容器啟動的時候做實例化處理,順序是由小到大,正整數小的先被實例化
當 loadOnStartup = 0 web容器啟動的時候做實例化處理,相當於是最大整數,因此web容器啟動時,最後被實例化
3. 通過DispatcherServlet 的執行流程來看它時如何處理請求的
希望對您有所幫助!~
C. java servlet中文亂碼
我用的是myEclipse8.6的,在windows下的preferences的general-workspace,將other改UTF-8,如下:
再運行,不過先前的代碼會亂碼的
代碼:
public class EncodingFilter implements Filter{
public void destroy() {
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest)arg0;
HttpServletResponse resp=(HttpServletResponse)arg1;
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
chain.doFilter(req, resp);
}
public void init(FilterConfig arg0) throws ServletException {
}
讓其改為UTF-8的模式就好了
還有頁面中加上<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
應該就好了