国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
Geronimo 叛逆者: 直面 JSF



2007 年 4 月 06 日

在上一期 “Geronimo 叛逆者” 專欄文章中,我想知道 Spring 最重要的功能是什么,當(dāng)我繼續(xù)探究下去時(shí),我開玩笑說現(xiàn)在需要有個(gè)人來告訴我為什么 JavaServer Faces (JSF) 這樣火爆。您不知道,擺在我桌面上的下一件事就是需要 Apache Geronimo 和 Apache MyFaces 之間進(jìn)行交互,主要集中在其 JSF 的實(shí)現(xiàn)。嗯,現(xiàn)在變成一件好事了。我與 IBM? 的 Tim McConnell 進(jìn)行了一次會(huì)談,他目前正在將 Geronimo 與 MyFaces 集成,我了解到了比預(yù)期多得多的關(guān)于實(shí)際上怎樣實(shí)現(xiàn)此類規(guī)范的內(nèi)容。

什么是 Apache MyFaces?

我想了解的第一個(gè)問題是 Apache Geronimo 為什么首先關(guān)注 Apache MyFaces。Tim 解釋說它是從 Java? 2 Platform, Enterprise Edition (J2EE) 1.4 向 Java Platform, Enterprise Edition (Java EE) 5 移植的一部分?!癎eronimo 已經(jīng)是 J2EE 1.4 兼容的應(yīng)用服務(wù)器,但是屬于 1.5 規(guī)范,需要支持 JSF,而我們提供支持的方法是使用 Apache MyFaces”。

我很好奇。在這里,我們認(rèn)為有一項(xiàng)技術(shù)非常重要,實(shí)際上它已添加到了 Java EE 規(guī)范中。但它究竟是什么?Tim 告訴我 “JSF 背后的理念就是使您可以更輕松地進(jìn)行 Web 應(yīng)用程序開發(fā)。它是按照 Model-View-Controller (MVC) 范例建立的模型。它實(shí)際上差不多就是該范例的實(shí)現(xiàn)。那就是其背后的實(shí)際想法。很多沒做過 Web 開發(fā)的人仍十分熟悉 MVC,因此他們可以快速地更高效地獲取并學(xué)習(xí) JSF 以及開發(fā) Web 應(yīng)用程序”。

那聽起來很合理,但事情應(yīng)該不止于此。因此我開始研究 JSF 到底是什么。我發(fā)現(xiàn),為避免使用 JSF 而給自己帶來了相當(dāng)多的麻煩。

如果參與過 Java Web 開發(fā),那么您應(yīng)該已經(jīng)了解 JavaServer Page (JSP)。這些是可以將 Java 代碼直接嵌入到 HTML 中并且相應(yīng)地執(zhí)行的頁面。但是更重要的是,JSP 使您可以創(chuàng)建表示 Java 代碼的自定義標(biāo)記。從服務(wù)器性能角度來看,這不但更高效,而且具有更高的可維護(hù)性,還使非技術(shù)人員能夠編輯頁面。

JSF 將此過程進(jìn)一步加以推廣。它涉及了人們?cè)?Web 編程中常用的元素 —— 主要是表單,還包括預(yù)制的組件(那些我曾談及的自定義標(biāo)記)來幫助您完成任務(wù)。(MyFaces 還包括成百上千個(gè)附加組件可以用于添加功能)。例如,考慮清單 1 中所示的 JSF 表單。


清單 1. JSP
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>                                    <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>                                    <html>                                    <head>                                    <title>JSF Sample Page</title>                                    </head>                                    <body>                                    <f:view>                                    <h1>                                    <h:outputText value="Login"/>                                    </h1>                                    <h:form id="loginForm">                                    <h:outputText value="Username: "/>                                    <h:inputText value="#{userBean.username}" />                                    <br />                                    <h:outputText value="Password: "/>                                    <h:inputText value="#{userBean.password}" />                                    <h:commandButton action="login" value="Log In" />                                    <h:commandButton action="register" value="Register a new account" />                                    </h:form>                                    </f:view>                                    </body>                                    </html>                                    

注意,它混合了標(biāo)準(zhǔn) HTML 和來自兩個(gè)標(biāo)記庫的標(biāo)記,每個(gè)標(biāo)記庫指定為作為前綴別名的 URI(代表名稱空間)。這些標(biāo)記包含特定的行為,在這種情況下行為是指輸出特定的 HTML。但是請(qǐng)注意,inputText 元素中略有不同。在這里它將引用特定的 Java bean,有可能就如清單 2 中所示的類。


清單 2. Java bean
package com.backstop.renegade;                                    public class UserBean {                                    String username;                                    String password;                                    public String getUsername() {                                    return this.username;                                    }                                    public void setUsername(String username) {                                    this.username = username;                                    }                                    public String getPassword() {                                    return this.Password;                                    }                                    public void setPassword(String password) {                                    this.password = password;                                    }                                    ...                                    }                                    

這個(gè) bean 表示表單的數(shù)據(jù)結(jié)構(gòu)。要將其綁定在一起,可以使用 faces-config.xml 文件(參見清單 3)。


清單 3. faces-config.xml 文件的開源代碼
<?xml version="1.0"?>                                    <!DOCTYPE faces-config PUBLIC                                    "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"                                    "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">                                    <faces-config>                                    <managed-bean>                                    <managed-bean-name>userBean</managed-bean-name>                                    <managed-bean-class>com.backstop.renegade.UserBean</managed-bean-class>                                    <managed-bean-scope>request</managed-bean-scope>                                    </managed-bean>                                    </faces-config>                                    

有關(guān)如何設(shè)置此文件的更多信息的鏈接,請(qǐng)查看 參考資料,但是現(xiàn)在,注意需要將表單 (userBean) 中使用的對(duì)象名鏈接到類 (com.backstop.renegade.UserBean) 并將范圍(scope)指定為引用單個(gè) Web 請(qǐng)求。

但是 JSF 有一項(xiàng)錦上添花的功能。您仍需要提交表單,但是提交到何處?在傳統(tǒng)的 HTML 頁面中,為每個(gè)按鈕執(zhí)行不同的操作相當(dāng)?shù)穆闊?。JSF 通過使用 faces-config.xml 文件中的導(dǎo)航規(guī)則 使您可以應(yīng)對(duì)這一問題(參見清單 4)。


清單 4. 向 faces-config.xml 中添加導(dǎo)航規(guī)則的開源代碼
<?xml version="1.0"?>                                    <!DOCTYPE faces-config PUBLIC                                    "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"                                    "http://java.sun.com/dtd/web-facesconfig_1_1.dtd">                                    <faces-config>                                    <navigation-rule>                                    <from-view-id>/pages/login.jsp</from-view-id>                                    <navigation-case>                                    <from-outcome>login</from-outcome>                                    <to-view-id>/pages/processlogin.jsp</to-view-id>                                    </navigation-case>                                    <navigation-case>                                    <from-outcome>register</from-outcome>                                    <to-view-id>/pages/registration.jsp</to-view-id>                                    </navigation-case>                                    </navigation-rule>                                    <managed-bean>                                    <managed-bean-name>personBean</managed-bean-name>                                    <managed-bean-class>jsfks.PersonBean</managed-bean-class>                                    <managed-bean-scope>request</managed-bean-scope>                                    </managed-bean>                                    </faces-config>                                    

通過這種方法,可以根據(jù)由按鈕指定的操作所決定的 from-outcome 指定服務(wù)器應(yīng)當(dāng)從登錄頁面轉(zhuǎn)至何處。當(dāng)然,還有其他方法可以觸發(fā)動(dòng)作,但是那不在本文討論的范圍之內(nèi)。

關(guān)鍵是 JSF 極大地簡(jiǎn)化了 Web 開發(fā)。這也是它被列入了 Tim McConnell 的待辦事項(xiàng)清單的原因所在。





回頁首


移至 Java EE(以前稱為 J2EE 1.5)

“J2EE 1.4 規(guī)范中沒有 JSF ,因此這是全新的”,Tim 解釋道,“由于這是開源的,沒有具體的計(jì)劃,但是我們希望到下一年 Apache Geronimo 能夠兼容 [Java EE] 5,那就將包括 JSF 1.2 規(guī)范。我們正在努力用一種比實(shí)現(xiàn) J2EE 1.4 更有效的方法來實(shí)現(xiàn)”。

我始終對(duì) Geronimo 之類的項(xiàng)目的內(nèi)部工作原理很感興趣,因此我問 Tim “這一次有什么不同?”

他回答說:“我認(rèn)為現(xiàn)在 IBM 更多地介入其中,并且不僅是推動(dòng)其兼容性。很多企業(yè)客戶都不會(huì)用它,除非它是兼容的?!?他指出 Java EE 5 中有很多新規(guī)范。“因此還有很多工作要做”。

他先前說過的一些內(nèi)容引起了我的好奇心?!澳f它差不多是一個(gè) Model-View-Controller 模式的實(shí)現(xiàn)。為什么是差不多?”

他解釋道:“它與 MVC 模式有所不同,因?yàn)樗?Web 開發(fā),并且很少有警告和詭辯被添加到規(guī)范中。例如,一個(gè)有趣之處就在于它們有表單或甚至是 Web 屏幕中的表單元素被更改時(shí)觸發(fā)的事件通知,以便實(shí)現(xiàn)程序可以注冊(cè)以偵聽對(duì)該字段執(zhí)行有效更改的事件。因此編程人員可以注冊(cè)以偵聽該字段上的事件,因此他不必查看它是否已被更改,因?yàn)槿绻撟侄我驯桓模敲此麜?huì)收到通知。這樣做實(shí)際上十分明智。對(duì)我來說,找到那些由實(shí)現(xiàn)而不是由編程人員完成的事件的工作量巨大而又十分復(fù)雜;編程人員只需注冊(cè)該更改中的影響。理念就要使開發(fā)更輕松?!?/p>

Tim 接著解釋了在 Geronimo 中實(shí)現(xiàn) JSF 有什么意義?!坝幸恍﹥?nèi)容在服務(wù)器上負(fù)責(zé)規(guī)范,例如必須支持的 API。它們必須都來自服務(wù)器,而不能來自 Web 應(yīng)用程序。例如,在 MyFaces 1.1 中,編程人員(開發(fā) Web 應(yīng)用程序的人員)只需包括 JAR 文件,因此對(duì)于 1.2,我們需要忽略那條規(guī)范而只需確保它來自 [Java EE] 5 堆棧。想法是當(dāng)它與 [Java EE] 5 兼容時(shí),編程人員無需那樣做,因?yàn)樗鼘㈦S Geronimo 提供;它們無需提供 JAR,只需提供應(yīng)用程序本身。有些代碼是我們必須開發(fā)以遵循規(guī)范的;而有些代碼是我們必須開發(fā)以啟用這些使用 1.2 的應(yīng)用程序。此外,規(guī)范為您提供了一種方法來確定應(yīng)用程序是否使用 JSF,然后您必須根據(jù)該特點(diǎn)執(zhí)行操作?!?/p>




回頁首


實(shí)現(xiàn)規(guī)范

所有這一切不禁讓我想到:實(shí)際實(shí)現(xiàn)一些規(guī)范是什么樣?我的意思是,有一定的規(guī)范并遵循規(guī)范確實(shí)很好,但那是怎樣發(fā)生的?就像我妻子制作蛋黃醬的那天。所有一切都不是奇跡般地出現(xiàn),而且一出現(xiàn)就是完成品;必須有人一步步地做出來。(就像將雞蛋和檸檬原汁混合在一起并制作它們,但您得有想法)。

“我馬上就要開始實(shí)現(xiàn) JSR 88 規(guī)范,該規(guī)范是部署規(guī)范”,Tim 告訴我,“這個(gè)規(guī)范很不錯(cuò),因?yàn)樗?jīng)過非常精心編寫并且易于理解。不是說 JSF 難以理解,而是該規(guī)范更多地關(guān)注所公開的 API 應(yīng)有的外觀。就像所有其他規(guī)范一樣。有些規(guī)范總會(huì)比其他規(guī)范更好?!?/p>

我問 Tim 是否可以提供更詳細(xì)一些的信息,并且他還指出軟件包定義和描述,我開始意識(shí)到這些規(guī)范與我們開發(fā)人員每天處理的規(guī)范沒有什么不同。定義 JSF 1.2 的 JSR-252 規(guī)范定義了包括的軟件包并為必須支持的軟件包提供了 XML 模式。規(guī)范的文本中定義了每個(gè)組件必須執(zhí)行的操作。

因此除了本質(zhì)上確鑿的內(nèi)容之外,實(shí)現(xiàn) JSR 規(guī)范就像實(shí)現(xiàn)任何其他規(guī)范一樣,因?yàn)楦哪切﹥?nèi)容需要修改整個(gè) Java Community Process,因此這樣做肯定比跟老板商談然后費(fèi)力地去做要更加復(fù)雜。





回頁首


開源開發(fā)與非開源開發(fā)的對(duì)比

Tim 把使用 Apache Geronimo 稱為他 “夢(mèng)想中的工作”,因此我問他使用開放源碼到底有什么特別之處。

“開碼開發(fā)的特別之處就在于您的貢獻(xiàn)實(shí)際上就是開發(fā)的代碼。如果不證明您對(duì) Java 編碼或通用編碼的精通程度,不貢獻(xiàn)代碼,則不能成為對(duì) Geronimo 或者我知道的任何其他開放源碼有貢獻(xiàn)的人。因此在某種意義上,實(shí)際上是 ‘代碼決定一切’。對(duì)于我來說,這有好有壞,但這正是開放源碼的發(fā)展之路”。

Tim 在嚴(yán)格意義上是 IBM 的軟件工程師 —— 與獨(dú)立使用 Geronimo 相反 —— 因此我問他開源開發(fā)與商業(yè)開發(fā)之間有何區(qū)別?!霸陂_放源碼 [開發(fā)] 中”,他告訴我,“您貢獻(xiàn)代碼后,社區(qū)將審查這段代碼,隨后所有人都有機(jī)會(huì)查看、審查這段代碼并為您提供反饋。整個(gè)過程就是這樣。在 IBM 進(jìn)行產(chǎn)品開發(fā)要嚴(yán)格得多,有需要遵循的開發(fā)方法,然后還有明晰的階段:分析、計(jì)劃、設(shè)計(jì)、實(shí)施、單元測(cè)試、功能和系統(tǒng)測(cè)試。

“在開放源碼 [開發(fā)] 中您同樣要遵循此過程”,他繼續(xù)說道,“但是此過程簡(jiǎn)練得多。沒有真正明晰的階段。在 Geronimo 中,一切都靠社區(qū)來推動(dòng),但在商業(yè)開發(fā)中,您的工作通常都根據(jù)與產(chǎn)品架構(gòu)對(duì)應(yīng)的指導(dǎo)信息來執(zhí)行。在開放源碼中,只要代碼實(shí)現(xiàn)一點(diǎn)社區(qū)就會(huì)同意通過這段代碼,讓我們來說,這一點(diǎn)就是兼容 [Java EE] 5。開放源碼的巧妙之處就在于任何人都可以使用所需的內(nèi)容。同樣地,您說 “我將使用 JSF,而且我將遵循 JSR 88 部署規(guī)范”。因此發(fā)布代碼,并獲得來自社區(qū)的反饋。他們說代碼沒問題,而您說,“這是我計(jì)劃編寫代碼的方法”,然后社區(qū)將審查,然后或者同意或者不做任何事情(一種暗示同意)。還有更大的自由度,因?yàn)槟梢詫?duì)任何內(nèi)容進(jìn)行操作,只要表現(xiàn)出能夠?qū)ζ溥M(jìn)行操作的能力并且成為貢獻(xiàn)者。因此作為一名開發(fā)人員,很明顯您要執(zhí)行單元測(cè)試,而審查過程是提交代碼的一部分,因?yàn)樘峤缓?,每個(gè)人都可以查看您提交的內(nèi)容,然后審查并對(duì)其進(jìn)行注釋。因此沒有清楚的時(shí)間表,兩個(gè)星期后我們將處于此階段。尤其是對(duì)于 IBM 產(chǎn)品開發(fā),它是一種十分嚴(yán)格的方法,該方法十分優(yōu)秀,因?yàn)樵谖业捏w會(huì)中您得到了質(zhì)量非常優(yōu)秀的軟件。開源軟件的質(zhì)量也十分出色,它只是一種不同的方法?!?/p>

但是 Tim 認(rèn)為開源開發(fā)與商業(yè)開發(fā)還有一點(diǎn)不同之處:“開放源碼還可以帶來更多樂趣,真的”。

結(jié)束語

Tim 的話使我深思。首先,我的工具庫中有了一個(gè)新工具:一般情況下用 JSF,特殊情況下用 Apache MyFaces。JSP 我已使用多年;這看似是一種簡(jiǎn)化應(yīng)用程序開發(fā)的最佳方法。就是導(dǎo)航規(guī)則可以簡(jiǎn)化開發(fā),因此當(dāng)您能添加本文中未能談及的所有其他功能時(shí),那么您就是一名真正的贏家!

Tim 還為我提供了一些關(guān)于貢獻(xiàn)開源項(xiàng)目實(shí)戰(zhàn)的見解,揭示了實(shí)現(xiàn)規(guī)范及與社區(qū)協(xié)作的過程。


本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
JBoss、Geronimo及Tomcat比較分析-華軍資訊
使用 JavaServer Faces 構(gòu)建 Apache Geronimo 應(yīng)用程序,第 1 部分: 使用 Eclipse 和 Apache MyFaces Core 構(gòu)建基本的應(yīng)用程序
快速建立JSF環(huán)境
在 WAS CE v2.1 上開發(fā) Java EE 應(yīng)用
spring – JSF2管理bean注釋范圍注入混亂
APACHE 項(xiàng)目
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服