【正文】
現(xiàn)在你已經(jīng)有關(guān)于 Strtus Web應(yīng)用程序模樣的初步印象,以后我們將更深入的討論 Strtuts 框架的理論和具體實(shí)踐 。并介紹了一些基本知識(shí),關(guān)于 HTTP, CGI, Java servlet, JSP,以及 JavaBean。隨框架也提供一個(gè)豐富的標(biāo)簽庫(kù),以使 Struts 易于和 JSP一起使用。 Struts 框架是基于 Model 2的架大連海事 大學(xué)畢業(yè)設(shè)計(jì)(論文)外文翻譯 —— 譯文 17 構(gòu)。 Model 2應(yīng)用的一部分發(fā)生改變并不強(qiáng)求其他部分也跟著發(fā)生改變。根據(jù) Model 2, servlet處理數(shù)據(jù)存取和導(dǎo)航流, JSP處理表現(xiàn)。 Model 2: Servlet/JSP 規(guī)范的 版描述了在一個(gè)應(yīng)用中使用 servlet 和 JSP 的架構(gòu)。 Sun 的工程師在開發(fā) JSP標(biāo)簽的擴(kuò)展類時(shí),也被設(shè)計(jì)來(lái)可以和 JavaBean一起工作。如果一個(gè)組件在一個(gè) JavaBean 中發(fā)現(xiàn)一個(gè)這樣的方法,它就知道這個(gè)方法可以用來(lái)訪問(wèn)或者改變 JavaBean 的屬性。 On屬性的邏輯訪問(wèn)器的方法體可能是: public boolean isOn() 在使用 JavaBean 時(shí),規(guī)范的方法體簽名扮演了極為重要的角色。返回值肯定是邏輯值,不管是 boolean 還是 Boolean。不使用小寫的 get,邏輯屬性的訪問(wèn)器可以使用小寫的 is 前綴,后跟屬性名。同樣,訪問(wèn)器 accessor 也經(jīng)常稱為獲取器 getter。返回值必須匹配相應(yīng)的修改器方法的參數(shù)。 Accessor 通常以小寫的 get 為前綴,后跟屬性名。 Mutator也可根據(jù)其前綴稱為設(shè)置器 setters 。返回值通常是 void,因?yàn)?mutator 僅僅改變屬性的值,而不返回它們。 大連海事 大學(xué)畢業(yè)設(shè)計(jì)(論文)外文翻譯 —— 譯文 16 Mutator 通常以小寫的 set 前綴開始,后跟屬性名。關(guān)于更多細(xì)節(jié),請(qǐng)參考 JSP標(biāo)簽庫(kù)技術(shù)頁(yè)面。通過(guò)在 JSP 頁(yè)面的頂部放置下面的語(yǔ)句: %tagliburi=/tags/ prefix=app %來(lái)告訴 JSP 頁(yè)面你將使用你自己的標(biāo)簽庫(kù)。 2.創(chuàng)建一個(gè)標(biāo)簽庫(kù)描述文件 (TLD)來(lái)將你的新建的類,映射到一個(gè)標(biāo)簽名稱。 我們必須做的如下: 1 . 編 寫 一 個(gè) 類, 通 過(guò) 實(shí) 現(xiàn) doStart() 或者 doEnd() 方法來(lái)實(shí)現(xiàn) 或者 。JavaBean通過(guò)提供符合一致性設(shè)計(jì)模式的公共訪問(wèn)方法將內(nèi)部字段暴露稱為屬性。 定義 JavaBean 是一種 JAVA 語(yǔ)言寫成的可重用組件。你可以在 servlet做的,也可以在 JSP中做。項(xiàng)目經(jīng)理現(xiàn)在可以將表現(xiàn)層分派給 HTML 開發(fā)人員,將業(yè)務(wù)邏輯工作分派給 JAVA開發(fā)人員。在運(yùn)行時(shí),容器也能檢測(cè) JSP文件和相應(yīng)的類的最后更新時(shí)間。 為了識(shí)別 JSP頁(yè)面,文件需要保存為擴(kuò)展名 .jsp。腳本元素是一些標(biāo)記,封裝了可以被 JSP識(shí)別的邏輯。為創(chuàng)建 JSP頁(yè)面 , 開發(fā)者按創(chuàng)建 HTML頁(yè)面類似的方式創(chuàng)建頁(yè)面,使用相同的 HTML 語(yǔ)法。單獨(dú)使用 servlet 的做法鼓勵(lì)混合標(biāo)記和業(yè)務(wù)邏輯,很難區(qū)分團(tuán)隊(duì)人員的專業(yè)工作。同時(shí),大多數(shù)項(xiàng)目經(jīng)理更喜歡將團(tuán)隊(duì)分 成不同的小組。也有一些庫(kù)有助于你產(chǎn)生 HTML。 (PAnother line of HTML./P)。為了產(chǎn)生響應(yīng),開發(fā)人員不得不使用大量的 println語(yǔ)句來(lái)生成 HTML。學(xué)習(xí) servlet 編程,我們推薦 Java Servlets by Example, 作者 Alan R. Williamson[Williamson]。獲得這些資源要耗費(fèi)數(shù)秒時(shí)間,這比大多數(shù)沖浪者愿意等的時(shí)間要長(zhǎng)些。 一旦 servlet 被創(chuàng)建,使用它處理額外的請(qǐng)求僅帶來(lái)很小的額外開銷。一旦容器實(shí)例化了一個(gè) servlet,它就僅為每個(gè)新的請(qǐng)求創(chuàng)建一個(gè)新的線程。當(dāng)符合所注冊(cè)樣式的請(qǐng)求到達(dá), web server 將請(qǐng)求傳遞給容器,容器則調(diào)用響應(yīng)的 servlet。 Servlet容器連接到 Web 服務(wù)器。 Servlet訪問(wèn) HTTP 特定服務(wù)的 API,但它仍然是一個(gè)運(yùn)行于程序之中的 Java 對(duì)象,并可以利用所有的 Java 資產(chǎn)。但,和常規(guī)web server 不同, servlet API 是專門設(shè)計(jì)來(lái)幫助 Java 開發(fā)人員創(chuàng)建動(dòng)態(tài)應(yīng)用的。Servlet看起來(lái)好像是一個(gè)微小的 web server。 Java servlet: Sun公司的 Java Servlet平臺(tái)直接解決了 CGI程序的兩個(gè)主要缺點(diǎn): 首先, servlet 比常規(guī) CGI 程序提供更好的性能和資源利用。這是一個(gè)相對(duì)昂貴的處理方法,對(duì)大容量站點(diǎn)來(lái)說(shuō),每分鐘有數(shù)千個(gè)請(qǐng)求,有可能使站點(diǎn)癱瘓。與 HTTP一樣, CGI是靈活和易于實(shí)現(xiàn)的,并且已經(jīng)有大量現(xiàn)成的 CGI程序。 CGI程序運(yùn)行,并將輸出返回給 Web server, web server 則將輸出響應(yīng)給瀏覽器。其他程序可以看到 web server傳遞過(guò)來(lái)的請(qǐng)求,并創(chuàng)建一個(gè)定制的響應(yīng)。 公共網(wǎng)關(guān)接口 (CGI): 第一個(gè)普遍用來(lái)產(chǎn)生動(dòng)態(tài)內(nèi)容的標(biāo)準(zhǔn)是通用網(wǎng)關(guān)接口( Common Gateway Interface (CGI))。這些文件可以隨時(shí)改變,但通過(guò)瀏覽器請(qǐng)求時(shí),卻不能自動(dòng)改變。標(biāo)準(zhǔn) web服務(wù)器處理靜態(tài)內(nèi)容處理得很好,但處理動(dòng)態(tài)內(nèi)容時(shí)則需要額外的幫助手段了。 HTML頁(yè)面通常包含一些到其他頁(yè)面的超文本連接,也可以顯示其他一些內(nèi)容比如圖像和視頻等等。它主要是使用請(qǐng)求來(lái)定位文件資源,并在響應(yīng)中返回此資源。這兩種方法都不是無(wú)縫的,是用哪一個(gè)都意味著在開發(fā)時(shí)都要進(jìn)行額外的工作。 cookie是一種特殊的信息包,大連海事 大學(xué)畢業(yè)設(shè)計(jì)(論文)外文翻譯 —— 譯文 13 存儲(chǔ)于用戶的計(jì)算機(jī)中。 因?yàn)楹?jiǎn)單和效率,無(wú)狀態(tài)協(xié)議不適合于需要跟蹤用戶狀態(tài)的動(dòng)態(tài)應(yīng)用 。如上所述, HTTP 并不在請(qǐng)求間保持狀態(tài)信息。響應(yīng)的第一行稱為狀態(tài)行,包含了 HTTP協(xié)議的版本,數(shù)字型狀態(tài),以及狀態(tài)的簡(jiǎn)短描述。 7 種請(qǐng)求方法中, GET和 POST是用得最多的。 HTTP 頭向服務(wù)器提供額外的信息。 HTTP 請(qǐng)求的第一行包含方法,其后是請(qǐng)求的來(lái)源地址和 HTTP 版本。你甚至可以通過(guò)標(biāo)準(zhǔn)的程序如 Tel來(lái)手動(dòng)傳遞一個(gè) HTTP請(qǐng)求。 HTTP 請(qǐng)求看起來(lái)就像一個(gè)平常的文本文檔。這也是 Inter 可以擴(kuò)展到很多計(jì)算機(jī)的原因。 HTTP Server 可以接受來(lái)自于各種客戶的各種請(qǐng)求,并提供各種響 應(yīng),即使是這個(gè)響應(yīng)僅僅是說(shuō) No。這稱之為狀態(tài)協(xié)議。應(yīng)用服務(wù)器可以清楚的知道是誰(shuí)連接上來(lái),而且何時(shí)中斷連接。 很多服務(wù)器應(yīng)用程序使用 HTTP之外的其他協(xié)議。這個(gè)協(xié)議定義數(shù)據(jù)是如何傳輸,以及它們到達(dá)后如何進(jìn)行解碼。外交協(xié)議主要設(shè)計(jì)來(lái)避免誤解,以及防止談判破裂。作為一個(gè) Struts開發(fā)者,你并不需要知曉所有的相關(guān)知識(shí),但是這些基本技術(shù)的工作原理可能有助于你針對(duì)棘手問(wèn)題設(shè)計(jì)出創(chuàng)造性的方案。這些技術(shù)并不是專門針對(duì)大連海事 大學(xué)畢業(yè)設(shè)計(jì)(論文)外文翻譯 —— 譯文 12 Struts,而是所有 Java web 應(yīng)用都可以使用的。對(duì)于你的工具,如果你可以用來(lái)開發(fā) Java, 你就可以用它來(lái)開發(fā) Struts。 Struts以及本文中涉及的組件卻不是這樣。與應(yīng)用框架一樣,這些工具也提供了一些半完成的版本,可以用在用戶的定制組件之中。在其它的資料里面,我們也介紹了一些可以和 Struts 一起使用的框架。如果你自己構(gòu)建它,在你完成時(shí)你就會(huì)理解它,但是在你被融入之前又將花費(fèi)多長(zhǎng)時(shí)間呢?如果要購(gòu)買,你必須得克服學(xué)習(xí)曲線,同樣,在你可以用它進(jìn)行工作之前又得花多長(zhǎng)時(shí)間?這里沒(méi)有所謂正確答案,但許多觀察者都會(huì)同意,象 Struts 這樣的框架能提供比從頭開始開發(fā)更顯著的投資回報(bào),特別是對(duì)于大型項(xiàng)目來(lái)說(shuō)。構(gòu)架在這些公共基礎(chǔ)上的應(yīng)用框架可以為開發(fā)人員提供可以為他們的產(chǎn)品提供可重用服務(wù)的基礎(chǔ)架構(gòu)。它們運(yùn)行在相似的機(jī)器上,期望從相同的設(shè)備輸入信息,輸出到相同的顯示設(shè)備,并且將數(shù)據(jù)存儲(chǔ)到相同的硬盤設(shè)備。 they do not retrieve them. The mutator for a simple property takes only one parameter in its signature, which can be of any type. Mutators are often nicknamed setters after their prefix. The mutator method signature for a weight property of the type Double would be: public void setWeight(Double weight) A similar design pattern is used to create the accessor method signature. Accessor methods are always prefixed with the lowercase token get, followed by the property name. The first character in the property name must be uppercase. The return value will match the method parameter in the corresponding mutator. Accessors for simple properties cannot accept parameters in their method signature. Not surprisingly, accessors are often called getters. The accessor method signature for our weight property is: public Double getWeight() If the accessor returns a logical value, there is a variant pattern. Instead of using the lowercase token get, a logical property can use the prefix is, followed by the property name. The first character in the property name must be uppercase. The return value will always 畢業(yè)設(shè)計(jì)(論文) 外文 翻譯 —— 原文 9 be a logical value— either boolean or Boolean. Logical accessors cannot accept parameters in their method signature. The boolean accessor method signature for an on property would be public boolean isOn() The canonical method signatures play an important role when working with Java Beans. Other ponents are able to use the Java Reflection API to discover a JavaBean’s prope