【正文】
hreads are much less expensive than the server processes used by CGI programs. Once the servlet has been created, using it for additional requests incurs very little overhead. Servlet developers can use the init() method to hold references to expensive resources, such as database connections or EJB Home Interfaces, so that they can be shared between requests. Acquiring resources like these can take several seconds— which is longer than many surfers are willing to wait. The other edge of the sword is that, since servlets are multithreaded, servlet developers must take special care to be sure their servlets are threadsafe. To learn more about servlet programming, we remend Java Servlets by Example, by Alan R. Williamson [Williamson]. The definitive source for Servlet information is the Java Servlet Specification [Sun, JST]. JavaServer Pages: 6 While Java servlets are a big step up from CGI programs, they are not a panacea. To generate the response, developers are still stuck with using println statements to render the HTML. Code that looks like: (POne line of HTML./P)。 (PAnother line of HTML./P)。 mutators are used to change a JavaBean’s state. Mutators are always prefixed with lowercase token set followed by the property name. The first character in the property name must be uppercase. The return value is always void— mutators only change property values。象人一樣,軟件應(yīng)用的相似性比不同點要多。開發(fā)傳統(tǒng)桌面應(yīng)用的開發(fā)人員更習(xí)慣于那些可以涵蓋應(yīng)用開發(fā)同一性的工具包和開發(fā)環(huán)境。 框架向開發(fā)人員提供一系列具有以下特征的骨架組件: 1.已經(jīng)知道它們在其它程序上工作得很好; 2.它們隨時可以在下一個項目 中使用; 3.它們可以被組織的其它團(tuán)隊使用; 對于框架是典型的構(gòu)建還是購買命題。 其它類型的框架: 框架的概念不僅用于應(yīng)用程序也可用于組件。這些包括 Lucene 搜索引擎, Scaffold工具包,Struts 驗證器,以及 Tiles 標(biāo)簽庫。某些框架被限制于專門的開發(fā)環(huán)境中。你可以在很多環(huán)境中來開發(fā) Struts: Visual Age for Java, JBuilder, Eclipse, Emacs, 甚至使用 Textpad。 使用的技術(shù): 使用 Struts 的應(yīng)用開 發(fā)使用了大量的其他基礎(chǔ)技術(shù)。開發(fā)者使用 Struts 之類的框架是為了隱藏在諸如 HTTP, CGI,以及 JSP之類技術(shù)后面的繁瑣的細(xì)節(jié)。 超文本傳輸協(xié)議 (HTTP): 當(dāng)兩個國家之間進(jìn)行調(diào)解時,外交官們總是遵循一定的正式協(xié)議。同樣,當(dāng)計算機(jī)間需要對話,它們也遵循一個正式的協(xié)議。Web應(yīng)用程序就是使用 HTTP協(xié)議在運行瀏覽器的計算機(jī)和運行的服務(wù)器的程序間傳輸數(shù)據(jù)。他們在計算機(jī)之間維護(hù)一個持久性的連接。因為它們知道每一個連接的狀態(tài),以及每一個使用它的人。 相反, HTTP是一個無狀態(tài)協(xié)議。沒有 大量的協(xié)商和連接持久性,無狀態(tài)協(xié)議可以處理大量的請求。 HTTP 成為通用標(biāo)準(zhǔn)的原因是其簡單性。這使應(yīng)用程序很容易創(chuàng)建 HTTP請求。當(dāng) HTTP響應(yīng)返回時,它也是一個開發(fā)者可以直接閱讀的平面文本。 HTTP 請求頭跟在首行后面,可以沒有也可以有多個??梢园?瀏覽器的種類和版本,可接受的文檔類型,瀏覽器的 cookies等等。 一旦服務(wù)器接收到請求,它就要產(chǎn)生一個 HTTP響應(yīng)。狀態(tài)行后,服務(wù)器將返回一個 HTTP 響應(yīng)頭,類似于 HTTP 請求頭。服務(wù)器接受請求,發(fā)出響應(yīng),并且繼續(xù)愉快地處理文本請求。 Cookies和 URL 重寫是兩 個在請求間跟蹤用戶狀態(tài)的方式。 URL重寫是在頁面地址中存儲一個特殊的標(biāo)記, Java服務(wù)器可以用它來跟蹤用戶。對其本身來說,標(biāo)準(zhǔn)的 HTTP web服務(wù)器并不傳輸動態(tài)內(nèi)容。通常這里的文件使用Hypertext Markup Language (HTML) [W3C,HTML] 格式化,以使瀏覽器可以顯示它們。用戶點擊連接將產(chǎn)生另一個請求,就開始一個新的處理過程。 定義 靜態(tài)內(nèi)容直接來自于文本或數(shù)據(jù)文件,比如 HTML 或者 JPEG 文件。相反,動態(tài)內(nèi)容是臨時產(chǎn)生的,典型地,它是針對瀏覽器的個別請求的響應(yīng)。 CGI使用標(biāo)準(zhǔn)的操作系統(tǒng)特征,比如環(huán)境變量和標(biāo)準(zhǔn)輸入輸出,在 Web服務(wù)器間以及和主機(jī)系統(tǒng)間創(chuàng)建橋接和網(wǎng)關(guān)。當(dāng) web服務(wù)器接收到一個對 CGI程序的請求時,它便運行這個程序并向其提供它請求里面所包含的信息。 CGI定義了一套關(guān)于什么信息將作為環(huán)境變量傳遞,以及它希望怎樣使用標(biāo)準(zhǔn)輸入和輸出的慣例。 CGI的主要缺點是它必須為每個請求運行一個程序。 CGI程序的另一個缺點是平臺依賴性,一個平臺上開發(fā)的程序不一定在另一個平臺上能運行。其次,一次編寫,隨處運行的 JAVA特性意味著 servlet在有 JVM 的操 作系統(tǒng)間是輕便的可移動的。它接受請求并產(chǎn)生響應(yīng)。 xxx大學(xué)畢業(yè)設(shè)計(論文)外文翻譯 —— 譯文 4 Servlet 本身是要編譯成字節(jié)碼的 Java類,就像其他 Java對象一樣。為了使常規(guī) web servers 能訪問 servlet, servlet被安插在一個容器之中。每 servlet 都可以聲明它可以處理何種樣式的 URL。但和 CGI 程序不同,并不是針對每個請求都要創(chuàng)建一個新的 servlet。 Java線程可比使用 CGI程序的服務(wù)器處理開銷小多了。 Servlet開發(fā) 人員可以使用 init() 方法保持對昂貴資源的引用,比如到數(shù)據(jù)庫或者 EJB Home接口的連接 ,以便它們可以在不同的請求之間進(jìn)行共享。 Servlet的另一個好處是,它是多線程的, servlet開發(fā)人員必須特別注意確保它們的 servlet是線程安全的。 JavaServer Pages: 雖然 servlets 對 CGI 程序來說前進(jìn)了一大步,但它也不是萬能靈藥。比如這樣的代碼: (POne line of HTML./P)。 在產(chǎn)生 HTTP響應(yīng)的 Servlet 中是很普遍的。隨著應(yīng)用越來越復(fù)雜, Java開發(fā)人員將不再扮演 HTML頁面設(shè)計的角色。 它們喜歡 HTML設(shè)計人員處理表現(xiàn)層的工作,而 Java 工程師則專注于業(yè)務(wù)邏輯。 為解決這個問題, Sun 提出了一個將腳本和模板技術(shù)結(jié)合到一個組件中的服務(wù)器頁面技術(shù)( JavaServer Pages)。為將動態(tài)內(nèi)容引入頁面,開發(fā)人員可以將腳本元素置入頁面之中。你可以在 JSP 頁面中很 容易的識別出腳本元素,他們被封裝在一對 % 和 %標(biāo)記xxx大學(xué)畢業(yè)設(shè)計(論文)外文翻譯 —— 譯文 5 中。當(dāng)一個客戶請求 JSP頁面時,容器將頁面翻譯成 Java servlet 源代碼文件,并將它編譯成 Java 類文件 —— 就象你寫的 servlet文件一樣。如果, JSP 文件自上次編譯以來被修改了,容器將重新翻譯和編譯 JSP文件。重要的是記住, JSP頁面事實上是 一個 servlet。 JavaBean: JavaBean 是一種 Java 類,它遵從一定的設(shè)計模式,使它們易于和其他開發(fā)工具和組件一起使用。要編寫 JavaBean,類必須是具體類和公共類,并且具有無參數(shù)的構(gòu)造器( NONARGS CONSTRUCTOR)。眾所周知,屬性名稱也符合這種模式,其他 JAVA 類可以通過自省機(jī) 制發(fā)現(xiàn)和操作這些 JavaBean 屬性。這些方法獲得一個 JspWriter 對象,你可以用它來輸出你需要的 HTML內(nèi)容。 3.在你的 Web 應(yīng)用描述符 ()中定義你的 taglib 元素。 4.這個語句導(dǎo)入將在本頁中使用的標(biāo)簽庫,并分配給它一個前綴。 JavaBean 設(shè)計模式提供兩種類型的方式來訪問 bean 的內(nèi)部狀態(tài):訪問器( accessor) 用來讀 JavaBean的狀態(tài),修改器( mutator )用來改變 JavaBean 的狀態(tài)。屬性名的第一個字母必須大寫。簡單屬性的 mutator 在其方法體中可能只有一個參數(shù),該參數(shù)可以是各種類型。例如,對 Double 類型的屬性 weight 的 mutator方法體可能是: public void setWeight(Double weight) 相似的設(shè)計模式也用于訪問器方法的創(chuàng)建。 屬性名的第一個字母必須大寫。簡單屬性的 Accessor 在其方法體中不能接受參數(shù)。 屬性 weight 的訪問器方法體可能是: public Double getWeight() 如果訪問器返回一個邏輯值,這種情況下有個變體模式。屬性名的首字母必須大寫。邏輯訪問器在其方法體中不能 接受參數(shù)。其他組件可以使用 Java 的反射 API 通過查找前綴為 set、 is或者 get的方法來發(fā)現(xiàn) JavaBean的屬性。 Sun引入 JavaBean是為了用于 GUI組件,但它們已經(jīng)用在 Java 開發(fā)的各個方面,包括 Web 應(yīng)用。一個頁面的動態(tài)數(shù)據(jù)可以使用一個 JavaBean來傳遞,并且 JSP 標(biāo)記可以隨后使用 bean的屬性來定制頁面的輸出。在其后的規(guī)范中, Model 2 這個叫法消失了,但它已經(jīng)在 Java web開發(fā)人員中非常通用了。 Model 2使 Java工程師和 HTML設(shè)計者分別工作于它 們所擅長和負(fù)責(zé)的部分。 HTML開發(fā)人員可以改變程序的外觀和感覺,并不需要改變后端 servlet 的工作方式。它提供一個控制器 servlet來處理導(dǎo)航流和一些特殊類來幫助數(shù)據(jù)訪問。 小結(jié): 在本文中,我們介紹了 Struts 應(yīng)用框架。 我們也說明了 Model 2應(yīng)用架構(gòu),以及它如何用來將 servlets 和 JSP 在結(jié)合在同一個