成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

servlet詳解

elva / 2477人閱讀

摘要:初始化的錯(cuò)誤處理在初始化期間,實(shí)例可能通過(guò)拋出或者異常表明它不能進(jìn)行有效服務(wù)。每一個(gè)請(qǐng)求由類型的對(duì)象代表,而使用回應(yīng)該請(qǐng)求。在請(qǐng)求的情況下,容器必須提供代表請(qǐng)求和回應(yīng)的和的具體實(shí)現(xiàn)。表明不能對(duì)請(qǐng)求進(jìn)行處理,可能是暫時(shí)的,也可能是永久的。

servlet詳解

Servlet有良好的生存期的定義,包括如何加載、實(shí)例化、初始化、處理客戶端請(qǐng)求以及如何被移除。這個(gè)生存期由javax.Servlet.Servlet接口的init,service和destroy方法表達(dá)。

1、加載和實(shí)例化

容器負(fù)責(zé)加載和實(shí)例化一個(gè)Servlet。實(shí)例化和加載可以發(fā)生在引擎啟動(dòng)的時(shí)候,也可以推遲到容器需要該Servlet為客戶請(qǐng)求服務(wù)的時(shí)候。
首先容器必須先定位Servlet類,在必要的情況下,容器使用通常的Java類加載工具加載該Servlet,可能是從本機(jī)文件系統(tǒng),也可以是從遠(yuǎn)程文件系統(tǒng)甚至其它的網(wǎng)絡(luò)服務(wù)。容器加載Servlet類以后,它會(huì)實(shí)例化該類的一個(gè)實(shí)例。需要注意的是可能會(huì)實(shí)例化多個(gè)實(shí)例,例如一個(gè)Servlet類因?yàn)橛胁煌某跏紖?shù)而有多個(gè)定義,或者Servlet實(shí)現(xiàn)SingleThreadModel而導(dǎo)致容器為之生成一個(gè)實(shí)例池。

2、初始化

Servlet加載并實(shí)例化后,容器必須在它能夠處理客戶端請(qǐng)求前初始化它。初始化的過(guò)程主要是讀取永久的配置信息,昂貴資源(例如JDBC連接)以及其它僅僅需要執(zhí)行一次的任務(wù)。通過(guò)調(diào)用它的init方法并給它傳遞唯一的一個(gè)(每個(gè)Servlet定義一個(gè))ServletConfig對(duì)象完成這個(gè)過(guò)程。給它傳遞的這個(gè)配置對(duì)象允許Servlet訪問(wèn)容器的配置信息中的名稱-值對(duì)(name-value)初始化參數(shù)。這個(gè)配置對(duì)象同時(shí)給Servlet提供了訪問(wèn)實(shí)現(xiàn)了ServletContext接口的具體對(duì)象的方法,該對(duì)象描述了Servlet的運(yùn)行環(huán)境。

2.1初始化的錯(cuò)誤處理
在初始化期間,Servlet實(shí)例可能通過(guò)拋出UnavailableException 或者 ServletException異常表明它不能進(jìn)行有效服務(wù)。如果一個(gè)Servlet拋出一個(gè)這樣的異常,它將不會(huì)被置入有效服務(wù)并且應(yīng)該被容器立即釋放。在此情況下destroy方法不會(huì)被調(diào)用因?yàn)槌跏蓟瘺]有成功完成。在失敗的實(shí)例被釋放后,容器可能在任何時(shí)候?qū)嵗粋€(gè)新的實(shí)例,對(duì)這個(gè)規(guī)則的唯一例外是如果失敗的Servlet拋出的異常是UnavailableException并且該異常指出了最小的無(wú)效時(shí)間,那么容器就會(huì)至少等待該時(shí)間指明的時(shí)限才會(huì)重新試圖創(chuàng)建一個(gè)新的實(shí)例。

2.2、工具因素
當(dāng)工具(注:根據(jù)筆者的理解,這個(gè)工具可能是應(yīng)用服務(wù)器的某些檢查工具,通常是驗(yàn)證應(yīng)用的合法性和完整性)加載和內(nèi)?。╥ntrospect)一個(gè)web應(yīng)用時(shí),它可能加載和內(nèi)省該應(yīng)用中的類,這個(gè)行為將觸發(fā)那些類的靜態(tài)初始方法被執(zhí)行,因此,開發(fā)者不能假定只要當(dāng)Servlet的init方法被調(diào)用后它才處于活動(dòng)容器運(yùn)行狀態(tài)(active container runtime)。作為一個(gè)例子,這意味著Servlet不能在它的靜態(tài)(類)初始化方法被調(diào)用時(shí)試圖建立數(shù)據(jù)庫(kù)連接或者連接EJB容器。

3、處理請(qǐng)求

在Servlet被適當(dāng)?shù)爻跏蓟螅萜骶涂梢允褂盟ヌ幚碚?qǐng)求了。每一個(gè)請(qǐng)求由ServletRequest類型的對(duì)象代表,而Servlet使用ServletResponse回應(yīng)該請(qǐng)求。這些對(duì)象被作為service方法的參數(shù)傳遞給Servlet。在HTTP請(qǐng)求的情況下,容器必須提供代表請(qǐng)求和回應(yīng)的HttpServletRequest和HttpServletResponse的具體實(shí)現(xiàn)。需要注意的是容器可能會(huì)創(chuàng)建一個(gè)Servlet實(shí)例并將之放入等待服務(wù)的狀態(tài),但是這個(gè)實(shí)例在它的生存期中可能根本沒有處理過(guò)任何請(qǐng)求。

3.1、多線程問(wèn)題
容器可能同時(shí)將多個(gè)客戶端的請(qǐng)求發(fā)送給一個(gè)實(shí)例的service方法,這也就意味著開發(fā)者必須確保編寫的Servlet可以處理并發(fā)問(wèn)題。如果開發(fā)者想防止這種缺省的行為,那么他可以讓他編寫的Servlet實(shí)現(xiàn)SingleThreadModel。實(shí)現(xiàn)這個(gè)類可以保證一次只會(huì)有一個(gè)線程在執(zhí)行service方法并且一次性執(zhí)行完。容器可以通過(guò)將請(qǐng)求排隊(duì)或者維護(hù)一個(gè)Servlet實(shí)例池滿足這一點(diǎn)。如果Servlet是分布式應(yīng)用的一部分,那么,那么容器可能在該應(yīng)用分布的每個(gè)JVM中都維護(hù)一個(gè)實(shí)例池。如果開發(fā)者使用synchronized關(guān)鍵字定義service 方法(或者是doGet和doPost),容器將排隊(duì)處理請(qǐng)求,這是由底層的java運(yùn)行時(shí)系統(tǒng)要求的。我們強(qiáng)烈推薦開發(fā)者不要同步service方法或者HTTPServlet的諸如doGet和doPost這樣的服務(wù)方法。

3.2、處理請(qǐng)求中的異常
Servlet在對(duì)請(qǐng)求進(jìn)行服務(wù)的時(shí)候有可能拋出ServletException或者UnavailableException異常。ServletException表明在處理請(qǐng)求的過(guò)程中發(fā)生了錯(cuò)誤容器應(yīng)該使用合適的方法清除該請(qǐng)求。UnavailableException表明Servlet不能對(duì)請(qǐng)求進(jìn)行處理,可能是暫時(shí)的,也可能是永久的。如果UnavailableException指明是永久性的,那么容器必須將Servlet從服務(wù)中移除,調(diào)用它的destroy方法并釋放它的實(shí)例。如果指明是暫時(shí)的,那么容器可以選擇在異常信息里面指明的這個(gè)暫時(shí)無(wú)法服務(wù)的時(shí)間段里面不向它發(fā)送任何請(qǐng)求。在這個(gè)時(shí)間段里面被被拒絕的請(qǐng)求必須使用SERVICE_UNAVAILABLE (503)返回狀態(tài)進(jìn)行響應(yīng)并且應(yīng)該攜帶稍后重試(Retry-After)的響應(yīng)頭表明不能服務(wù)只是暫時(shí)的。容器也可以選擇不對(duì)暫時(shí)性和永久性的不可用進(jìn)行區(qū)分而全部當(dāng)作永久性的并移除拋出異常的Servlet。

3.3線程安全
開發(fā)者應(yīng)該注意容器實(shí)現(xiàn)的請(qǐng)求和響應(yīng)對(duì)象(注:即容器實(shí)現(xiàn)的HttpServletRequest和HttpServletResponese)沒有被保證是線程安全的,這就意味著他們只能在請(qǐng)求處理線程的范圍內(nèi)被使用,這些對(duì)象不能被其它執(zhí)行線程所引用,因?yàn)橐玫男袨槭遣淮_定的。

4、服務(wù)結(jié)束

容器沒有被要求將一個(gè)加載的Servlet保存多長(zhǎng)時(shí)間,因此一個(gè)Servlet實(shí)例可能只在容器中存活了幾毫秒,當(dāng)然也可能是其它更長(zhǎng)的任意時(shí)間(但是肯定會(huì)短于容器的生存期)當(dāng)容器決定將之移除時(shí)(原因可能是保存內(nèi)存資源或者自己被關(guān)閉),那么它必須允許Servlet釋放它正在使用的任何資源并保存任何永久狀態(tài)(這個(gè)過(guò)程通過(guò)調(diào)用destroy方法達(dá)到)。容器在能夠調(diào)用destroy方法前,它必須允許那些正在service方法中執(zhí)行的線程執(zhí)行完或者在服務(wù)器定義的一段時(shí)間內(nèi)執(zhí)行(這個(gè)時(shí)間段在容器調(diào)用destroy之前)。一旦destroy方法被調(diào)用,容器就不會(huì)再向該實(shí)例發(fā)送任何請(qǐng)求。如果容器需要再使用該Servlet,它必須創(chuàng)建新的實(shí)例。destroy方法完成后,容器必須釋放Servlet實(shí)例以便它能夠被垃圾回收。

5.多種Servlet接口介紹
Servlet接口:
public interface Servlet
它的生命周期由javax.Servlet.Servlet接口定義。當(dāng)你在寫Servlet的時(shí)候必須直接或間接的實(shí)現(xiàn)這個(gè)接口。一般趨向于間接實(shí)現(xiàn):通過(guò)從javax.Servlet.GenericServlet或javax.Servlet.http.HttpServlet派生。在實(shí)現(xiàn)Servlet接口時(shí)必須實(shí)現(xiàn)它的五個(gè)方法:

1.init():
public void init(ServletConfig config) throws ServletException
一旦對(duì)Servlet實(shí)例化后,容器就調(diào)用此方法。容器把一個(gè)ServletConfig對(duì)象傳統(tǒng)給此方法,這樣Servlet的實(shí)例就可以把與容器相關(guān)的配置數(shù)據(jù)保存起來(lái)供以后使用。如果此方法沒有正常結(jié)束就會(huì)拋出一個(gè)ServletException。一旦拋出該異常,Servlet就不再執(zhí)行,而隨后對(duì)它的調(diào)用會(huì)導(dǎo)致容器對(duì)它重新載入并再次運(yùn)行此方法。接口規(guī)定對(duì)任何Servlet實(shí)例,此方法只能被調(diào)用一次,在任何請(qǐng)求傳遞給Servlet之前,此方法可以在不拋出異常的情況下運(yùn)行完畢。

2.service():
public void service(ServletRequest req,ServletResponse res) throws ServletException,IOException
只有成功初始化后此方法才能被調(diào)用處理用戶請(qǐng)求。前一個(gè)參數(shù)提供訪問(wèn)初始請(qǐng)求數(shù)據(jù)的方法和字段,后一個(gè)提供Servlet構(gòu)造響應(yīng)的方法。

3.destroy():
public void destroy()
容器可以在任何時(shí)候終止Servlet服務(wù)。容器調(diào)用此方法前必須給service()線程足夠時(shí)間來(lái)結(jié)束執(zhí)行,因此接口規(guī)定當(dāng)service()正在執(zhí)行時(shí)destroy()不被執(zhí)行。

4.getServletConfig():
public ServletConfig getServletConfig()
在Servlet初始化時(shí),容器傳遞進(jìn)來(lái)一個(gè)ServletConfig對(duì)象并保存在Servlet實(shí)例中,該對(duì)象允許訪問(wèn)兩項(xiàng)內(nèi)容:初始化參數(shù)和ServletContext對(duì)象,前者通常由容器在文件中指定,允許在運(yùn)行時(shí)向sevrlet傳遞有關(guān)調(diào)度信息,后者為Servlet提供有關(guān)容器的信息。此方法可以讓Servlet在任何時(shí)候獲得該對(duì)象及配置信息。

5.getServletInfo():
public String getServletInfo()
此方法返回一個(gè)String對(duì)象,該對(duì)象包含Servlet的信息,例如開發(fā)者、創(chuàng)建日期、描述信息等。該方法也可用于容器。

GenericServlet類
Public abstract class GenericServlet implants Servlet,ServletConfig,Serializable
此類提供了Servlet接口的基本實(shí)現(xiàn)部分,其service()方法被申明為abstract,因此需要被派生。init(ServletConfig conf)方法把ServletConfig對(duì)象存儲(chǔ)在一個(gè)private transient(私有臨時(shí))實(shí)例變量里,getServletConfig()方法返回指向本對(duì)象的指針,如果你重載此方法,將不能使用getServletConfig來(lái)獲得ServletConfig對(duì)象,如果確實(shí)想重載,記住要包含對(duì)super.config的調(diào)用。2.1版的API提供一個(gè)重載的沒有參數(shù)的init()方法?,F(xiàn)在在init(ServletConfig)方法結(jié)束時(shí)有一個(gè)對(duì)init()的調(diào)用,盡管目前它是空的。2.1版API里面,此類實(shí)現(xiàn)了ServletConfig接口,這使得開發(fā)者不用獲得ServletConfig對(duì)象情況下直接調(diào)用ServletConfig的方法,這些方法是:getInitParameter(),getInitParameterNames(),getServletContext。此類還包含兩個(gè)寫日志的方法,它們實(shí)際上調(diào)用的是ServletContext上的對(duì)應(yīng)方法。log(String msg)方法將Servlet的名稱和msg參數(shù)寫到容器的日志中,log(String msg,Throwable cause)除了包含Servlet外還包含一個(gè)異常。

HttpServlet類
該類擴(kuò)展了GenericServlet類并對(duì)Servlet接口提供了與HTTP更相關(guān)的實(shí)現(xiàn)。

service():
protected void service(HttpServletRequest req,HttpServletResponse res) throws ServletException,IOException
public void service(HttpServletRequest req,HttpServletResponse res)throws ServletException,IOException
該方法作為HTTP請(qǐng)求的分發(fā)器,這個(gè)方法在任何時(shí)候都不能被重載。當(dāng)請(qǐng)求到來(lái)時(shí),service()方法決定請(qǐng)求的類型(GET,POST,HEAD,OPTIONS,DELETE,PUT,TRACE),并把請(qǐng)求分發(fā)給相應(yīng)的處理方法(doGet(),doPost(),doHead(),doOptions(),doDelete(),doPut(),doTrace())每個(gè)do 方法具有和第一個(gè)service()相同的形式。為了響應(yīng)特定類型的HTTP請(qǐng)求,我們必須重載相應(yīng)的do方法。如果Servlet收到一個(gè)HTTP請(qǐng)求而你沒有重載相應(yīng)的do方法,它就返回一個(gè)說(shuō)明此方法對(duì)本資源不可用的標(biāo)準(zhǔn)HTTP錯(cuò)誤。

getLatModified():
protected long getLastModified(HttpServletRequest req)
該方法返回以毫秒為單位的的自GMT時(shí)間1970年1月1日0時(shí)0分0秒依賴的最近一次修改Servlet的時(shí)間,缺省是返回一個(gè)負(fù)數(shù)表示時(shí)間未知。當(dāng)處理GET請(qǐng)求時(shí),調(diào)用此方法可以知道Servlet的最近修改時(shí)間,服務(wù)器就可決定是否把結(jié)果從緩存中去掉。

HttpServletRequest接口
public interface HttpServletRequest extends ServletRequest
所有實(shí)現(xiàn)此接口的對(duì)象(例如從Servlet容器傳遞的HTTP請(qǐng)求對(duì)象)都能讓Servlet通過(guò)自己的方法訪問(wèn)所有請(qǐng)求的數(shù)據(jù)。下面是一些用來(lái)獲取表單數(shù)據(jù)的基本方法。

getParameter()
public String getParameter(String key)
此方法試圖將根據(jù)查詢串中的關(guān)鍵字定位對(duì)應(yīng)的參數(shù)并返回其值。如果有多個(gè)值則返回列表中的第一個(gè)值。如果請(qǐng)求信息中沒有指定參數(shù),則返回null。

getParametervalues():
public String[] getParametervalues(String key)
如果一個(gè)參數(shù)可以返回多個(gè)值,比如復(fù)選框集合,則可以用此方法獲得對(duì)應(yīng)參數(shù)的所有值。如果請(qǐng)求信息中沒有指定參數(shù),則返回null。

GetParameterNames():
Public Enumeration getParameterNames()
此方法返回一個(gè)Enumeration對(duì)象,包含對(duì)應(yīng)請(qǐng)求的所有參數(shù)名字列表。
HttpServletResponse接口
public interface HttpServletResponse extends ServletResponse
Servlet容器提供一個(gè)實(shí)現(xiàn)該接口的對(duì)象并通過(guò)service()方法將它傳遞給Servlet。通過(guò)此對(duì)象及其方法,Servlet可以修改響應(yīng)頭并返回結(jié)果。

setContentType():
public void setContentType(String type)
在給調(diào)用者發(fā)回響應(yīng)前,必須用此方法來(lái)設(shè)置HTTP響應(yīng)的MIME類型??梢允侨魏斡行У腗IME類型,當(dāng)給瀏覽器返回HTML是就是”text/html”類型。

getWriter():
public PrintWriter getWriter()throws IOException
此方法將返回PrintWriter對(duì)象,把Servlet的結(jié)果作為文本返回給調(diào)用者。PrintWriter對(duì)象自動(dòng)把Java內(nèi)部的UniCode編碼字符轉(zhuǎn)換成正確的編碼以使客戶端能夠閱讀。

getOutputStream():
public ServletOutputStream getOutputStream() throws IOException
此方法返回ServletOutputStream對(duì)象,它是java.io.OutputStream的一個(gè)子類。此對(duì)象向客戶發(fā)送二進(jìn)制數(shù)據(jù)。

setHeader():
public void setHeader(String name,String value)
此方法用來(lái)設(shè)置送回給客戶的HTTP響應(yīng)頭。有一些快捷的方法用來(lái)改變某些常用的響應(yīng)頭,但有時(shí)也需要直接調(diào)用此方法。
編譯條件
需要從http://java.sun.com/products/Servlet/ 獲得一份JSDK的拷貝,并把Servlet.jar移動(dòng)到JDK安裝目錄下的jrelibext目錄下。如果是JDK1.1,則移動(dòng)到lib下,并在CLASSPATH中加入Servlet.jar的絕對(duì)路徑。
運(yùn)行條件
需要Apache Jserv,Jrun Servlet Exec,Java Web Server,Weblogic,WebSphere,Tomcat,Resin等Servlet服務(wù)器端程序。

Java代碼
1.import java.io.*;
2.import javax.servlet.*;
3.import javax.servlet.http.*;
4.public class HelloWorld extends HttpServlet {
5. public void doGet(HttpServletRequest request, HttpServletResponse response)throws IOException, ServletException
6.{ response.setContentType("text/html");
7. PrintWriter out = response.getWriter();
8. out.println("");
9. out.println("");
10. out.println("");
11. out.println("Hello World!");
12. out.println("");

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/64120.html

相關(guān)文章

  • Servlet 3.0 異步處理詳解

    摘要:但是這樣依然有一個(gè)問(wèn)題,考慮以下場(chǎng)景有一個(gè)容器,線程池大小。這個(gè)時(shí)候工程師發(fā)現(xiàn)了問(wèn)題,擴(kuò)展了線程池大小到,但是負(fù)載依然持續(xù)走高,現(xiàn)在有個(gè)到,依然無(wú)法響應(yīng)。你可以修改的線程池大小,把它和比較結(jié)果來(lái)驗(yàn)證這一結(jié)論。 Github地址 相關(guān)系列文章: Servlet 3.1 Async IO分析 Spring MVC異步處理的幾種方式 Servlet 3.0 開始提供了AsyncConte...

    kid143 評(píng)論0 收藏0
  • ServletConfig與ServletContext對(duì)象詳解

    摘要:一對(duì)象在的配置文件中,可以使用一個(gè)或多個(gè)標(biāo)簽為配置一些初始化參數(shù)。進(jìn)而,程序員通過(guò)對(duì)象就可以得到當(dāng)前的初始化參數(shù)信息。對(duì)象通常也被稱之為域?qū)ο蟆? 一、ServletConfig對(duì)象 在Servlet的配置文件中,可以使用一個(gè)或多個(gè)標(biāo)簽為servlet配置一些初始化參數(shù)。(配置在某個(gè)servlet標(biāo)簽或者整個(gè)web-app下) 當(dāng)servlet配置了初始化參數(shù)后,web容器在創(chuàng)建se...

    X1nFLY 評(píng)論0 收藏0
  • 關(guān)于web.xml配置的那些事兒

    摘要:的版本增加了對(duì)事件監(jiān)聽程序的支持,事件監(jiān)聽程序在建立修改和刪除會(huì)話或環(huán)境時(shí)得到通知。元素指出事件監(jiān)聽程序類。過(guò)濾器配置將一個(gè)名字與一個(gè)實(shí)現(xiàn)接口的類相關(guān)聯(lián)。 1.簡(jiǎn)介 web.xml文件是Java web項(xiàng)目中的一個(gè)配置文件,主要用于配置歡迎頁(yè)、Filter、Listener、Servlet等,但并不是必須的,一個(gè)java web項(xiàng)目沒有web.xml文件照樣能跑起來(lái)。Tomcat容器/...

    zhichangterry 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<