當前位置:編程學習大全網 - 遊戲軟體 - JSP和JSF合並打造完美Web應用

JSP和JSF合並打造完美Web應用

 Java在最近幾年逐漸升溫 隨著Java SE 和Java SE 的推出 Java的未來更顯得無比輝煌 但以Java為基礎的JSP在Java SE 推出之前卻壹直擡不起頭來 這最重要的原因就是JSP雖然功能十分強大 但最大的優點也是它的最大缺點 功能強大就意味著復雜 尤其是設計前端界面的可視化工具不多 也不夠強大 因此 設計JSP頁面就變得十分復雜和繁瑣 不過 在Java SE 推出的同時 Sun為了簡化JSP的開發難度 推出了新的JavaServer Faces(簡稱JSF)規範 從而使JSP走上了康莊大道

 壹 什麽是JSF

 JSF和JSP是壹對新的搭檔 JSP是用於後臺的邏輯處理的技術 而JSF恰恰相反 是使開發人員能夠快速的開發基於 Java 的 Web 應用程序的技術 是壹種表現層技術 目前 JSF 已經正式作為壹個標準加入了Java EE 中

 作為壹種高度組件化的技術 開發人員可以在壹些開發工具的支持下 實現拖拉式編輯操作 用戶只需要簡單的將 JSF 組件拖到頁面上 就可以很容易的進行 Web 開發了 這是其作為壹種組件化的技術所具有的最大好處 我們能用的組件不光是壹些比較簡單的輸入框之類 還有更多復雜的組件可以使用的 比如 DataTable 這樣的表格組件 Tree 這樣的樹形組件等等

 作為壹種標準的技術 JSF還得到了相當多工具提供商的支持 同時我們也會有很多很好的免費開發工具可以使用 前不久 Sun Java Studio Creator 和 Oracle JDeveloper g 作為免費的支持 JSF 的開發工具發布 給 JSF 帶來了不小的生氣 另外我們也有壹些很優秀的商業開發工具可***選擇 BEA Workshop (原 M 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="%> <%@ taglib uri="%> <> <head> <meta HTTP EQUIV="Content Type" CONTENT="text/;CHARSET=GB "> <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=" " minimum=" "/></h:inputText><p/><h:mandButton id="submit" value="提交" action="#{simple simpleActionMethod}"/></h:form></f:view> </body> </>

 在上面的代碼中 我們可以了解到JSF是如何同JSP集成的 我們首先可以看到壹個內核標簽 view 然後是幾個JSF組件 如form outputText inputText以及mandButton 這幾個組件被放到form中從而開成了form中的壹部分 在程序的最開始 必須使用import導入兩個標簽庫 代碼如下

 <%@ taglib uri="%> <%@ taglib uri="%>

 上面 行代碼聲明了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=" " minimum=" "/> </h:inputText> <p/> <h:mandButton id="submit" value="提交" action="#{simple simpleActionMethod}"/> </h:form> </f:view>

 </f:view>標簽預示著JSF的開始 而它的下壹個標簽form將建立壹個HTML Form 而outputText標簽相當於HTML中的label組件 inputText標簽相當於HTML中的textField組件 而mandButton標簽相當於HTML中的submit按鈕 運行這個JSP程序 將得到如圖 所顯示效果

  圖 第壹個JSF程序的運行結果

 三 JSP如何響應JSF的請求

 從上面的例子我們已經知道如何在JSP中使用JSF了 在這壹部分讓我們來看看在JSF是如何處理請求的

 首先讓我們來看壹個例子 這個例子是將華氏度轉換為攝氏度 當用戶點擊提交按鈕時程序將進行轉換

 <%@ taglib uri="%> <%@ taglib uri="%> <> <head><meta HTTP EQUIV="Content Type" CONTENT="text/;CHARSET=GB "> <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=" " maximum=" "/>  <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=" " type=number/> </h:outputText> </span></div><div> <h:mandButton value="轉換" action="#{tc convert}"> </h:mandButton></div></h:form></f:view> </body> </>

 在程序的前兩行是導入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=" " maximum=" "/><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:mandButton value="轉換" action="#{tc convert}"></h:mandButton> </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 p = event getComponent(); Object value = event getNewValue(); if (null != value) {  float curVal = ((Number) value) floatValue();  Map values = p getAttributes();  if (curVal < )  {   values put("styleClass" "red");  }  else  {   values put("styleClass" "black");  } } }

lishixinzhi/Article/program/Java/JSP/201311/19954

  • 上一篇:元旦節作文
  • 下一篇:母難日壹句話感恩語 母難日的經典說說28句
  • copyright 2024編程學習大全網