軟件中間件技術(shù)UNIT8_第1頁(yè)
軟件中間件技術(shù)UNIT8_第2頁(yè)
軟件中間件技術(shù)UNIT8_第3頁(yè)
軟件中間件技術(shù)UNIT8_第4頁(yè)
軟件中間件技術(shù)UNIT8_第5頁(yè)
已閱讀5頁(yè),還剩68頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Servlets Servlets Servlets是基于Java的一種技術(shù)和標(biāo)準(zhǔn)。它是位于Web 服務(wù)器內(nèi)部的服務(wù)器端的Java應(yīng)用程序,與傳統(tǒng)的從命令行啟動(dòng)的Java應(yīng)用程序不同,Servlets由Web服務(wù)器進(jìn)行加載,該Web服務(wù)器必須包含支持Servlets的Java虛擬機(jī)。Servlets是JSP的基礎(chǔ)。Servlets Servlets Servlets是用Java代碼編寫(xiě)的服務(wù)器端軟件程序,能夠動(dòng)態(tài)擴(kuò)展Web服務(wù)器功能,用于處理客戶機(jī)和服務(wù)器之間的消息傳遞。Java Servlet API 為請(qǐng)求和響應(yīng)消息定義了一個(gè)標(biāo)準(zhǔn)接口,這樣 Servlets 就可以跨平臺(tái),在不同的 Web

2、 應(yīng)用服務(wù)器間移植。Servlets Servlets Servlets是當(dāng)今萬(wàn)維網(wǎng)上使用最頻繁的J2EE組件,其結(jié)構(gòu)和設(shè)計(jì)都很簡(jiǎn)潔和輕巧,大多數(shù)Web開(kāi)發(fā)人員都把Servlets作為Web客戶訪問(wèn)服務(wù)器應(yīng)用的主入口點(diǎn),而且只要客戶端有足夠的清理權(quán)限,Servlets就允許客戶端控制服務(wù)器添加或刪除Web頁(yè)面或文件。Servlets Servlets 從理論上講,Java能做的事情,Servlets也能做。但Web開(kāi)發(fā)人員不會(huì)只使用Servlets來(lái)構(gòu)建所想要的一切,因?yàn)橛肧ervlets處理復(fù)雜的Web交互、事務(wù)處理、數(shù)據(jù)庫(kù)同步及其他內(nèi)部邏輯并不是一個(gè)非常切實(shí)可行的途徑,和傳統(tǒng)的CGI、IS

3、API(Internet Server Application Programming Interface,Internet 服務(wù)應(yīng)用程序編程接口)、NSAPI(Netscape Server Application Programming Interface,網(wǎng)景服務(wù)器應(yīng)用程序編程接口)方式相同,Servlets也是利用輸出HTML語(yǔ)句來(lái)實(shí)現(xiàn)動(dòng)態(tài)網(wǎng)頁(yè),如果用它來(lái)開(kāi)發(fā)整個(gè)網(wǎng)站,動(dòng)態(tài)部分和靜態(tài)頁(yè)面的整合過(guò)程將變得無(wú)法想像。這就是Sun還要推出JSP的原因。Servlets主要負(fù)責(zé)處理小型任務(wù),如:收集和驗(yàn)證用戶輸入,但幾乎不進(jìn)行實(shí)際處理;協(xié)調(diào)輸出,但幾乎不直接生成動(dòng)態(tài)Web頁(yè)面的內(nèi)容;少量的業(yè)務(wù)

4、邏輯。JAVAJAVA ServletsServlets為什么優(yōu)于傳統(tǒng)的為什么優(yōu)于傳統(tǒng)的CGICGI JAVAServlets比傳統(tǒng)的CGI或其它CGI類(lèi)似替代技術(shù)來(lái)說(shuō),效率更高,使用更方便,功能更強(qiáng)大,更小巧也更便宜; 1)1)效率效率 傳統(tǒng)CGI對(duì)每一個(gè)HTTP請(qǐng)求都要產(chǎn)生一個(gè)新的進(jìn)程。如果某個(gè)CGI程序是一個(gè)執(zhí)行非??斓牟僮?,打開(kāi)進(jìn)程的時(shí)間也許占用了大部分執(zhí)行時(shí)間。而對(duì)JAVAServlets來(lái)說(shuō),在JAVA虛擬機(jī)上,每一個(gè)請(qǐng)求由一個(gè)小JAVA線程(thread)響應(yīng),而不是一個(gè)大操作系統(tǒng)進(jìn)程。類(lèi)似地,傳統(tǒng)CGI如果對(duì)同一個(gè)CGI程序有N個(gè)同時(shí)請(qǐng)求,這個(gè)CGI程序的代碼將被導(dǎo)入內(nèi)存N次。

5、JAVAServlets產(chǎn)生N個(gè)線程,但只有一個(gè)JAVAServletsCLASS的copy。同時(shí)JAVAServlets比CGI有更多的優(yōu)化選擇,象預(yù)先計(jì)算,打開(kāi)數(shù)據(jù)庫(kù)連接等。 2)2)方便方便 JAVAServlets能自動(dòng)的粘貼和解碼HTML表單數(shù)據(jù),讀和設(shè)置HTTP頭,處理COOKIES,跟蹤SESSIONS,等其它大量功能。 3)3)強(qiáng)大的功能強(qiáng)大的功能 JAVAServlets可以很容易的實(shí)現(xiàn)對(duì)CGI來(lái)說(shuō)是不可能或很困難的事務(wù)。JAVAServlets能直接和服務(wù)器進(jìn)行通訊而CGI是不能的。 4)JAVA4)JAVA ServletsServlets之間能共享數(shù)據(jù)之間能共享數(shù)據(jù) 很

6、容易實(shí)現(xiàn)諸如數(shù)據(jù)庫(kù)連接池。它能方便的實(shí)現(xiàn)管理從REQUEST到REQUEST請(qǐng)求,簡(jiǎn)化SESSION和獲取前一頁(yè)面。而CGI之間通訊差,由于每個(gè)CGI程序的調(diào)用都開(kāi)始一個(gè)新的進(jìn)程,調(diào)用間通訊通常要通過(guò)文件進(jìn)行,因而相當(dāng)緩慢。同一臺(tái)服務(wù)器上的不同CGI程序之間的通訊也相當(dāng)麻煩。 5)5)調(diào)用時(shí)間調(diào)用時(shí)間 CGI程序是作為單獨(dú)過(guò)程運(yùn)行的,通常調(diào)用時(shí)間較長(zhǎng),這個(gè)間接成本在每次調(diào)用的時(shí)候都要發(fā)生。在使用解釋器的時(shí)候調(diào)用時(shí)間會(huì)更長(zhǎng)。而內(nèi)存中的Servlet可以非常迅速地加載。 6)6)安全安全 有些CGI版本有明顯的安全弱點(diǎn)。即使是使用最新的標(biāo)準(zhǔn)和PERL等語(yǔ)言,系統(tǒng)也沒(méi)有基本安全框架,而要靠一組事實(shí)上

7、的規(guī)則。而java定義有完整的安全機(jī)制,包括ssl,ca認(rèn)證,安全政策等規(guī)范。 7)7)小巧小巧 JAVAServlets使用JAVA編寫(xiě),遵循標(biāo)準(zhǔn)API。它能直接或借助插件在幾乎所有WEB服務(wù)器上運(yùn)行。 8)8)價(jià)格低價(jià)格低 顯然,有很多都是FREE。 ServletsServlets的一些應(yīng)用范圍的一些應(yīng)用范圍 1)用于處理HTML表單:通過(guò)HTTP產(chǎn)生POSTed數(shù)據(jù),包括買(mǎi)賣(mài)訂單或信用卡數(shù)據(jù)。因此servlets可以成為訂單處理系統(tǒng)的一部分,和產(chǎn)品存貨數(shù)據(jù)庫(kù)一道工作,也許可以用在在線支付系統(tǒng)上。2)允許人們之間的合作:一個(gè)servlets能并發(fā)處理多個(gè)請(qǐng)求;他們可以使用在諸如在線會(huì)議這

8、樣的同步請(qǐng)求支持系統(tǒng)。ServletsServlets的一些應(yīng)用范圍的一些應(yīng)用范圍 3)轉(zhuǎn)送請(qǐng)求:Servlets可以轉(zhuǎn)送請(qǐng)求給其他的服務(wù)器和servlets。這就允許在鏡象同樣內(nèi)容的幾個(gè)服務(wù)器之間平衡負(fù)載。按照任務(wù)類(lèi)型或組織范圍,可以允許被用來(lái)在幾個(gè)服務(wù)器中劃分邏輯上的服務(wù)器。 4)servlets編寫(xiě)者們可以定義彼此之間共同工作的激活代理,每個(gè)代理者是一個(gè)servlets,而且代理者能夠在他們之間傳送數(shù)據(jù)。 Servlets Servlets 8.1 8.1 ServletsServlets的結(jié)構(gòu)的結(jié)構(gòu)8.8.2 Servlets2 Servlets的接口的接口 8.8.3 Servlet

9、s3 Servlets的生命周期的生命周期 8.8.5 5 調(diào)用調(diào)用Servlets Servlets 8.48.4 JSPJSP與與ServletsServlets 8.8.6 Servlets6 Servlets的開(kāi)發(fā)的開(kāi)發(fā) 8.1 8.1 ServletsServlets的結(jié)構(gòu)的結(jié)構(gòu) Servlets可直接從瀏覽器客戶端訪問(wèn)調(diào)用,然后完成一些商業(yè)邏輯,比如數(shù)據(jù)庫(kù)訪問(wèn)、計(jì)數(shù)等。Servlets可以像普通的CGI腳本一樣接收GET或POST請(qǐng)。 8.1 8.1 ServletsServlets的結(jié)構(gòu)的結(jié)構(gòu)(Servlets(Servlets程序程序) )importjava.io.*;imp

10、ortjavax.servlet.*;importjavax.servlet.http.*;publicclassHelloWorldextendsHttpServletpublicvoiddoGet(HttpServletRequestreq,HttpServletResponseres)throwsServletException,IOExceptionres.setContentType(text/html);PrintWriterout=res.getWriter();out.println(HelloWorld!);out.println(HelloWorld);out.printl

11、n();out.close();8.1 8.1 ServletsServlets的結(jié)構(gòu)的結(jié)構(gòu)(Servlets(Servlets程序程序) ) 該Servlets處理的是GET請(qǐng)求,所謂的GET請(qǐng)求,如果不熟悉HTTP,可以把它看成是當(dāng)用戶在瀏覽器地址欄輸入U(xiǎn)RL、單擊Web頁(yè)面中的鏈接、提交沒(méi)有指定METHOD的表單時(shí)瀏覽器所發(fā)出的請(qǐng)求。Servlets也可以很方便地處理POST請(qǐng)求,POST請(qǐng)求是提交那些指定了METHOD=post的表單時(shí)所發(fā)出的請(qǐng)求。8.1 8.1 ServletsServlets的結(jié)構(gòu)的結(jié)構(gòu)(Servlets(Servlets程序程序) )HelloWorld的基類(lèi)是

12、HttpServlet,HttpServlet實(shí)現(xiàn)了Servlet接口,HttpServlet繼承GenericServlet類(lèi),GenericServlet實(shí)現(xiàn)Servlet接口,Servlet包含所有與Servlet相關(guān)的接口和類(lèi),最常用的是HttpServlet,如圖所示。8.1 8.1 ServletsServlets的結(jié)構(gòu)的結(jié)構(gòu)(Servlets(Servlets程序程序) )如果某個(gè)類(lèi)要成為Servlets,則它應(yīng)該從HttpServlet繼承,根據(jù)接受的信息是通過(guò)GET還是POST發(fā)送,覆蓋doGet、doPost方法之一或全部。doGet和doPost方法都有兩個(gè) 參 數(shù) ,

13、分 別 為 H t t p S e r v l e t R e q u e s t 類(lèi) 型 和HttpServletResponse類(lèi)型。HttpServletRequest提供訪問(wèn)有關(guān)請(qǐng)求信息的方法,例如表單數(shù)據(jù)、HTTP請(qǐng)求頭等。HttpServletResponse除了提供用于指定HTTP應(yīng)答狀態(tài)(200,404等)、應(yīng)答頭(Content-Type,Set-Cookie等)的方法之外,最重要的是它還提供了一個(gè)用于向客戶端發(fā)送數(shù)據(jù)的PrintWriter()方法。對(duì)于簡(jiǎn)單的Servlets來(lái)說(shuō),PrintWriter()方法的大部分工作是通過(guò)println語(yǔ)句生成向客戶端發(fā)送的頁(yè)面。8.

14、1 8.1 ServletsServlets的結(jié)構(gòu)的結(jié)構(gòu)(Servlets(Servlets程序程序) )在編寫(xiě)Servlets時(shí)要注意doGet和doPost拋出兩個(gè)異常,因此必須在Servlets聲明中包含它們;另外,還必須導(dǎo)入java.io包(要用到PrintWriter等類(lèi))、javax.servlet包(要用到HttpServlet等類(lèi))及javax.servlet.http包(要用到HttpServletRequest類(lèi)和HttpServletResponse類(lèi))。doGet和doPost這兩個(gè)方法是由service()方法調(diào)用的,有時(shí)可能需要直接覆蓋service()方法,譬如S

15、ervlets要處理GET和POST兩種請(qǐng)求時(shí)。8.8.2 Servlets2 Servlets的接口的接口 JavaServletsAPI在兩個(gè)Java擴(kuò)展包中定義:javax.servlet和javax.servlet.http包。在這兩個(gè)包中,javax.servlet包中定義的類(lèi)和接口是獨(dú)立于協(xié)議的;而第二個(gè)包javax.servlet.http中包含了具體于HTTP協(xié)議的類(lèi)和接口。Javax.servlet.http包中的某些類(lèi)/接口擴(kuò)展繼承了某些java.servlet包中的類(lèi)/接口。8.8.2 Servlet2 Servlet的接口的接口在JavaServletAPI中最重要的是

16、Servlet接口(interface),Servlet接口定義了幾個(gè)方法用于初始化一個(gè)Servlets、接受客戶的請(qǐng)求、響應(yīng)客戶的請(qǐng)求等。8.8.2 Servlets2 Servlets的接口的接口Servlets接口的定義如下:PublicinterfaceServlet/釋放Servlets所占用的全部資源(如:內(nèi)存、線程等)Publicabstractvoiddestroy();/返回一個(gè)Servlets的設(shè)置對(duì)象,該對(duì)象包含了該Servlets的所有初始化參數(shù)和啟動(dòng)設(shè)置PublicabstractServletConfiggetServletConfig();/初始化Servlets

17、。Publicabstractvoidinit(ServletConfig)throwsServletException;/執(zhí)行一個(gè)來(lái)自客戶端的請(qǐng)求Publicabstractvoidservice(ServletRequest,ServletResponse)throwsServletExceptionIOException;8.8.2 Servlets2 Servlets的接口的接口所有的Servlets都必須實(shí)現(xiàn)該Servlet接口,實(shí)現(xiàn)的途徑有很多:一是直接實(shí)現(xiàn)該接口,二是通過(guò)擴(kuò)展類(lèi)(class)來(lái)實(shí)現(xiàn),如HttpServlet(HttpServlet繼承GenericServlet類(lèi)

18、;GenericServlet實(shí)現(xiàn)Servlet接口)。這個(gè)Servlet接口提供了Servlets與客戶端聯(lián)系的方法。Servlets編寫(xiě)者可以在開(kāi)發(fā)Servlets程序時(shí)提供部分或者所有方法。8.8.2 Servlets2 Servlets的接口的接口 HttpServlet類(lèi)擴(kuò)展了GenericServlet,并且提供了Servlet接口中具體于HTTP的實(shí)現(xiàn)。它更像是一個(gè)其他Servlet都要擴(kuò)展的類(lèi)。這個(gè)類(lèi)定義了下面的這些方法。8.8.2 Servlets2 Servlets的接口的接口HttpServlet類(lèi)中有兩種形式的service()方法。Publicvoidservice(

19、ServletRequestrequest,ServletResponseresponse)throwsServletException,IoException它是GenericServlet中的service()方法的實(shí)現(xiàn)。這個(gè)方法把request和response對(duì)象分別轉(zhuǎn)換成HttpServletRequest和HttpServletResponse,并且調(diào)用下面這個(gè)重載的service()方法。Protectedvoidservice(HttpServletRequestrequest,HttpServletResponseresponse)這個(gè)重載的方法用具體于HTTP的reques

20、t和response對(duì)象作為參數(shù),并且由上面的第一種方法來(lái)調(diào)用。HttpServlet實(shí)現(xiàn)這個(gè)方法后就成為一個(gè)HTTP請(qǐng)求分發(fā)者。service()方法把請(qǐng)求代理給doGet(),doPost(),doOptions(),doDelete(),doPut()或doTrace()之一。8.8.2 Servlets2 Servlets的接口的接口doGet doGet 用來(lái)處理用來(lái)處理HTTPHTTP的的GETGET請(qǐng)求請(qǐng)求這個(gè)GET操作僅僅允許客戶從HTTP server上取得(GET)資源。重載此方法的用戶自動(dòng)允許支持方法HEAD。這個(gè)GET操作被認(rèn)為是安全的,沒(méi)有任何的負(fù)面影響,對(duì)用戶來(lái)說(shuō)是

21、很可靠的。比如,大多數(shù)的正規(guī)查詢(xún)都沒(méi)有副作用。打算改變存儲(chǔ)數(shù)據(jù)的請(qǐng)求必須用其他的HTTP方法。這些方法也必須是個(gè)安全的操作。方法doGet的缺省執(zhí)行將返回一個(gè)HTTP的BAD_REQUEST錯(cuò)誤。 8.8.2 Servlets2 Servlets的接口的接口 方法方法doGetdoGet的格式:的格式:protected void doGet(HttpServletResquest request, HttpServletResponse response)throws ServletException,IOException;8.8.2 Servlets2 Servlets的接口的接口doP

22、ost doPost 用來(lái)處理用來(lái)處理HTTPHTTP的的POSTPOST請(qǐng)求。請(qǐng)求。 這個(gè)POST操作包含了在必須通過(guò)此Servlet執(zhí)行的請(qǐng)求中的數(shù)據(jù)。由于它不能立即取得資源,故對(duì)于那些涉及到安全性的用戶來(lái)說(shuō),通過(guò)POST請(qǐng)求操作會(huì)有一些副作用。8.8.2 Servlets2 Servlets的接口的接口 方法方法doPostdoPost的格式:的格式:protected void doPost(HttpServletResquest request, HttpServletResponse response)throws ServletException,IOException; 8.8

23、.2 Servlets2 Servlets的接口的接口doPutdoPut用來(lái)處理用來(lái)處理HTTPHTTP的的PUTPUT請(qǐng)求請(qǐng)求 此PUT操作模擬通過(guò)FTP發(fā)送一個(gè)文件。對(duì)于那些涉及到安全性的用戶來(lái)說(shuō),通過(guò)PUT請(qǐng)求操作也會(huì)有一些副作用。 8.8.2 Servlets2 Servlets的接口的接口 方法方法doPutdoPut的格式的格式:protected void doPut(HttpServletResquest request,HttpServletResponse response)throws ServletException,IOException;8.8.2 Servlet

24、s2 Servlets的接口的接口doDeletedoDelete用來(lái)處理用來(lái)處理HTTPHTTP的的DELETEDELETE請(qǐng)求請(qǐng)求 此操作允許客戶端請(qǐng)求一個(gè)從server移出的URL。對(duì)于那些涉及到安全性的用戶來(lái)說(shuō),通過(guò)DELETE請(qǐng)求操作會(huì)有一些副作用。 當(dāng)編寫(xiě)servlet時(shí),為了支持DELETE操作,必須在子類(lèi)HttpServlet中實(shí)現(xiàn)(implement)此方法。8.8.2 Servlets2 Servlets的接口的接口 方法方法doDeletedoDelete的格式:的格式:protected void doDelete (HttpServletResquest reques

25、t, HttpServletResponse response) throws ServletException,IOException;8.8.2 Servlets2 Servlets的接口的接口doHead doHead 用來(lái)處理用來(lái)處理HTTPHTTP的的HEADHEAD請(qǐng)求請(qǐng)求 缺省地,它會(huì)在無(wú)條件的GET方法執(zhí)行時(shí)運(yùn)行,但是不返回任何數(shù)據(jù)到客戶端。只返回包含內(nèi)容信息的長(zhǎng)度的header。由于用到GET操作,此方法應(yīng)該是很安全的(沒(méi)有副作用)也是可重復(fù)使用的。此方法的缺省實(shí)現(xiàn) (implement)自動(dòng)地處理了HTTPDE的HEAD操作并且不需要通過(guò)一個(gè)子類(lèi)實(shí)現(xiàn)(implement)。

26、8.8.2 Servlets2 Servlets的接口的接口 方法方法doHeaddoHead的格式:的格式:protected void doHead (HttpServletResquest request,HttpServletResponse response) throws ServletException,IOException; 8.8.2 Servlets2 Servlets的接口的接口doOptionsdoOptions用來(lái)處理用來(lái)處理HTTPHTTP的的OPTIONSOPTIONS請(qǐng)求請(qǐng)求 此操作自動(dòng)地決定支持什么HTTP方法。比如說(shuō),如果創(chuàng)建HttpServlet的子類(lèi)并

27、重載方法doGet,然后方法doOptions會(huì)返回下面的header:Allow:GET,HEAD,TRACE,OPTIONS一般不需要重載方法doOptions。8.8.2 Servlets2 Servlets的接口的接口 方法方法doOptionsdoOptions的格式:的格式:protected void doOptions HttpServletResquest request, HttpServletResponse response)throws ServletException,IOException;8.8.2 Servlets2 Servlets的接口的接口doTrace

28、doTrace用來(lái)處理用來(lái)處理HTTPHTTP的的TRACETRACE請(qǐng)求請(qǐng)求 此方法的缺省實(shí)現(xiàn)產(chǎn)生一個(gè)包含所有在trace請(qǐng)求中的header的信息的應(yīng)答(response)。在開(kāi)發(fā)servlet時(shí),多數(shù)情況下需要重載此方法。 8.8.2 Servlets2 Servlets的接口的接口 方法方法doTracedoTrace的格式:的格式:protected void doTrace (HttpServletResquest request, HttpServletResponse response)throws ServletException,IOException;8.8.2 Serv

29、lets2 Servlets的接口的接口 在開(kāi)發(fā)以HTTP為基礎(chǔ)的servlet中,Servlet開(kāi)發(fā)者關(guān)心方法doGet和方法doPost即可。8.8.3 Servlets3 Servlets的生命周期的生命周期 如果寫(xiě)過(guò)Java的小應(yīng)用程序(Applet),那Servlet對(duì)你來(lái)說(shuō)就不會(huì)太難,也許更為簡(jiǎn)單。因?yàn)镾ervlet不用考慮圖形界面的應(yīng)用。與小應(yīng)用程序一樣,Servlet也有一個(gè)生命周期。Servlet的生命周期是當(dāng)服務(wù)器裝載運(yùn)行Servlets;接收來(lái)自客戶端的多個(gè)請(qǐng)求并且返回?cái)?shù)據(jù)給客戶端,然后再刪除移開(kāi)Servlets。下面詳細(xì)描述如下: 8.8.3 Servlets3 Ser

30、vlets的生命周期的生命周期 當(dāng)一個(gè)服務(wù)器裝載Servlet時(shí),它運(yùn)行Servlet的 init() 方法。publicvoidinit(ServletConfigconfig)throwsServletExceptionsuper.init();/一些初始化的操作,如數(shù)據(jù)庫(kù)的連接需要記住的是一定要在init()結(jié)束時(shí)調(diào)用super.init()。init()方法不能反復(fù)調(diào)用,一旦調(diào)用就是重裝載Servlet。直到服務(wù)器調(diào)用destroy方法卸載Servlet后才能再調(diào)用。8.8.3 Servlets3 Servlets的生命周期的生命周期 在服務(wù)器裝載初始化Servlet后,Servlet

31、就能夠處理客戶端的請(qǐng)求,我們可以用 service 方法來(lái)實(shí)現(xiàn)。每個(gè)客戶端請(qǐng)求有它自己service方法:這些方法接收客戶端請(qǐng)求,并且發(fā)回相應(yīng)的響應(yīng)。Servlets能同時(shí)運(yùn)行多個(gè)service。這是很重要的,這樣,service方法可以按一個(gè)thread-safe 樣式編寫(xiě)。如:service方法更新Servlet對(duì)象中的一個(gè)字段field,這個(gè)字段是可以同時(shí)存取的。假如某個(gè)服務(wù)器不能同時(shí)并發(fā)運(yùn)行 service方法,也可以用SingleThreadModel 接口。這個(gè)接口保證不會(huì)有兩個(gè)以上的線程(threads)并發(fā)運(yùn)行。在Servlet執(zhí)行期間其最多的應(yīng)用是處理客戶端的請(qǐng)求并產(chǎn)生一個(gè)網(wǎng)

32、頁(yè)。其代碼如下: 8.8.3 Servlets3 Servlets的生命周期的生命周期 PrintWriterout=response.getWriter();out.println(html);out.println(headtitleServlet/title/head);out.println(body);out.println(HelloWorld);out.println(/body/html);out.close();8.8.3 Servlets3 Servlets的生命周期的生命周期 Servlets一直運(yùn)行到他們被服務(wù)器卸載。在結(jié)束的時(shí)候需要收回在init()方法中使用的資源,

33、在Servlet中是通過(guò)destroy()方法來(lái)實(shí)現(xiàn)的。publicvoiddestroy()/回收在init()中啟用的資源,如關(guān)閉數(shù)據(jù)庫(kù)的連接等。8.4 JSPJSP與與servletsservlets 簡(jiǎn)單的說(shuō),SUN首先發(fā)展出Servlet,其功能比較強(qiáng)勁,體系設(shè)計(jì)也很先進(jìn),只是,它輸出HTML語(yǔ)句還是采用了老的CGI方式,是一句一句輸出,所以,編寫(xiě)和修改HTML非常不方便。后來(lái)SUN推出了類(lèi)似于ASP的嵌套型的JSP,把JSP TAG嵌套到HTML語(yǔ)句中,這樣,就大大簡(jiǎn)化和方便了網(wǎng)頁(yè)的設(shè)計(jì)和修改。新型的網(wǎng)絡(luò)語(yǔ)言如ASP,PHP都是嵌套型的。8.4 JSPJSP與與servletsse

34、rvlets Servlets是用Java編寫(xiě)的服務(wù)器端程序,它與協(xié)議和平臺(tái)無(wú)關(guān),運(yùn)行于Web服務(wù)器中。Servlets可以動(dòng)態(tài)地?cái)U(kuò)展服務(wù)器的能力,并采用請(qǐng)求響應(yīng)模式提供Web服務(wù)。 JSP是Sun公司推出的Web開(kāi)發(fā)語(yǔ)言,它類(lèi)似于Microsfot公司的ASP,但由于它的跨平臺(tái)性,愈來(lái)愈受到廣泛的應(yīng)用。 Servlets與JSP之間的交互為開(kāi)發(fā)Web服務(wù)提供了優(yōu)秀的解決方案。8.4 JSPJSP與與servletsservletsJSP主要關(guān)注HTML(或者XML)與Java代碼的結(jié)合,以及加入其中的JSP標(biāo)簽。如果一個(gè)支持JSP的服務(wù)器遇到一個(gè)JSP頁(yè)面,它首先查看該頁(yè)面是否已被編譯成為一

35、個(gè)Servlets。由此可見(jiàn),JSP被編譯成Servlets即被轉(zhuǎn)變?yōu)榧僇ava,然后被裝載入服務(wù)器執(zhí)行。當(dāng)然,這一過(guò)程根據(jù)不同的JSP引擎而略有不同。8.4 JSPJSP與與servletsservlets(1)JSP是HTML(或者XML)與Java代碼結(jié)合的嵌套型語(yǔ)言;而Servlets則是純Java類(lèi)。(2)JSP是以顯示為中心的,它為Web顯示開(kāi)發(fā)人員提供了更加自然的開(kāi)發(fā)模式。而Servlets不適宜開(kāi)發(fā)顯示內(nèi)容改動(dòng)頻繁的頁(yè)面,而在處理更為復(fù)雜的邏輯任務(wù)時(shí),更多使用Servlets。(3)JSP使人們把顯示和邏輯分隔成為可能。這意味著顯示和邏輯開(kāi)發(fā)可以并行進(jìn)行。而Servlets并沒(méi)

36、有將輸出HTML語(yǔ)句和邏輯處理分離開(kāi)。(4)從網(wǎng)絡(luò)三層結(jié)構(gòu)的角度看,一個(gè)網(wǎng)絡(luò)項(xiàng)目最少分三層:數(shù)據(jù)層、商業(yè)邏輯層和表示層。當(dāng)然也可以更復(fù)雜。Servlets用來(lái)編寫(xiě)商業(yè)邏輯層是很強(qiáng)大的,但是對(duì)于編寫(xiě)表示層就很不方便。JSP則主要是為了方便編寫(xiě)表示層而設(shè)計(jì)的。8.4 JSPJSP與與servletsservlets在特定的軟件系統(tǒng)環(huán)境中,選擇使用Servlets或JSP通常不是一個(gè)對(duì)應(yīng)的關(guān)系。把它們結(jié)合起來(lái)使用以達(dá)到一個(gè)平衡的系統(tǒng)是合情合理的。例如,可以把Servlets用做控制器,以讓Servlets處理請(qǐng)求。一旦Servlets完成了請(qǐng)求處理,就把結(jié)果轉(zhuǎn)交給JSP并顯示給用戶。8.4 JSPJ

37、SP與與servletsservlets Servlet訪問(wèn)JSP:fromjspToservlet.jspfromjspToservlet.jsp8.4 JSPJSP與與servletsservlets servletToJsp.javaservletToJsp.java:import java.io.*;import javax.servlet.*;import javax.servlet.http.*;public class ServletToJsp extends HttpServlet public void doGet(HttpServletRequest req, HttpSe

38、rvletResponse res)throws ServletException, IOExceptiontry req.setAttribute (ServletName, ServletToJsp);getServletConfig().getServletContext().getRequestDispatcher(/ServletUseJsp.jsp).forward(req,res); catch (Exception e)e.printStackTrace();8.4 JSPJSP與與servletsservlets getServletConfig().getServletCo

39、ntext(). getRequestDispatcher(/ServletUseJsp.jsp).forward(req,res);這句話的意思大致是這句話的意思大致是: : 從從Servlet ConfigServlet Config中取得中取得ServletServlet上下文上下文, ,并根據(jù)給出的并根據(jù)給出的pathpath將請(qǐng)求轉(zhuǎn)移到令一個(gè)處理單元將請(qǐng)求轉(zhuǎn)移到令一個(gè)處理單元, ,主要是完成請(qǐng)求轉(zhuǎn)移主要是完成請(qǐng)求轉(zhuǎn)移和分發(fā)的功能和分發(fā)的功能. .8.4 JSPJSP與與servletsservlets servletUseJsp.jspservletUseJsp.jsp:Servle

40、t 使用JSPServlet使用JSP的例子:這個(gè)頁(yè)面是被這個(gè)Servlet調(diào)用的。8.8.5 5 調(diào)用調(diào)用ServletsServlets 要調(diào)用Servlet或Web應(yīng)用程序,可以使用下列方法:由URL調(diào)用、在FORM標(biāo)記中調(diào)用、在SERVLET標(biāo)記中調(diào)用。8.8.5 5 調(diào)用調(diào)用ServletsServlets 1 1由由URLURL調(diào)用調(diào)用 ServletServlet 指定 Servlet 名稱(chēng):當(dāng)應(yīng)用服務(wù)器管理器來(lái)將一個(gè)Servlet實(shí)例添加(注冊(cè))到服務(wù)器配置中時(shí),必須指定“Servlet 名稱(chēng)”參數(shù)的值。例如,可以指定將hi作為HelloWorldServlet的Servlet

41、名稱(chēng)。要調(diào)用該Servlet,需打開(kāi)/path/hi。也可以指定Servlet和類(lèi)使用同一名稱(chēng)(HelloWorldServlet)。在這種情況下,將由/path/ HelloWorldServlet 來(lái)調(diào)用Servlet的實(shí)例。8.8.5 5 調(diào)用調(diào)用ServletsServlets 2 2在在FORMFORM標(biāo)記中指定標(biāo)記中指定ServletServlet 可以在FORM標(biāo)記中調(diào)用Servlet。HTML 格式使用戶能在Web頁(yè)面(即從瀏覽器)上輸入數(shù)據(jù),并向Servlet提交數(shù)據(jù)。例如:8.8.5 5

42、 調(diào)用調(diào)用ServletsServlets 2 2在在FORMFORM標(biāo)記中指定標(biāo)記中指定ServletServletFORMMETHOD=GETACTION=/servlet/myservletOLINPUTTYPE=radioNAME=broadcastVALUE=amAMBRINPUTTYPE=radioNAME=broadcastVALUE=fmFMBR/OL(用于放置文本輸入?yún)^(qū)域的標(biāo)記、按鈕和其它的提示符。/FORM 8.8.5 5 調(diào)用調(diào)用ServletsServlets 2 2在在FORMFORM標(biāo)記中指定標(biāo)記中指定ServletServlet ACTION特性表明了用于調(diào)用Se

43、rvlet的URL。關(guān)于METHOD的特性,如果用戶輸入的信息是通過(guò)GET方法向Servlet提交的,則 Servlet 必須優(yōu)先使用doGet()方法。反之,如果用戶輸入的信息是通過(guò)POST方法向Servlet提交的,則 Servlet 必須優(yōu)先使用doPost()方法。 8.8.5 5 調(diào)用調(diào)用ServletsServlets 3 3在在SERVLETSERVLET標(biāo)記中指定標(biāo)記中指定ServletServlet當(dāng)使用SERVLET標(biāo)記來(lái)調(diào)用Servlet時(shí),如同使用FORM標(biāo)記一樣,無(wú)需創(chuàng)建一個(gè)完整的HTML頁(yè)面。作為替代,Servlet的輸出僅是HTML頁(yè)面的一部分,且被動(dòng)態(tài)嵌入到原始HTML頁(yè)面中的其它靜態(tài)文本中。所有這些都發(fā)生在服務(wù)器上,且發(fā)送給用戶的僅是結(jié)果HTML頁(yè)面。8.8.5 5 調(diào)用調(diào)用ServletsServlets 3 3在在SERVLETSERVLET標(biāo)記中指定標(biāo)記中指定ServletServlet下列 HTML 代碼段顯示了如何使用該技術(shù)。 SERVLET NAME=my

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論