大战熟女丰满人妻av-荡女精品导航-岛国aaaa级午夜福利片-岛国av动作片在线观看-岛国av无码免费无禁网站-岛国大片激情做爰视频

Servlet教程

Servlet教程

Servlet 是 Server Applet 的簡(jiǎn)稱,譯為“服務(wù)器端小程序”。Servlet 是 Java 的一套技術(shù)標(biāo)準(zhǔn),規(guī)定了如何使用 Java 來(lái)開(kāi)發(fā)動(dòng)態(tài)網(wǎng)站。換句話說(shuō),Java 可以用來(lái)開(kāi)發(fā)網(wǎng)站后臺(tái),但是要提前定義好一套規(guī)范,并編寫基礎(chǔ)類庫(kù),這就是 Servlet 所做的事情。

Java Servlet 可以使用所有的 Java API,Java 能做的事情,Servlet 都能做。

這套 Servlet 入門教程對(duì) Servlet 技術(shù)的整體框架進(jìn)行了講解,并附帶了實(shí)例演示,閱讀本教程需要具備 Java 基礎(chǔ)。

Servlet 只是古老的 CGI 技術(shù)的替代品,直接使用 Servlet 開(kāi)發(fā)還是很麻煩,所以 Java 后來(lái)又對(duì) Servlet 進(jìn)行了升級(jí),推出了 JSP 技術(shù)。JSP 只是對(duì) Servlet 加了一層殼,JSP 經(jīng)過(guò)編譯后還是 Servlet。

Servlet歷程

Servlet 是在服務(wù)器上運(yùn)行的小程序。這個(gè)詞是在 Java applet的環(huán)境中創(chuàng)造的,Java applet 是一種當(dāng)作單獨(dú)文件跟網(wǎng)頁(yè)一起發(fā)送的小程序,它通常用于在客戶端運(yùn)行,結(jié)果得到為用戶進(jìn)行運(yùn)算或者根據(jù)用戶互作用定位圖形等服務(wù)。

服務(wù)器上需要一些程序,常常是根據(jù)用戶輸入訪問(wèn)數(shù)據(jù)庫(kù)的程序。這些通常是使用公共網(wǎng)關(guān)接口(Common Gateway Interface,CGI)應(yīng)用程序完成的。然而,在服務(wù)器上運(yùn)行 Java,這種程序可使用 Java 編程語(yǔ)言實(shí)現(xiàn)。在通信量大的服務(wù)器上,JavaServlet 的優(yōu)點(diǎn)在于它們的執(zhí)行速度更快于 CGI 程序。各個(gè)用戶請(qǐng)求被激活成單個(gè)程序中的一個(gè)線程,而無(wú)需創(chuàng)建單獨(dú)的進(jìn)程,這意味著服務(wù)器端處理請(qǐng)求的系統(tǒng)開(kāi)銷將明顯降低。

實(shí)現(xiàn)過(guò)程

最早支持 Servlet 技術(shù)的是 JavaSoft 的 Java Web Server。此后,一些其它的基于 Java 的 Web Server 開(kāi)始支持標(biāo)準(zhǔn)的 Servlet API。Servlet 的主要功能在于交互式地瀏覽和修改數(shù)據(jù),生成動(dòng)態(tài) Web 內(nèi)容。這個(gè)過(guò)程為:

• 客戶端發(fā)送請(qǐng)求至服務(wù)器端;

• 服務(wù)器將請(qǐng)求信息發(fā)送至 Servlet;

• Servlet 生成響應(yīng)內(nèi)容并將其傳給服務(wù)器。響應(yīng)內(nèi)容動(dòng)態(tài)生成,通常取決于客戶端的請(qǐng)求;

• 服務(wù)器將響應(yīng)返回給客戶端。

• Servlet 看起來(lái)像是通常的 Java 程序。Servlet 導(dǎo)入特定的屬于 Java Servlet API 的包。因?yàn)槭菍?duì)象字節(jié)碼,可動(dòng)態(tài)地從網(wǎng)絡(luò)加載,可以說(shuō) Servlet 對(duì) Server 就如同 Applet對(duì) Client 一樣,但是,由于 Servlet 運(yùn)行于 Server 中,它們并不需要一個(gè)圖形用戶界面。從這個(gè)角度講,Servlet 也被稱為 FacelessObject。

• 一個(gè) Servlet 就是 Java 編程語(yǔ)言中的一個(gè)類,它被用來(lái)擴(kuò)展服務(wù)器的性能,服務(wù)器上駐留著可以通過(guò)“請(qǐng)求-響應(yīng)”編程模型來(lái)訪問(wèn)的應(yīng)用程序。雖然 Servlet 可以對(duì)任何類型的請(qǐng)求產(chǎn)生響應(yīng),但通常只用來(lái)擴(kuò)展 Web 服務(wù)器的應(yīng)用程序。

Servlet命名

Servlet 的命名可以看出 sun 命名的特點(diǎn),如 Applet 表示小應(yīng)用程序;Scriptlet = Script + Applet,表示小腳本程序;同樣 Servlet = Service + Applet,表示小服務(wù)程序。

生命周期編輯

客戶端請(qǐng)求該 Servlet;

加載 Servlet 類到內(nèi)存;

實(shí)例化并調(diào)用init()方法初始化該 Servlet;

service()(根據(jù)請(qǐng)求方法不同調(diào)用doGet() 或者 doPost(),此外還有doHead()、doPut()、doTrace()、doDelete()、doOptions());

destroy()。

加載和實(shí)例化 Servlet。這項(xiàng)操作一般是動(dòng)態(tài)執(zhí)行的。然而,Server 通常會(huì)提供一個(gè)管理的選項(xiàng),用于在 Server 啟動(dòng)時(shí)強(qiáng)制裝載和初始化特定的 Servlet。

Server 創(chuàng)建一個(gè) Servlet的實(shí)例

第一個(gè)客戶端的請(qǐng)求到達(dá) Server

Server 調(diào)用 Servlet 的 init() 方法(可配置為 Server 創(chuàng)建 Servlet 實(shí)例時(shí)調(diào)用,在 web.xml 中 標(biāo)簽下配置 標(biāo)簽,配置的值為整型,值越小 Servlet 的啟動(dòng)優(yōu)先級(jí)越高)

一個(gè)客戶端的請(qǐng)求到達(dá) Server

Server 創(chuàng)建一個(gè)請(qǐng)求對(duì)象,處理客戶端請(qǐng)求

Server 創(chuàng)建一個(gè)響應(yīng)對(duì)象,響應(yīng)客戶端請(qǐng)求

Server 激活 Servlet 的 service() 方法,傳遞請(qǐng)求和響應(yīng)對(duì)象作為參數(shù)

service() 方法獲得關(guān)于請(qǐng)求對(duì)象的信息,處理請(qǐng)求,訪問(wèn)其他資源,獲得需要的信息

service() 方法使用響應(yīng)對(duì)象的方法,將響應(yīng)傳回Server,最終到達(dá)客戶端。service()方法可能激活其它方法以處理請(qǐng)求,如 doGet() 或 doPost() 或程序員自己開(kāi)發(fā)的新的方法。

對(duì)于更多的客戶端請(qǐng)求,Server 創(chuàng)建新的請(qǐng)求和響應(yīng)對(duì)象,仍然激活此 Servlet 的 service() 方法,將這兩個(gè)對(duì)象作為參數(shù)傳遞給它。如此重復(fù)以上的循環(huán),但無(wú)需再次調(diào)用 init() 方法。一般 Servlet 只初始化一次(只有一個(gè)對(duì)象),當(dāng) Server 不再需要 Servlet 時(shí)(一般當(dāng) Server 關(guān)閉時(shí)),Server 調(diào)用 Servlet 的 destroy() 方法。

Servlet的工作模式

客戶端發(fā)送請(qǐng)求至服務(wù)器;

服務(wù)器啟動(dòng)并調(diào)用 Servlet,Servlet 根據(jù)客戶端請(qǐng)求生成響應(yīng)內(nèi)容并將其傳給服務(wù)器;

服務(wù)器將響應(yīng)返回客戶端。

對(duì)比

與 Applet 的比較

相似之處:

• 它們不是獨(dú)立的應(yīng)用程序,沒(méi)有 main() 方法。

• 它們不是由用戶或程序員調(diào)用,而是由另外一個(gè)應(yīng)用程序(容器)調(diào)用。

• 它們都有一個(gè)生存周期,包含 init() 和 destroy() 方法。

不同之處:

• Applet具有很好的圖形界面(AWT),與瀏覽器一起,在客戶端運(yùn)行。

• Servlet 則沒(méi)有圖形界面,運(yùn)行在服務(wù)器端。

與 CGI 比較

與傳統(tǒng)的 CGI 和許多其他類似 CGI 的技術(shù)相比,Java Servlet 具有更高的效率,更容易使用,功能更強(qiáng)大,具有更好的可移植性,更節(jié)省投資。在未來(lái)的技術(shù)發(fā)展過(guò)程中,Servlet 有可能徹底取代 CGI。

在傳統(tǒng)的 CGI中,每個(gè)請(qǐng)求都要啟動(dòng)一個(gè)新的進(jìn)程,如果 CGI 程序本身的執(zhí)行時(shí)間較短,啟動(dòng)進(jìn)程所需要的開(kāi)銷很可能反而超過(guò)實(shí)際執(zhí)行時(shí)間。而在 Servlet 中,每個(gè)請(qǐng)求由一個(gè)輕量級(jí)的 Java 線程處理(而不是重量級(jí)的操作系統(tǒng)進(jìn)程)。

在傳統(tǒng) CGI 中,如果有 N 個(gè)并發(fā)的對(duì)同一 CGI程序的請(qǐng)求,則該CGI程序的代碼在內(nèi)存中重復(fù)裝載了 N 次;而對(duì)于 Servlet,處理請(qǐng)求的是 N 個(gè)線程,只需要一份 Servlet 類代碼。在性能優(yōu)化方面,Servlet 也比 CGI 有著更多的選擇。

• 方便

Servlet 提供了大量的實(shí)用工具例程,例如自動(dòng)地解析和解碼 HTML 表單數(shù)據(jù)、讀取和設(shè)置 HTTP頭、處理Cookie、跟蹤會(huì)話狀態(tài)等。

• 功能強(qiáng)大

在Servlet中,許多使用傳統(tǒng) CGI 程序很難完成的任務(wù)都可以輕松地完成。例如,Servlet 能夠直接和 Web服務(wù)器交互,而普通的 CGI 程序不能。Servlet 還能夠在各個(gè)程序之間共享數(shù)據(jù),使得數(shù)據(jù)庫(kù)連接池之類的功能很容易實(shí)現(xiàn)。

• 可移植性好

Servlet 用 Java 編寫,Servlet API具有完善的標(biāo)準(zhǔn)。因此,為 IPlanet Enterprise Server 寫的 Servlet 無(wú)需任何實(shí)質(zhì)上的改動(dòng)即可移植到 Apache、MicrosoftIIS 或者 WebStar。幾乎所有的主流服務(wù)器都直接或通過(guò)插件支持 Servlet。

• 節(jié)省投資

不僅有許多廉價(jià)甚至免費(fèi)的 Web 服務(wù)器可供個(gè)人或小規(guī)模網(wǎng)站使用,而且對(duì)于現(xiàn)有的服務(wù)器,如果它不支持 Servlet 的話,要加上這部分功能也往往是免費(fèi)的(或只需要極少的投資)。

與 JSP 比較

JSP 和 Servlet 的區(qū)別到底在應(yīng)用上有哪些體現(xiàn),很多人搞不清楚。簡(jiǎn)單的說(shuō),SUN 首先發(fā)展出 Servlet,其功能比較強(qiáng)勁,體系設(shè)計(jì)也很先進(jìn),只是,它輸出 HTML 語(yǔ)句還是采用了老的 CGI 方式,是一句一句輸出,所以,編寫和修改 HTML 非常不方便。

Java Server Pages(JSP)是一種實(shí)現(xiàn)普通靜態(tài)HTML 和動(dòng)態(tài) HTML 混合編碼的技術(shù),JSP 并沒(méi)有增加任何本質(zhì)上不能用 Servlet 實(shí)現(xiàn)的功能。但是,在 JSP 中編寫靜態(tài)HTML 更加方便,不必再用 println語(yǔ) 句來(lái)輸出每一行 HTML 代碼。更重要的是,借助內(nèi)容和外觀的分離,頁(yè)面制作中不同性質(zhì)的任務(wù)可以方便地分開(kāi):比如,由頁(yè)面設(shè)計(jì)者進(jìn)行 HTML設(shè)計(jì),同時(shí)留出供 Servlet 程序員插入動(dòng)態(tài)內(nèi)容的空間。

后來(lái) SUN 推出了類似于 ASP 的鑲嵌型的 JSP,把 JSP TAG 鑲嵌到 HTML 語(yǔ)句中,這樣,就大大簡(jiǎn)化和方便了網(wǎng)頁(yè)的設(shè)計(jì)和修改。新型的網(wǎng)絡(luò)語(yǔ)言如 ASP,PHP,JSP 都是鑲嵌型的語(yǔ)言。 這是 JSP 和 Servlet 區(qū)別的運(yùn)作原理層面。

從網(wǎng)絡(luò)三層結(jié)構(gòu)的角度看 JSP 和 Servlet 的區(qū)別,一個(gè)網(wǎng)絡(luò)項(xiàng)目最少分三層:data layer(數(shù)據(jù)層),business layer(業(yè)務(wù)層),presentation layer(表現(xiàn)層)。當(dāng)然也可以更復(fù)雜。Servlet 用來(lái)寫 business layer 是很強(qiáng)大的,但是對(duì)于寫 presentation layer 就很不方便。JSP 則主要是為了方便寫 presentation layer 而設(shè)計(jì)的。當(dāng)然也可以寫 business layer。寫慣了 ASP,PHP,CGI的朋友,經(jīng)常會(huì)不自覺(jué)的把 presentation layer 和 business layer 混在一起。

據(jù) SUN 自己的推薦,JSP中應(yīng)該僅僅存放與 presentation layer 有關(guān)的東西,也就是說(shuō),只放輸出 HTML 網(wǎng)頁(yè)的部分。而所有的數(shù)據(jù)計(jì)算,數(shù)據(jù)分析,數(shù)據(jù)庫(kù)聯(lián)結(jié)處理,統(tǒng)統(tǒng)是屬于 business layer,應(yīng)該放在 Java BEANS 中。通過(guò) JSP 調(diào)用 Java BEANS,實(shí)現(xiàn)兩層的整合。

微軟前不久推出的 DNA 技術(shù),是 ASP+COM/DCOM 技術(shù)。與J SP+BEANS 完全類似,所有的 presentation layer 由 ASP 完成,所有的 business layer 由 COM/DCOM 完成。通過(guò)調(diào)用,實(shí)現(xiàn)整合。

采用這些組件技術(shù)單純的因?yàn)?ASP/JSP 語(yǔ)言是非常低效率執(zhí)行的,如果出現(xiàn)大量用戶點(diǎn)擊,純 SCRIPT 語(yǔ)言很快就到達(dá)了他的功能上限,而組件技術(shù)就能大幅度提高功能上限,加快執(zhí)行速度。

另外一方面,純 SCRIPT 語(yǔ)言將 presentation layer 和 business layer 混在一起,造成修改不方便,并且代碼不能重復(fù)利用。如果想修改一個(gè)地方,經(jīng)常會(huì)牽涉到十幾頁(yè) code,采用組件技術(shù)就只改組件就可以了。

綜上所述,Servlet 是一個(gè)早期的不完善的產(chǎn)品,寫 business layer 很好,寫 presentation layer 就很臭,并且兩層混雜。

所以,推出JSP+BEAN,用 JSP 寫 presentation layer,用 BEAN 寫 business layer。SUN 自己的意思也是將來(lái)用 JSP 替代 Servlet。這是技術(shù)更新方面 JSP 和 Servlet 的區(qū)別。

可是,這不是說(shuō),學(xué)了 Servlet 沒(méi)用,實(shí)際上,你還是應(yīng)該從 Servlet 入門,再上 JSP,再上 JSP+BEAN。

強(qiáng)調(diào)的是:學(xué)了JSP,不會(huì)用 Java BEAN 并進(jìn)行整合,等于沒(méi)學(xué)。大家多花點(diǎn)力氣在 JSP+BEAN 上。

我們可以看到,當(dāng) ASP+COM 和 JSP+BEAN 都采用組件技術(shù)后,所有的組件都是先進(jìn)行編譯,并駐留內(nèi)存,然后快速執(zhí)行。所以,大家經(jīng)常吹的 Servlet/JSP 先編譯駐內(nèi)存后執(zhí)行的速度優(yōu)勢(shì)就沒(méi)有了。

反之,ASP+COM+IIS+NT 緊密整合,應(yīng)該會(huì)有較大的速度優(yōu)勢(shì)呈現(xiàn)。而且,ASP+COM+IIS+NT 開(kāi)發(fā)效率非常高,雖然bug 很多。

那么,為什么還用 JSP+BEAN?因?yàn)?Java 實(shí)在前途遠(yuǎn)大。操作系統(tǒng)群雄并起,應(yīng)用軟件的開(kāi)發(fā)商必定要找一個(gè)通用開(kāi)發(fā)語(yǔ)言進(jìn)行開(kāi)發(fā),Java 一統(tǒng)天下的時(shí)機(jī)就到了。

簡(jiǎn)單分析了一下 JSP 和 Servlet 的區(qū)別和 Java Web 開(kāi)發(fā)方面的發(fā)展。隨著機(jī)器速度越來(lái)越快,Java 的速度劣勢(shì)很快就可以被克服。

規(guī)范

1.簡(jiǎn)化開(kāi)發(fā)

2.便于部署

3.支持 Web2.0 原則

為了簡(jiǎn)化開(kāi)發(fā)流程,Servlet 3.0 引入了注解(annotation),這使得 web 部署描述符 web.xml 不再是必須的選擇。

Pluggability可插入性

當(dāng)使用任何第三方的框架,如 Struts,JSF 或 Spring,我們都需要在 web.xml 中添加對(duì)應(yīng)的 Servlet 的入口。這使得 web 描述符笨重而難以維護(hù)。Servlet3.0 的新的可插入特性使得 web 應(yīng)用程序模塊化而易于維護(hù)。通過(guò) web fragment 實(shí)現(xiàn)的可插入性減輕了開(kāi)發(fā)人員的負(fù)擔(dān),不需要再在 web.xml 中配置很多的 Servlet 入口。

Asynchronous Processing 異步處理

另外一個(gè)顯著的改變就是 Servlet 3.0 支持異步處理,這對(duì) AJAX 應(yīng)用程序非常有用。當(dāng)一個(gè) Servlet 創(chuàng)建一個(gè)線程來(lái)處理某些請(qǐng)求的時(shí)候,如查詢數(shù)據(jù)庫(kù)或消息連接,這個(gè)線程要等待直到獲得所需要的資源才能夠執(zhí)行其他的操作。異步處理通過(guò)運(yùn)行線程執(zhí)行其他的操作來(lái)避免了這種阻塞。

Apart from the features mentioned here, several other enhancements have been made to the existing API. The sections towards the end of the article will explore these features one by one in detail。

除了這些新特性之外, Servlet 3.0對(duì)已有的 API 也做了一些改進(jìn),在本文的最后我們會(huì)做介紹。

Annotations in Servlet Servlet中使用注解

Servlet 3.0 的一個(gè)主要的改變就是支持注解。使用注解來(lái)定義 Servlet 和 filter 使得我們不用在 web.xml 中定義相應(yīng)的入口。

@WebServlet

@WebServlet 用來(lái)定義 web 應(yīng)用程序中的一個(gè) Servlet。這個(gè)注解可以應(yīng)用于繼承了 HttpServlet。這個(gè)注解有多個(gè)屬性,例如 name,urlPattern, initParams,我們可以使用者的屬性來(lái)定義 Servlet 的行為。urlPattern 屬性是必須指定的。

常見(jiàn)容器

Tomcat, Jetty, resin, Oracle Application server, WebLogic Server, Glassfish, Websphere, JBoss 等等。(提供了 Servlet 功能的服務(wù)器,叫做 Servlet 容器。對(duì) web 程序來(lái)說(shuō),Servlet 容器的作用就相當(dāng)于桌面程序里操作系統(tǒng)的作用,都是提供一些編程基礎(chǔ)設(shè)施)

建議

在 Web 應(yīng)用程序中,一個(gè) Servlet 在一個(gè)時(shí)刻可能被多個(gè)用戶同時(shí)訪問(wèn)。這時(shí) Web 容器將為每個(gè)用戶創(chuàng)建一個(gè)線程來(lái)執(zhí)行 Servlet。如果 Servlet 不涉及共享資源的問(wèn)題,不必關(guān)心多線程問(wèn)題。但如果 Servlet 需要共享資源,需要保證 Servlet 是線程安全的。

下面是編寫線程安全的 Servlet 的一些建議:

• 用方法的局部變量保存請(qǐng)求中的專有數(shù)據(jù)。對(duì)方法中定義的局部變量,進(jìn)入方法的每個(gè)線程都有自己的一份方法變量拷貝。任何線程都不會(huì)修改其他線程的局部變量。如果要在不同的請(qǐng)求之間共享數(shù)據(jù),應(yīng)該使用會(huì)話來(lái)共享這類數(shù)據(jù)。

• 只用 Servlet的成員變量來(lái)存放那些不會(huì)改變的數(shù)據(jù)。有些數(shù)據(jù)在 Servlet 生命周期中不發(fā)生任何變化,通常是在初始時(shí)確定的,這些數(shù)據(jù)可以使用成員變量保存,如數(shù)據(jù)庫(kù)連接名稱、其他資源的路徑等。

• 對(duì)可能被請(qǐng)求修改的成員變量同步。有時(shí)數(shù)據(jù)成員變量或者環(huán)境屬性可能被請(qǐng)求修改。當(dāng)訪問(wèn)這些數(shù)據(jù)時(shí)應(yīng)該對(duì)它們同步,以避免多個(gè)線程同時(shí)修改這些數(shù)據(jù)。

如果 Servlet 訪問(wèn)外部資源,那么需要同步訪問(wèn)這些資源。例如,假設(shè) Servlet 要從文件中讀寫數(shù)據(jù)。當(dāng)一個(gè)線程讀寫一個(gè)文件時(shí),其他線程也可能正在讀寫這個(gè)文件。文件訪問(wèn)本身不是線程安全的,所以必須編寫同步訪問(wèn)這些資源的代碼。在編寫線程安全的 Servlet 時(shí),下面兩種方法是不應(yīng)該使用的:

• 在 Servlet API 中提供了一個(gè) SingleThreadModel 接口,實(shí)現(xiàn)這個(gè)接口的 Servlet 在被多個(gè)客戶請(qǐng)求時(shí)一個(gè)時(shí)刻只有一個(gè)線程運(yùn)行。這個(gè)接口已被標(biāo)記不推薦使用。

• 對(duì) doGet() 或doPost() 方法同步。如果必須在 Servlet 中使用同步代碼,應(yīng)盡量在最小的代碼塊范圍上進(jìn)行同步。同步代碼越小,Servlet 執(zhí)行得才越好。

全部教程
主站蜘蛛池模板: 日本aaaa毛片在线看 | 精品免费tv久久久久久久 | 亚洲第一a | 国产在线精品一区二区三区不卡 | 天天射天天舔 | 伊人网伊人网 | 成人网在线免费观看 | 国产精品毛片一区二区三区 | 色视频在线播放 | 老司机精品久久最新免费 | 婷婷 色天使 | 国产美女拍拍拍在线观看 | 日日撸夜夜干 | 亚洲精品永久一区 | 成人性生活视频 | 亚洲免费观看视频 | 9i9精品国产免费久久 | 色噜噜狠狠色综合免费视频 | 亚洲欧美日韩一区超高清 | 男人猛桶女人下面视频国产 | 中文字幕亚洲欧美日韩高清 | 亚洲国产成人久久精品动漫 | 国产小视频在线播放 | 日韩欧美国产一区二区三区四区 | 日日爽夜夜 | 亚洲精品不卡在线 | 亚洲 欧美 另类 天天更新影院 | 国内外成人在线视频 | 久久免费成人 | 在线播放精品视频 | 中文字幕人成乱码第一页 | 欧美一级人与动毛片免费播放 | 一 级做人爱全视频在线看 一a级毛片 | 亚洲欧美日韩国产vr在线观 | 黄片毛片一级片 | 91蝌蚪在线播放 | 国产亚洲精品国产 | 98色花堂国产精品首页 | 国产欧美日韩成人 | 中文字幕久久亚洲一区 | 成 人 免费 黄 色 视频 |