国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JSP > 正文

JSP和JSF雙劍合并 共同打造完美Web應用

2024-09-05 00:19:39
字體:
來源:轉載
供稿:網友


收集最實用的網頁特效代碼!

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="http://java.sun.com/jsf/html" prefix="h" %><%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %><html><head><meta http-equiv="content-type" content="text/html;charset=gb2312"><title>第一個jsf程序</title></head><body> <f:view>?。糷:form id="simpleform">?。糷:outputtext id="favoritelabel" value="請輸入一個數字:"/>?。糷:inputtext id="favoritevalue" value="#{simple.longvalue}"> ?。糵:validatelongrange maximum="30" minimum="0"/> </h:inputtext>?。紁/>?。糷: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="http://java.sun.com/jsf/html" prefix="h" %>

<%@ taglib uri="http://java.sun.com/jsf/core" 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="http://java.sun.com/jsf/html" prefix="h" %><%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %><html><head>?。糾eta http-equiv="content-type" content="text/html;charset=gb2312"><title>溫度轉換程序</title></head><body>?。糵:view>?。糷:form> <div> ?。糷:outputtext id="fahrenheitlabel" value="請輸入華氏溫度:"/>  <span>  ?。糷:inputtext id="temperature" value="#{tc.fahrenheittemp}">  ?。糵:validatedoublerange minimum="-100.0" maximum="100.0"/>  ?。糵:valuechangelistener type="tempconv.page.tcchangedlistener"/> ?。?h:inputtext>  </span>?。?div>?。糳iv> ?。糷:outputtext id="celsiuslabel" value="攝氏溫度:"/> ?。約pan>  ?。糷:outputtext id="celsiusvalue" value="#{tc.celsiustemp}">  ?。糵: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"/>

?。糵: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>

?。糷: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 標簽來設置它們的顏色。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 大厂| 贡觉县| 紫金县| 昆明市| 高阳县| 若尔盖县| 高唐县| 库车县| 西乌珠穆沁旗| 林西县| 波密县| 宁波市| 运城市| 习水县| 沙坪坝区| 三穗县| 林口县| 和田市| 赣州市| 隆昌县| 鹤壁市| 汉阴县| 原平市| 育儿| 梨树县| 理塘县| 扶绥县| 资溪县| 无棣县| 额尔古纳市| 偃师市| 铁岭县| 通辽市| 盐山县| 南部县| 图木舒克市| 新泰市| 周口市| 新竹县| 崇州市| 延寿县|