訂閱
糾錯
加入自媒體

Java技術標準:服務器端小程序實戰(zhàn)入門

Servlet的工作模式

客戶端發(fā)送請求至服務器;
服務器啟動并調用 Servlet,Servlet 根據(jù)客戶端請求生成響應內容并將其傳給服務器;

服務器將響應返回客戶端。

對比

與 Applet 的比較

相似之處:

? 它們不是獨立的應用程序,沒有 main() 方法。

? 它們不是由用戶或程序員調用,而是由另外一個應用程序(容器)調用。

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

不同之處:

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

? Servlet 則沒有圖形界面,運行在服務器端。

與 CGI 比較

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

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

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

? 方便

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

? 功能強大

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

? 可移植性好

Servlet 用 Java 編寫,Servlet API具有完善的標準。因此,為 IPlanet Enterprise Server 寫的 Servlet 無需任何實質上的改動即可移植到 Apache、MicrosoftIIS 或者 WebStar。幾乎所有的主流服務器都直接或通過插件支持 Servlet。

? 節(jié)省投資

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

與 JSP 比較

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

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

后來 SUN 推出了類似于 ASP 的鑲嵌型的 JSP,把 JSP TAG 鑲嵌到 HTML 語句中,這樣,就大大簡化和方便了網頁的設計和修改。新型的網絡語言如 ASP,PHP,JSP 都是鑲嵌型的語言。 這是 JSP 和 Servlet 區(qū)別的運作原理層面。

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

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

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

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

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

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

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

可是,這不是說,學了 Servlet 沒用,實際上,你還是應該從 Servlet 入門,再上 JSP,再上 JSP+BEAN。

強調的是:學了JSP,不會用 Java BEAN 并進行整合,等于沒學。大家多花點力氣在 JSP+BEAN 上。

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

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

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

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

規(guī)范

1.簡化開發(fā)

2.便于部署

3.支持 Web2.0 原則

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

Pluggability可插入性

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

Asynchronous Processing 異步處理

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

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對已有的 API 也做了一些改進,在本文的最后我們會做介紹。

Annotations in Servlet Servlet中使用注解

Servlet 3.0 的一個主要的改變就是支持注解。使用注解來定義 Servlet 和 filter 使得我們不用在 web.xml 中定義相應的入口。

@WebServlet

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

常見容器

Tomcat, Jetty, resin, Oracle Application server, WebLogic Server, Glassfish, Websphere, JBoss 等等。(提供了 Servlet 功能的服務器,叫做 Servlet 容器。對 web 程序來說,Servlet 容器的作用就相當于桌面程序里操作系統(tǒng)的作用,都是提供一些編程基礎設施)

建議

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

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

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

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

? 對可能被請求修改的成員變量同步。有時數(shù)據(jù)成員變量或者環(huán)境屬性可能被請求修改。當訪問這些數(shù)據(jù)時應該對它們同步,以避免多個線程同時修改這些數(shù)據(jù)。

如果 Servlet 訪問外部資源,那么需要同步訪問這些資源。例如,假設 Servlet 要從文件中讀寫數(shù)據(jù)。當一個線程讀寫一個文件時,其他線程也可能正在讀寫這個文件。文件訪問本身不是線程安全的,所以必須編寫同步訪問這些資源的代碼。在編寫線程安全的 Servlet 時,

下面兩種方法是不應該使用的:

? 在 Servlet API 中提供了一個 SingleThreadModel 接口,實現(xiàn)這個接口的 Servlet 在被多個客戶請求時一個時刻只有一個線程運行。這個接口已被標記不推薦使用。

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

Servlet 為創(chuàng)建基于 web 的應用程序提供了基于組件、獨立于平臺的方法,可以不受 CGI 程序的性能限制。Servlet 有權限訪問所有的 Java API,包括訪問企業(yè)級數(shù)據(jù)庫的 JDBC API。

這套 Servlet 入門對 Servlet 技術的整體框架進行了講解,并附帶了實例演示。

image.png

image.png

以上Servlet全套視頻|資料可評論/私信免費獲取~~~

<上一頁  1  2  
聲明: 本文由入駐維科號的作者撰寫,觀點僅代表作者本人,不代表OFweek立場。如有侵權或其他問題,請聯(lián)系舉報。

發(fā)表評論

0條評論,0人參與

請輸入評論內容...

請輸入評論/評論長度6~500個字

您提交的評論過于頻繁,請輸入驗證碼繼續(xù)

暫無評論

暫無評論

人工智能 獵頭職位 更多
掃碼關注公眾號
OFweek人工智能網
獲取更多精彩內容
文章糾錯
x
*文字標題:
*糾錯內容:
聯(lián)系郵箱:
*驗 證 碼:

粵公網安備 44030502002758號