【正文】
hread for each request. Java threads 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: 畢業(yè)設(shè)計(jì)(論文) 外文 翻譯 —— 原文 7 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)用的相似性比不同點(diǎn)要多。開(kāi)發(fā)傳統(tǒng)桌面應(yīng)用的開(kāi)發(fā)人員更習(xí)慣于那些可以涵蓋應(yīng)用開(kāi)發(fā)同一性的工具包和開(kāi)發(fā)環(huán)境。 框架向開(kāi)發(fā)人員提供一系列具有以下特征的骨架組件: 1.已經(jīng)知道它們?cè)谄渌绦蛏瞎ぷ鞯?很好; 2.它們隨時(shí)可以在下一個(gè)項(xiàng)目中使用; 3.它們可以被組織的其它團(tuán)隊(duì)使用; 對(duì)于框架是典型的構(gòu)建還是購(gòu)買(mǎi)命題。 其它類(lèi)型的框架: 框架的概念不僅用于應(yīng)用程序也可用于組件。這些包括 Lucene 搜索引擎, Scaffold工具包,Struts 驗(yàn)證器,以及 Tiles 標(biāo)簽庫(kù)。某些框架被限制于專(zhuān)門(mén)的開(kāi)發(fā)環(huán)境中。你可以在很多環(huán)境中來(lái)開(kāi)發(fā) Struts: Visual Age for Java, JBuilder, Eclipse, Emacs, 甚至使用 Textpad。 使 用的技術(shù): 使用 Struts 的應(yīng)用開(kāi)發(fā)使用了大量的其他基礎(chǔ)技術(shù)。開(kāi)發(fā)者使用 Struts 之類(lèi)的框架是為了隱藏在諸如 HTTP, CGI,以及 JSP之類(lèi)技術(shù)后面的繁瑣的細(xì)節(jié)。 超文本傳輸協(xié)議 (HTTP): 當(dāng)兩個(gè)國(guó)家之間進(jìn)行調(diào)解時(shí),外交官們總是遵循一定的正式協(xié)議。 同樣,當(dāng)計(jì)算機(jī)間需要對(duì)話(huà),它們也遵循一個(gè)正式的協(xié)議。Web應(yīng)用程序就是使用 HTTP協(xié)議在運(yùn)行瀏覽器的計(jì)算機(jī)和運(yùn)行的服務(wù)器的程序間傳輸數(shù)據(jù)。他們?cè)谟?jì)算機(jī)之間維護(hù)一個(gè)持久性的連接。因?yàn)樗鼈冎烂恳粋€(gè)連接的狀態(tài),以及每一個(gè)使用它的人。 相反, HTTP是一個(gè)無(wú)狀態(tài)協(xié)議。沒(méi)有大量的協(xié)商和連接持久性,無(wú)狀態(tài)協(xié)議可以處理大量的請(qǐng)求。 HTTP 成為通用標(biāo)準(zhǔn)的原因是其簡(jiǎn)單性。這使應(yīng)用程序很容易創(chuàng)建 HTTP請(qǐng)求。當(dāng) HTTP響應(yīng)返回時(shí),它也是一個(gè)開(kāi)發(fā)者可以直接閱讀的平面文本。 HTTP 請(qǐng)求頭跟在首行后面,可以沒(méi)有也可以有多個(gè)??梢园g覽器的種類(lèi)和版本,可接受的文檔類(lèi)型,瀏覽器的 cookies等等。 一旦服務(wù)器接收到請(qǐng)求,它就要產(chǎn)生一個(gè) HTTP響應(yīng)。狀態(tài)行后,服務(wù)器將返回一個(gè) HTTP 響應(yīng)頭,類(lèi)似于 HTTP 請(qǐng)求頭。服務(wù)器接受請(qǐng)求,發(fā)出響應(yīng),并且繼續(xù)愉快地處理文本請(qǐng)求。 Cookies和 URL 重寫(xiě)是兩個(gè)在請(qǐng)求間跟蹤用戶(hù)狀態(tài)的方式。 URL重寫(xiě)是在頁(yè)面地址中存儲(chǔ)一個(gè)特殊的標(biāo)記, Java服務(wù)器可以用它來(lái)跟蹤用戶(hù)。對(duì)其本身來(lái)說(shuō),標(biāo)準(zhǔn)的 HTTP web服務(wù)器并不傳輸動(dòng)態(tài)內(nèi)容。通常這里的文件使用Hypertext Markup Language (HTML) [W3C,HTML] 格式化,以使瀏覽器可以顯 示它們。用戶(hù)點(diǎn)擊連接將產(chǎn)生另一個(gè)請(qǐng)求,就開(kāi)始一個(gè)新的處理過(guò)程。 定義 靜態(tài)內(nèi)容直接來(lái)自于文本或數(shù)據(jù)文件,比如 HTML 或者 JPEG 文件。相反,動(dòng)態(tài)內(nèi)容是臨時(shí)產(chǎn)生的,典型地,它是針對(duì)瀏覽器的個(gè)別請(qǐng)求的響應(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ù)器接收到一個(gè)對(duì) CGI程序的請(qǐng)求時(shí),它便運(yùn)行這個(gè)程序并向其提供它請(qǐng)求里面所包含的信息。 CGI定義了一套關(guān)于什么信息將作為環(huán)境變量傳遞,以及它希望怎樣使用標(biāo)準(zhǔn)輸入和輸出 的慣例。 CGI的主要缺點(diǎn)是它必須為每個(gè)請(qǐng)求運(yùn)行一個(gè)程序。 CGI程序的另一個(gè)缺點(diǎn)是平臺(tái)依賴(lài)性,一個(gè)平臺(tái)上開(kāi)發(fā)的程序不一定在另一個(gè)平臺(tái)上能運(yùn)行。其次,一次編寫(xiě),隨處運(yùn)行的 JAVA特性 意味著 servlet在有 JVM 的操作系統(tǒng)間是輕便的可移動(dòng)的。它接受請(qǐng)求并產(chǎn)生響應(yīng)。 大連海事 大學(xué)畢業(yè)設(shè)計(jì)(論文)外文翻譯 —— 譯文 14 Servlet 本身是要編譯成字節(jié)碼的 Java類(lèi),就像其他 Java對(duì)象一樣。為了使常規(guī) web servers 能訪(fǎng)問(wèn) servlet, servlet被安插在一個(gè)容器之中。每 servlet 都可以聲明它可以處理何種樣式的 URL。但和 CGI 程序不同,并不是針對(duì)每個(gè)請(qǐng)求都要?jiǎng)?chuàng)建一個(gè)新的 servlet。 Java線(xiàn)程可比使用 CGI程序的服務(wù)器處理開(kāi)銷(xiāo)小多了。 Servlet開(kāi)發(fā) 人員可以使用 init() 方法保持對(duì)昂貴資源的引用,比如到數(shù)據(jù)庫(kù)或者 EJB Home接口的連接 ,以便它們可以在不同的請(qǐng)求之間進(jìn)行共享。 Servlet的另一個(gè)好處是,它是多線(xiàn)程的, servlet開(kāi)發(fā)人員必須特別注意確保它們的 servlet是線(xiàn)程安全的。 JavaServer Pages: 雖然 servlets 對(duì) CGI 程序來(lái)說(shuō)前進(jìn)了一大步,但它也不是萬(wàn)能靈藥。比如這樣的代碼: (POne line of HTML./P)。 在產(chǎn)生 HTTP響應(yīng)的 Servlet 中是很普遍的。隨著應(yīng)用越來(lái)越復(fù)雜, Java開(kāi)發(fā)人員將不再扮演 HTML頁(yè)面設(shè)計(jì)的角色。 它們喜歡 HTML設(shè)計(jì)人員處理表現(xiàn)層的工作,而 Java 工程師則專(zhuān)注于業(yè)務(wù)邏輯。 為解決這個(gè)問(wèn)題, Sun 提出了一個(gè)將腳本和模板技術(shù)結(jié)合到一個(gè)組件中的服務(wù)器頁(yè)面技術(shù)( JavaServer Pages)。為將動(dòng)態(tài)內(nèi)容引入頁(yè)面,開(kāi)發(fā)人員可以將腳本元素置入頁(yè)面之中。你可以在 JSP 頁(yè)面中很 容易的識(shí)別出腳本元素,他們被封裝在一對(duì) % 和 %標(biāo)記大連海事 大學(xué)畢業(yè)設(shè)計(jì)(論文)外文翻譯 —— 譯文 15 中。當(dāng)一個(gè)客戶(hù)請(qǐng)求 JSP頁(yè)面時(shí),容器將頁(yè)面翻譯成 Java servlet 源代碼文件,并將它編譯成 Java 類(lèi)文件 —— 就象你寫(xiě)的 servlet文件一樣。如果, JSP 文件自上次編譯以來(lái)被修改了,容器將重新翻譯和編譯 JSP文件。重要的是記住, JSP頁(yè)面事實(shí)上是 一個(gè) servlet。 JavaBean: JavaBean 是一種 Java 類(lèi),它遵從一定的設(shè)計(jì)模式,使它們易于和其他開(kāi)發(fā)工具和組件一起使用。要編寫(xiě) JavaBean,類(lèi)必須是具體類(lèi)和公共類(lèi),并且具有無(wú)參數(shù)的構(gòu)造器( NONARGS CONSTRUCTOR)。眾所周知,屬性名稱(chēng)也符合這種模式,其他 JAVA 類(lèi)可以通過(guò)自省機(jī) 制發(fā)現(xiàn)和操作這些 JavaBean 屬性。這些方法獲得一個(gè) JspWriter 對(duì)象,你可以用它來(lái)輸出你需要的 HTML內(nèi)容。 3.在你的 Web 應(yīng)用描述符 ()中定義你的 taglib 元素。 4.這個(gè)語(yǔ)句導(dǎo)入將在本頁(yè)中使用的標(biāo)簽庫(kù),并分配給它一個(gè)前綴。 JavaBean 設(shè)計(jì)模式提供兩種類(lèi)型的方式來(lái)訪(fǎng)問(wèn) bean 的內(nèi)部狀態(tài):訪(fǎng)問(wèn)器( accessor) 用來(lái)讀 JavaBean的狀態(tài),修改器( mutator )用來(lái)改變 JavaBean 的狀態(tài)。屬性名的第一個(gè)字母必須大寫(xiě)。簡(jiǎn)單屬性的 mutator 在其方法體中可能只有一個(gè)參數(shù),該參數(shù)可以是各種類(lèi)型。例如,對(duì) Double 類(lèi)型的屬性 weight 的 mutator方法體可能是: public void setWeight(Double weight) 相似的設(shè)計(jì)模式也用于訪(fǎng)問(wèn)器方法的創(chuàng)建。 屬性名的第一個(gè)字母必須大寫(xiě)。簡(jiǎn)單屬性的 Accessor 在其方法體中不能接受參數(shù)。 屬性 weight 的訪(fǎng)問(wèn)器方法體可能是: public Double getWeight() 如果訪(fǎng)問(wèn)器返回一個(gè)邏輯值,這種情況下有個(gè)變體模式。屬性名的首字母必須大寫(xiě)。邏輯訪(fǎng)問(wèn)器在其方法體中不能 接受參數(shù)。其他組件可以使用 Java 的反射 API 通過(guò)查找前綴為 set、 is或者 get的方法來(lái)發(fā)現(xiàn) JavaBean的屬性。 Sun引入 JavaBean是為了用于 GUI組件,但它們已經(jīng)用在 Java 開(kāi)發(fā)的各個(gè)方面,包括 Web 應(yīng)用。一個(gè)頁(yè)面的動(dòng)態(tài)數(shù)據(jù)可以使用一個(gè) JavaBean來(lái)傳遞,并且 JSP 標(biāo)記可以隨后使用 bean的屬性來(lái)定制頁(yè)面的輸出。在其后的規(guī)范中, Model 2 這個(gè)叫法消失了,但它已經(jīng)在 Java web開(kāi)發(fā)人員中非常通用了。 Model 2使 Java工程師和 HTML設(shè)計(jì)者分別工作于它 們所擅長(zhǎng)和負(fù)責(zé)的部分。 HTML開(kāi)發(fā)人員可以改變程序的外觀(guān)和感覺(jué),并不需要改變后端 servlet 的工作方式。它提供一個(gè)控制器 servlet來(lái)處理導(dǎo)航流和一些特殊類(lèi)來(lái)幫助數(shù)據(jù)訪(fǎng)問(wèn)。 小結(jié): 在本文中,我們介紹了 Struts 應(yīng)用框架。 我們也說(shuō)明了 Model 2應(yīng)用架構(gòu),以及它如何用來(lái)將 servlets 和 JSP 在結(jié)合在同一個(gè)應(yīng)用之中。