JSP和JSF雙劍合併 打造完美Web應用
Java在最近幾年逐漸升溫,隨著Java SE 5和Java SE 6的推出,Java的未來更顯得無比輝煌。但以Java為基礎的JSP在Java SE 5推出之前卻一直抬不起頭來,這最重要的原因就是JSP雖然功能十分強大,但最大的優點也是它的最大缺點,功能強大就意味著複雜,尤其是設計前端介面的視覺化工具不多,也不夠強大。因此,設計JSP頁面就變得十分複雜和繁瑣。不過,在Java SE 5推出的同時,Sun為了簡化JSP的開發難度,推出了新的JavaServer Faces(簡稱JSF)規範。從而使JSP走上了康莊大道。
一、什麼是JSF
JSF和JSP是一對新的搭檔。JSP是用於後臺的邏輯處理的技術,而JSF恰恰相反,是使開發人員能夠快速的開發基於 Java 的 Web 應用程式的技術,是一種表現層技術。目前,JSF1.2已經正式作為一個標準加入了Java EE 5中。
作為一種高度元件化的技術,開發人員可以在一些開發工具的支援下,實現拖拉式編輯操作,使用者只需要簡單的將 JSF 元件拖到頁面上,就可以很容易的進行 Web 開發了。這是其作為一種元件化的技術所具有的最大好處,我們能用的元件不光是一些比較簡單的輸入框之類,還有更多複雜的元件可以使用的,比如 DataTable 這樣的表格元件, Tree 這樣的樹形元件等等。
作為一種標準的技術,JSF還得到了相當多工具提供商的支援。同時我們也會有很多很好的免費開發工具可以使用,前不久 Sun Java Studio Creator 2 和 Oracle JDeveloper 10g 作為免費的支援 JSF 的開發工具釋出,給 JSF 帶來了不小的生氣。另外我們也有一些很優秀的商業開發工具可共選擇,BEA Workshop (原 M7 NitroX),Exadel,MyEclipse 這樣的基於 Eclipse 的外掛開發工具,為現在廣大的 Eclipse 使用者帶來了不小的便利,IBM 的 Rational Application Developer 和 Borland 的 JBuilder 也是很不錯的支援 JSF 視覺化開發的商業開發工具。
JSF和傳統的Web技術有著本質上的差別,在傳統的Web技術需要使用者自己對瀏覽器請求進行捕捉,儲存客戶端狀態,並且手工控制著頁面的轉向,等等。而JSF的出現,無疑給我們帶來了巨大的便利,JSF 提供了事件驅動的頁面導航模型,該模型使應用程式開發人員能夠設計應用程式的頁面流。與 Struts 的方式向類似的是,所有的頁面流資訊都定義在 JSF 配置 XML 檔案 (faces-config.xml) 中,而非硬編碼在應用程式中。這很大程度簡化了開發人員開發難度,簡化了應用程式的開發。
同時JSF也是一種遵循模型-檢視-控制器 (MVC) 模式的框架。實現了檢視程式碼(View)與應用邏輯(Model)的完全分離,使得使用 JSF 技術的應用程式能夠很好的實現頁面與程式碼的分離。所有對 JSF 頁面的請求都會透過一個前端控制器 (FacesServlet) 處理,系統自動處理使用者的請求,並將結果返回給使用者。這和傳統的 MVC 框架並沒有太大的區別。
在JSF中不僅使用了 POJO 技術,而且還使用了類似 Spring 的控制反轉(IoC) (或稱為依賴注入-DI) 技術,在 JSF 的 Backing Bean 中,我們可以把檢視所需要的資料和操作放進一個 Backing Bean 中。同時得益於 JSF 使用的 DI 技術,我們可以在配置檔案中初始化 Managed Bean,同時我們也可以透過這樣的技術很方便的和使用類似技術的 Spring 進行整合。
二、如何在JSP中使用JSF
JSF只有透過和JSP相結合,才能充分發揮它的功效。JSF是透過標籤庫和JSP進行整合的。標籤庫就相當於ASP.NET的服務端元件。JSF提供了非常豐富的標籤庫,透過這些標籤庫,可以生成各種客戶端模型,如HTML、WML、XML以及JavaScript等。透過這些標籤,你可以很容易建立大規模的客戶端模型,並由這些標籤自動處理客戶端請求。
接下來讓我們來看一個如何使JSF和JSP在一起工作的例子。在JSF中有兩個庫。第一個叫做核心庫,在這個庫中包含了各種主要的標籤,如配置元件、管理事件、驗證輸入資訊等。第二個庫的主要功能是將HTML和JSF的各種標籤相對應。每一個JSF標籤都會對應一個HTML元件。如UIInput標籤對應了HTML中的文字框或密碼框。
在JSF標籤中文字輸入框叫做inputText,而密碼輸入庫叫inputSecret。下面是一個簡單的JSF和JSP結合的使用者介面程式。
<%@ taglib uri=" prefix="h" %> <%@ taglib uri=" prefix="f" %> <html> <head> <meta HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=GB2312"> <title>第一個JSF程式</title> </head> <body> <f:view> <h:form id="simpleForm"> <h:outputText id="favoriteLabel" value="請輸入一個數字:"/> <h:inputText id="favoriteValue" value="#{simple.longValue}"> <f:validateLongrange maximum="30" minimum="0"/> </h:inputText> <p/> <h:commandButton id="submit" value="提交" action="#{simple.simpleActionMethod}"/> </h:form> </f:view> </body> </html> |
在上面的程式碼中,我們可以瞭解到JSF是如何同JSP整合的。我們首先可以看到一個核心標籤:view。然後是幾個JSF元件。如form、outputText、inputText以及commandButton。這幾個元件被放到form中從而開成了form中的一部分。在程式的最開始,必須使用import匯入兩個標籤庫。程式碼如下。
<%@ taglib uri=" prefix="h" %> <%@ taglib uri=" prefix="f" %> |
上面2行程式碼宣告瞭JSP中要使用哪一個JSF標籤庫。核心庫使用字首(prefix)f宣告,而HTML庫使用字首(prefix)h宣告。這兩個字首並不是必須要使用,而只是一個建議。在程式中,核心庫必須要使用,因為view在所有的JSF頁中必須使用。而HTML標籤在執行時將JSF標籤轉化為HTML元件,這個h字首並不是必須的,而是JSF規範推薦使用的,這樣,我們使我們的JSF程式更易讀。
在宣告後是幾行標準的HTML語句,本文不再詳述。從<f:view>開始,是一段JSF語句。這段程式碼如下所示:
<f:view> <h:form id="simpleForm"> <h:outputText id="favoriteLabel" value="請輸入一個數字:"/> <h:inputText id="favoriteValue" value="#{simple.longValue}"> <f:validateLongrange maximum="30" minimum="0"/> </h:inputText> <p/> <h:commandButton id="submit" value="提交" action="#{simple.simpleActionMethod}"/> </h:form> </f:view> |
</f:view>標籤預示著JSF的開始,而它的下一個標籤form將建立一個HTML Form。而outputText標籤相當於HTML中的label元件。inputText標籤相當於HTML中的textField元件。而commandButton標籤相當於HTML中的submit按鈕。
三、JSP如何響應JSF的請求
從上面的例子我們已經知道如何在JSP中使用JSF了,在這一部分讓我們來看看在JSF是如何處理請求的。
首先讓我們來看一個例子,這個例子是將華氏度轉換為攝氏度。當使用者點選提交按鈕時程式將進行轉換。
<%@ taglib uri=" prefix="h" %> <%@ taglib uri=" prefix="f" %> <html> <head> <meta HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=GB2312"> <title>溫度轉換程式</title> </head> <body> <f:view> <h:form> <div> <h:outputText id="fahrenheitLabel" value="請輸入華氏溫度:"/> <span> <h:inputText id="temperature" value="#{tc.fahrenheitTemp}"> <f:validateDoublerange minimum="-100.0" maximum="100.0"/> <f:valuechangeListener type="tempconv.page.TCChangedListener"/> </h:inputText> </span> </div> <div> <h:outputText id="celsiusLabel" value="攝氏溫度:"/> <span> <h:outputText id="celsiusValue" value="#{tc.celsiusTemp}"> <f:convertNumber maxFractionDigits="3" type="number"/> </h:outputText> </span> </div> <div> <h:commandButton value="轉換" action="#{tc.convert}"> </h:commandButton> </div> </h:form> </f:view> </body> </html> |
在程式的前兩行是匯入JSF核心庫和HTML庫,這個在前面已經討論過,在這裡不再詳述。
下面讓我們來看看JSF標籤是如何同後端進行互動的。由於我們是在JSP中使用JSF,因此,這個和正常的JSP沒有什麼區別;JSP實際上就是Servlet,在JSP第一次執行時由JSP編譯器將.JSP檔案編譯成Servlet後再由Servlet呼叫,然後由Servlet來接收客戶端傳過來的資料流。但和一般的JSP程式不同的是,JSF標籤是由JSF API負責呼叫的(這樣可以做到邏輯層和表現層分離),除此之外,它們和一般的JSP標籤沒有任何區別。
當UIComponent標籤收到doStartTag方法時,JSF將使用這些屬性來設定標籤的值。如本例中的inputText標籤將按它的屬性值來設定。下面是JSF的程式碼片段。
<h:inputText id="temperature" value="#{tc.fahrenheitTemp}"> <f:validateDoublerange minimum="-100.0" maximum="100.0"/> <f:valuechangeListener type="tempconv.page.TCChangedListener"/> </h:inputText> |
inputText標籤根據相應的值設定了id和value的屬性。在JSF中是透過setAttribute(String name, Object value)設定每一個屬性值的。但我們需要注意的是JSF標籤可以指定相應的預設值。這有些類似java中的系統屬性,如果你給了一個屬性名子,那系統將返回這個屬性的值,如果指定它的預設值,並且這個屬性不存在的話,將返回這個預設值。
接下來讓我們來看看上面程式的最重要的部分,也就是UIInput元件的事件處理。
<f:valuechangeListener type="tempconv.page.TCChangedListener"/> |
在JSF中事件處理是由valuechangeListener標籤完成的。這個標籤所表示的事件在文字框的值發生變化時引發事件。但有意思的是這個事件並不馬上提交,而是要等到使用者點選"提交"按鈕後這個事件連同相應的資料才提交給後端。因此,這個事件請求也叫做預提交。最後,讓我們看看UICommand的程式碼實現。
<div> <h:commandButton value="轉換" action="#{tc.convert}"> </h:commandButton> </div> |
上面的程式碼將convert()方法和UICommand連線了起來,也就是說,點選"提交"按鈕後,將執行convert()方法。在遇到view標籤後,JSF程式結果,JSFAPI最後呼叫doEnd方法來結束JSF程式。JSF引擎在解析這段程式後,將相應的JSF標籤轉換為HTML元件。
最後,讓我們來看看JSP是如何響應JSF事件的。下面是一段響應JSF事件的Java程式碼。
public class TCChangedListener implements ValueChangeListener { public TCChangedListener() { super(); } // 事件處理 public void processValueChange(ValueChangeEvent event) throws AbortProcessingException { UIComponent comp = event.getComponent(); Object value = event.getNewValue(); if (null != value) { float curVal = ((Number) value).floatValue(); Map values = comp.getAttributes(); if (curVal < 0) { values.put("styleClass", "red"); } else { values.put("styleClass", "black"); } } } |
要想響應JSF事件,必須要實現JSF庫中的ValueChangeListener介面。上面的程式要注意的是最後根據輸入的值來設定相應的顏色。這些值並不依賴JSP。當然,你也可以將它們設定成null,而由JSP 標籤來設定它們的顏色。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8271432/viewspace-892833/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JSP牽手JSF打造完美的Web應用JSWeb
- ETL中雙流合併和多流合併的區別
- jsf與jspJS
- 打造雙劍合璧的 XSS 前端防火牆前端防火牆
- [應用案例]完美自適應WEB開發官網Web
- React/Redux打造的同構Web應用ReactReduxWeb
- 有jsf的應用嗎JS
- Hbase-原理-region合併和hfile的合併(大合併、小合併)
- 完美世界:打造中國電競產業雙迴圈發展新格局產業
- 請求合併與拆分在併發場景中應用
- Git dev分支合併到master分支完美實戰GitdevAST
- Node助力Web應用開發——在新的開發平臺,打造高效能Web應用Web
- 用Spring Web Flow和Terracotta搭建Web應用SpringWeb
- ffmpeg綜合應用示例(五)——多路視訊合併
- 打造一款可靠的WAF(Web應用防火牆)Web防火牆
- Mac如何使用預覽應用合併PDF檔案 Mac合併PDF檔案教程詳解Mac
- 雙刃劍MongoDB的學習和避坑MongoDB
- Web應用開發: JSP語法程式設計實踐(一) JSP中的標識WebJS程式設計
- JSF和strutsJS
- 適合小型外包團隊的5個Web應用程式組合Web
- 劍指offer面試17 合併兩個排序的連結串列面試排序
- 兩步快速脫yoda's cryptor 1.2殼--esp定律和記憶體斷點完美組合應用記憶體斷點
- jsp的簡單應用JS
- Seam: 為 JSF 量身定做的應用程式框架JS框架
- 面向Web應用的併發壓力測試工具——Locust實用攻略Web
- Web應用Web
- WEB開發之提升JSP應用程式的七大絕招(轉)WebJS
- 豆瓣網:用Quixote和web.py打造強大的網站UIWeb網站
- 用緩衝技術OSCache 提高JSP應用的效能和穩定性JS
- 打造網路安全的利劍
- 如何打造 “好用” 的應用?
- 打造完美編輯器--VS code
- Yeoman官方教程:用Yeoman和AngularJS做Web應用AngularJSWeb
- Maven Web 應用MavenWeb
- Web小應用Web
- Web應用程式Web
- 使用Rust和WebAssembly構建Web應用程式RustWeb
- 用Python理解Web併發模型PythonWeb模型