国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
JavaWeb框架系列-Servlet篇(2)

Servlet是對支持Java的服務(wù)器的一般擴充。它最常見的用途是擴展Web服務(wù)器,提供非常安全的、可移植的、易于使用的CGI替代品。它是一種動態(tài)加載的模塊,為來自Web服務(wù)器的請求提供服務(wù)。它完全運行在Java虛擬機上。由于它在服務(wù)器端運行,因此它不依賴于瀏覽器的兼容性。
servlet容器:
負責(zé)處理客戶請求、把請求傳送給servlet并把結(jié)果返回給客戶。不同程序的容器實際實現(xiàn)可能有所變化,但容器與servlet之間的接口是由servlet API定義好的,這個接口定義了servlet容器在servlet上要調(diào)用的方法及傳遞給servlet的對象類。
servlet的生命周期:
1、servlet容器創(chuàng)建servlet的一個實例
2、容器調(diào)用該實例的init()方法
3、如果容器對該servlet有請求,則調(diào)用此實例的service()方法
4、容器在銷毀本實例前調(diào)用它的destroy()方法
5、銷毀并標(biāo)記該實例以供作為垃圾收集
一旦請求了一個servlet,就沒有辦法阻止容器執(zhí)行一個完整的生命周期。
容器在servlet首次被調(diào)用時創(chuàng)建它的一個實例,并保持該實例在內(nèi)存中,讓它對所有的請求進行處理。容器可以決定在任何時候把這個實例從內(nèi)存中移走。在典型的模型中,容器為每個servlet創(chuàng)建一個單獨的實例,容器并不會每接到一個請求就創(chuàng)建一個新線程,而是使用一個線程池來動態(tài)的將線程分配給到來的請求,但是這從servlet的觀點來看,效果和為每個請求創(chuàng)建一個新線程的效果相同。

servlet API
servlet接口:
public interface Servlet
它的生命周期由javax.servlet.servlet接口定義。當(dāng)你在寫servlet的時候必須直接或間接的實現(xiàn)這個接口。一般趨向于間接實現(xiàn):通過從javax.servlet.GenericServlet或javax.servlet.http.HttpServlet派生。在實現(xiàn)servlet接口時必須實現(xiàn)它的五個方法:
init():
public void init(ServletConfig config) throws ServletException
一旦對servlet實例化后,容器就調(diào)用此方法。容器把一個ServletConfig對象傳統(tǒng)給此方法,這樣servlet的實例就可以把與容器相關(guān)的配置數(shù)據(jù)保存起來供以后使用。如果此方法沒有正常結(jié)束就會拋出一個ServletException。一旦拋出該異常,servlet就不再執(zhí)行,而隨后對它的調(diào)用會導(dǎo)致容器對它重新載入并再次運行此方法。接口規(guī)定對任何servlet實例,此方法只能被調(diào)用一次,在任何請求傳遞給servlet之前,此方法可以在不拋出異常的情況下運行完畢。
service():
public void service(ServletRequest req,ServletResponse res) throws ServletException,IOException
只有成功初始化后此方法才能被調(diào)用處理用戶請求。前一個參數(shù)提供訪問初始請求數(shù)據(jù)的方法和字段,后一個提供servlet構(gòu)造響應(yīng)的方法。
destroy():
public void destroy()
容器可以在任何時候終止servlet服務(wù)。容器調(diào)用此方法前必須給service()線程足夠時間來結(jié)束執(zhí)行,因此接口規(guī)定當(dāng)service()正在執(zhí)行時destroy()不被執(zhí)行。
getServletConfig():
public ServletConfig getServletConfig()
在servlet初始化時,容器傳遞進來一個ServletConfig對象并保存在servlet實例中,該對象允許訪問兩項內(nèi)容:初始化參數(shù)和ServletContext對象,前者通常由容器在文件中指定,允許在運行時向sevrlet傳遞有關(guān)調(diào)度信息,后者為servlet提供有關(guān)容器的信息。此方法可以讓servlet在任何時候獲得該對象及配置信息。
getServletInfo():
public String getServletInfo()
此方法返回一個String對象,該對象包含servlet的信息,例如開發(fā)者、創(chuàng)建日期、描述信息等。該方法也可用于容器。

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

HttpServlet類
該類擴展了GenericServlet類并對servlet接口提供了與HTTP更相關(guān)的實現(xiàn)。
service():
protected void service(HttpServletRequest req,HttpServletResponse res) throws ServletException,IOException
public void service(HttpServletRequest req,HttpServletResponse res)throws ServletException,IOException
該方法作為HTTP請求的分發(fā)器,這個方法在任何時候都不能被重載。當(dāng)請求到來時,service()方法決定請求的類型(GET,POST,HEAD,OPTIONS,DELETE,PUT,TRACE),并把請求分發(fā)給相應(yīng)的處理方法(doGet(),doPost(),doHead(),doOptions(),doDelete(),doPut(),doTrace())每個do方法具有和第一個service()相同的形式。為了響應(yīng)特定類型的HTTP請求,我們必須重載相應(yīng)的do方法。如果servlet收到一個HTTP請求而你沒有重載相應(yīng)的do方法,它就返回一個說明此方法對本資源不可用的標(biāo)準(zhǔn)HTTP錯誤。
getLatModified():
protected long getLastModified(HttpServletRequest req)
該方法返回以毫秒為單位的的自GMT時間1970年1月1日0時0分0秒依賴的最近一次修改servlet的時間,缺省是返回一個負數(shù)表示時間未知。當(dāng)處理GET請求時,調(diào)用此方法可以知道servlet的最近修改時間,服務(wù)器就可決定是否把結(jié)果從緩存中去掉。

HttpServletRequest接口
public interface HttpServletRequest extends ServletRequest
所有實現(xiàn)此接口的對象(例如從servlet容器傳遞的HTTP請求對象)都能讓servlet通過自己的方法訪問所有請求的數(shù)據(jù)。下面是一些用來獲取表單數(shù)據(jù)的基本方法。
getParameter()
public String getParameter(String key)
此方法試圖將根據(jù)查詢串中的關(guān)鍵字定位對應(yīng)的參數(shù)并返回其值。如果有多個值則返回列表中的第一個值。如果請求信息中沒有指定參數(shù),則返回null。
getParameterValues():
public String[] getParameterValues(String key)
如果一個參數(shù)可以返回多個值,比如復(fù)選框集合,則可以用此方法獲得對應(yīng)參數(shù)的所有值。如果請求信息中沒有指定參數(shù),則返回null。
GetParameterNames():
Public Enumeration getParameterNames()
此方法返回一個Enumeration對象,包含對應(yīng)請求的所有參數(shù)名字列表。
HttpServletResponse接口
public interface HttpServletResponse extends servletResponse
servlet容器提供一個實現(xiàn)該接口的對象并通過service()方法將它傳遞給servlet。通過此對象及其方法,servlet可以修改響應(yīng)頭并返回結(jié)果。
setContentType():
public void setContentType(String type)
在給調(diào)用者發(fā)回響應(yīng)前,必須用此方法來設(shè)置HTTP響應(yīng)的MIME類型??梢允侨魏斡行У腗IME類型,當(dāng)給瀏覽器返回HTML是就是”text/html”類型。
getWriter():
public PrintWriter getWriter()throws IOException
此方法將返回PrintWriter對象,把servlet的結(jié)果作為文本返回給調(diào)用者。PrintWriter對象自動把Java內(nèi)部的UniCode編碼字符轉(zhuǎn)換成正確的編碼以使客戶端能夠閱讀。
getOutputStream():
public ServletOutputStream getOutputStream() throws IOException
此方法返回ServletOutputStream對象,它是java.io.OutputStream的一個子類。此對象向客戶發(fā)送二進制數(shù)據(jù)。
setHeader():
public void setHeader(String name,String value)
此方法用來設(shè)置送回給客戶的HTTP響應(yīng)頭。有一些快捷的方法用來改變某些常用的響應(yīng)頭,但有時也需要直接調(diào)用此方法。
編譯條件
需要從http://java.sun.com/products/servlet/ 獲得一份JSDK的拷貝,并把servlet.jar移動到JDK安裝目錄下的\jre\lib\ext目錄下。如果是JDK1.1,則移動到\lib下,并在CLASSPATH中加入servlet.jar的絕對路徑。
運行條件
需要Apache Jserv,Jrun Servlet Exec,Java Web Server,Weblogic,WebSphere,Tomcat,Resin等servlet服務(wù)器端程序。
簡單范例

				
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("<html>");     
   out.println("<body>");       
out.println("<head>");       
out.println("<title>Hello World!</title>");   
    out.println("</head>");   
     out.println("<body>");   
    out.println("<h1>Hello World!</h1>"); 
      out.println("</body>");   
     out.println("</html>");    }}


servlet的性能和效率
一個servlet僅被初始化一次而執(zhí)行多次,因此極小的低效性也會隨著時間的增加而產(chǎn)生很很大的影響。在代碼中需要考慮String對象的使用,如果產(chǎn)生HTML響應(yīng)需要用到很多字符串時,不應(yīng)該為每一個字符串生成一個String對象,因為這會產(chǎn)生大量的String和StringBuffer對象,造成大量的對象構(gòu)造消耗和垃圾收集負擔(dān),解決的辦法是一行一行的把所有需要寫入的直接寫入PrintWriter中,或者創(chuàng)建一個StringBuffer對象,并使用append()方法將文本加入。
及時回送
有時,程序需要花費很長時間執(zhí)行,在這種情況下應(yīng)該回送給客戶端一些信息,而不是長時間顯示白屏,這可以在執(zhí)行到一定程度就回送一些東西,可以使用PrintWriter的flush()方法強制將現(xiàn)有的內(nèi)容回送給瀏覽器。

Servlet會話
由于Web服務(wù)器使用的協(xié)議HTTP是一種無狀態(tài)的協(xié)議,因此要維護單個客戶機一系列請求的當(dāng)前狀態(tài)就需要使用其它的附加手段,在以前,一般的方法是使用:
l 隱藏的表格字段:在瀏覽器中,這種類型的字段是不可見的,然而,它在請求中被傳送,服務(wù)器端程序可以讀取它的值。它的優(yōu)點是實現(xiàn)容易,且大多瀏覽器都支持;缺點是字段必須按照特定的順序建立,客戶端可以通過查看源代碼得到其值,在瀏覽器中單擊“后退”按鈕會丟失加到當(dāng)前頁中的附加字段,同時也限制了用戶動態(tài)的生成文檔。
l Cookie:是一些關(guān)鍵的數(shù)據(jù)片斷,由服務(wù)器建立并由客戶機的瀏覽器存放。瀏覽器維護一個它自己的Cookie表,這使得它可以作為一種會話跟蹤的解決方案。使用Cookie的好處是它比在URL或表單中儲存數(shù)據(jù)更直觀。它的缺點是它可以用于在比一次短會話更長時間內(nèi)跟蹤用戶,甚至可以用來跟蹤某個用戶向站點發(fā)送的每一個請求,因此有人擔(dān)心自己的隱私問題而關(guān)閉了Cookie,一些老的瀏覽器也不支持cookie。Servlet API提供一個Cookie類支持cookie,使用HttpServletResponse.addCookie()和HttpServletResponse.getCookies()方法添加和讀取cookie。
l URL重寫:修改請求的url,使之包含會話ID。這種方法的缺點是:對于大量的數(shù)據(jù),URL會變得很長而失去控制;在某些環(huán)境下,URL的字符串長度有一定的限制;數(shù)據(jù)保密問題,你可能不想讓旁邊的人或者可以使用同一個計算機的看到你的會話數(shù)據(jù)。Servlet提供HttpServletRequest類可以獲得參數(shù)。
Servlet API有自己內(nèi)置的會話跟蹤支持,使用HttpSession對象既可。它的setAttribute()方法綁定一對名字/值數(shù)據(jù),把它存到當(dāng)前會話中,如果會話中已經(jīng)存在該名字責(zé)替換它,語法為:public void setAttribute(String name,Object value)。getAttribute()方法讀取存儲在會話中的對象,語法為:public Object getAttribute(String name)。getAttributeNames()方法返回存儲在會話中的所有名字,語法為:public String[] getAttributeNames()。最后一個方法是removeAttribute()方法,它從會話中刪除指定的信息,語法為:public void removeAttribute(String name)。HttpSession對象可以使用HttpServletRequest對象request的getSession(true)方法獲得。參數(shù)為true意味著如果不存在該對象則創(chuàng)建一個。


以上是關(guān)于Servlet的一些概念,在Tomcat的安裝文件中有servlet的例子,也可以能運行,但是自己想配置一個servlet的例子海沒有成功。 所以下次想找一篇關(guān)于如何配置的servlet的例子。當(dāng)然是在Eclipse+tomcat+JDk1.4下。完工·
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Servlet技術(shù)(上)
通過源碼詳解 Servlet
Servlet/JSP深入詳解:基于Tomcat的Web開發(fā)--第二章01
Servlet API——ServletContext接口的簡述
什么是servlet 收藏
JR - 精品文章 - servlet-api基本類和接口介紹
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服