<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 188,comments - 176,trackbacks - 0

    servlet簡(jiǎn)介
    servlet容器:

    負(fù)責(zé)處理客戶請(qǐng)求、把請(qǐng)求傳送給servlet并把結(jié)果返回給客戶。不同程序的容器實(shí)際實(shí)現(xiàn)可能有所變化,但容器與servlet之間的接口是由 servletAPI定義好的,這個(gè)接口定義了servlet容器在servlet上要調(diào)用的方法及傳遞給servlet的對(duì)象類。

    servlet的生命周期:
    l servlet容器創(chuàng)建servlet的一個(gè)實(shí)例

    l 容器調(diào)用該實(shí)例的init()方法

    l 如果容器對(duì)該servlet有請(qǐng)求,則調(diào)用此實(shí)例的service()方法

    l 容器在銷毀本實(shí)例前調(diào)用它的destroy()方法

    l 銷毀并標(biāo)記該實(shí)例以供作為垃圾收集

    一旦請(qǐng)求了一個(gè)servlet,就沒有辦法阻止容器執(zhí)行一個(gè)完整的生命周期。

    容器在servlet首次被調(diào)用時(shí)創(chuàng)建它的一個(gè)實(shí)例,并保持該實(shí)例在內(nèi)存中,讓它對(duì)所有的請(qǐng)求進(jìn)行處理。容器可以決定在任何時(shí)候把這個(gè)實(shí)例從內(nèi)存中移走。在典型的模型中,容器為每個(gè)servlet創(chuàng)建一個(gè)單獨(dú)的實(shí)例,容器并不會(huì)每接到一個(gè)請(qǐng)求就創(chuàng)建一個(gè)新線程,而是使用一個(gè)線程池來(lái)動(dòng)態(tài)的將線程分配給到來(lái)的請(qǐng)求,但是這從servlet的觀點(diǎn)來(lái)看,效果和為每個(gè)請(qǐng)求創(chuàng)建一個(gè)新線程的效果相同。

    servlet API
    servlet接口:

    public interface Servlet

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

    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)行完畢。

    service():

    public void service(ServletRequest req,ServletResponse res) throws ServletException,IOException

    只有成功初始化后此方法才能被調(diào)用處理用戶請(qǐng)求。前一個(gè)參數(shù)提供訪問初始請(qǐng)求數(shù)據(jù)的方法和字段,后一個(gè)提供servlet構(gòu)造響應(yīng)的方法。

    destroy():

    public void destroy()

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

    getServletConfig():

    public ServletConfig getServletConfig()

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

    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通過自己的方法訪問所有請(qǐng)求的數(shù)據(jù)。下面是一些用來(lái)獲取表單數(shù)據(jù)的基本方法。

    getParameter()

    public String getParameter(String key)

    此方法試圖將根據(jù)查詢串中的關(guān)鍵字定位對(duì)應(yīng)的參數(shù)并返回其值。如果有多個(gè)值則返回列表中的第一個(gè)值。

    getParameterValues():

    public String[] getParameterValues(String key)

    如果一個(gè)參數(shù)可以返回多個(gè)值,比如復(fù)選框集合,則可以用此方法獲得對(duì)應(yīng)參數(shù)的所有值。

    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ì)象并通過service()方法將它傳遞給servlet。通過此對(duì)象及其方法,servlet可以修改響應(yīng)頭并返回結(jié)果。

    setContentType():

    public void setContentType(String type)

    在給調(diào)用者發(fā)回響應(yīng)前,必須用此方法來(lái)設(shè)置HTTP響應(yīng)的MIME類型。可以是任何有效的MIME類型,當(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安裝目錄下的\jre\lib\ext目錄下。如果是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ù)器端程序。

    簡(jiǎn)單范例

     

    import java.io.*

    import javax.servlet.*

    import javax.servlet.http.*



    public class HelloWorld extends HttpServlet 


    public void doGet(HttpServletRequest request, HttpServletResponse response) 

    throws IOException, ServletException 



    response.setContentType(
    "text/html"); 

    PrintWriter out 
    = response.getWriter(); 

    out.println(
    ""); 

    out.println(
    ""); 

    out.println(
    ""); 

    out.println(
    ""); 

    out.println(
    ""); 

    out.println(
    ""); 

    out.println(
    " Hello World!"); 

    out.println(
    ""); 

    out.println(
    ""); 

    }
     

    }
     



    servlet的性能和效率
    一個(gè)servlet僅被初始化一次而執(zhí)行多次,因此極小的低效性也會(huì)隨著時(shí)間的增加而產(chǎn)生很很大的影響。在代碼中需要考慮String對(duì)象的使用,如果產(chǎn)生HTML響應(yīng)需要用到很多字符串時(shí),不應(yīng)該為每一個(gè)字符串生成一個(gè)String對(duì)象,因?yàn)檫@會(huì)產(chǎn)生大量的String和 StringBuffer對(duì)象,造成大量的對(duì)象構(gòu)造消耗和垃圾收集負(fù)擔(dān),解決的辦法是一行一行的把所有需要寫入的直接寫入PrintWriter中,或者創(chuàng)建一個(gè)StringBuffer對(duì)象,并使用append()方法將文本加入。

    及時(shí)回送
    有時(shí),程序需要花費(fèi)很長(zhǎng)時(shí)間執(zhí)行,在這種情況下應(yīng)該回送給客戶端一些信息,而不是長(zhǎng)時(shí)間顯示白屏,這可以在執(zhí)行到一定程度就回送一些東西,可以使用PrintWriter的flush()方法強(qiáng)制將現(xiàn)有的內(nèi)容回送給瀏覽器。

    轉(zhuǎn)http://jiahaolin.bokee.com

    posted on 2007-05-24 11:17 cheng 閱讀(322) 評(píng)論(0)  編輯  收藏 所屬分類: JSP/Servlet
    主站蜘蛛池模板: 色播在线永久免费视频网站| 亚洲an日韩专区在线| 亚洲一区二区三区影院| 亚洲AV成人潮喷综合网| 特级淫片国产免费高清视频| 性生交片免费无码看人| 最近免费中文字幕大全视频 | 亚洲熟妇无码爱v在线观看| 亚洲黄色在线网站| 亚洲美女中文字幕| 亚洲午夜精品一区二区公牛电影院| 亚洲欧洲日产国码www| ww亚洲ww在线观看国产| 亚洲色大成网站www| 亚洲欧美在线x视频| 无遮挡免费一区二区三区| 国产精品青草视频免费播放| 91视频免费网站| 91成人免费观看| 无码av免费毛片一区二区 | 性生大片视频免费观看一级| yellow视频免费看| 久久青草91免费观看| 亚洲一区在线免费观看| 成年性午夜免费视频网站不卡| 午夜成年女人毛片免费观看| 又色又污又黄无遮挡的免费视 | 88xx成人永久免费观看| 国内精品乱码卡1卡2卡3免费| 啦啦啦www免费视频| 亚洲中文无韩国r级电影 | 精品剧情v国产在免费线观看| 国产免费无遮挡精品视频| 国产亚洲精品国看不卡| 亚洲伊人tv综合网色| 中文字幕亚洲情99在线| 一级一级一片免费高清| 67pao强力打造高清免费| 成年男女免费视频网站| 亚洲一级特黄大片在线观看| 久久亚洲中文字幕精品有坂深雪 |