亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > 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>?。糵:view>?。糷:form id="simpleform">?。糷:outputtext id="favoritelabel" value="請輸入一個數字:"/>?。糷:inputtext id="favoritevalue" value="#{simple.longvalue}"> ?。糵:validatelongrange maximum="30" minimum="0"/> </h:inputtext>?。紁/> <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="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="請輸入華氏溫度:"/> ?。約pan>   <h:inputtext id="temperature" value="#{tc.fahrenheittemp}">  ?。糵:validatedoublerange minimum="-100.0" maximum="100.0"/>   <f:valuechangelistener type="tempconv.page.tcchangedlistener"/> ?。?h:inputtext> ?。?span> </div>?。糳iv> ?。糷:outputtext id="celsiuslabel" value="攝氏溫度:"/> ?。約pan>  ?。糷:outputtext id="celsiusvalue" value="#{tc.celsiustemp}">   <f:convertnumber maxfractiondigits="3" type="number"/> ?。?h:outputtext>  </span>?。?div>?。糳iv> ?。糷: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}">

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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品久久久久国产| 欧美专区国产专区| 国产精品电影网| 亚洲精品福利免费在线观看| 日韩美女写真福利在线观看| 精品视频久久久久久久| 午夜精品视频在线| 欧洲亚洲妇女av| 国产精品亚洲网站| 精品国产欧美一区二区五十路| 91免费精品国偷自产在线| 久久影视电视剧凤归四时歌| 国产精品激情自拍| 亚洲女人天堂成人av在线| 91亚洲国产成人久久精品网站| 亚洲成人黄色网址| 欧美精品videosex极品1| 色悠悠久久久久| 性日韩欧美在线视频| 欧美巨猛xxxx猛交黑人97人| 91精品国产色综合久久不卡98口| 亚洲午夜未删减在线观看| 精品高清美女精品国产区| 欧美在线精品免播放器视频| 亚洲一区二区三区777| 国产日韩精品在线播放| 中文字幕欧美日韩在线| 亚洲午夜av电影| 国产精品电影在线观看| 亚洲四色影视在线观看| 成人欧美一区二区三区黑人孕妇| 中文字幕日韩欧美在线| 亚洲18私人小影院| 色哟哟亚洲精品一区二区| 久久伊人色综合| 亚洲国产97在线精品一区| 中文字幕日韩av电影| 在线性视频日韩欧美| 岛国av午夜精品| 亚洲成人精品视频在线观看| 一本色道久久综合狠狠躁篇怎么玩| 最近2019年好看中文字幕视频| 日韩精品视频免费| 亚洲有声小说3d| wwwwwwww亚洲| 久久99久久99精品免观看粉嫩| 69av在线播放| 国产午夜精品视频| 色噜噜狠狠狠综合曰曰曰| 精品福利一区二区| 亚洲黄在线观看| 中文字幕精品www乱入免费视频| 91免费精品国偷自产在线| 午夜精品99久久免费| 精品少妇v888av| 久久久999国产精品| 久久免费少妇高潮久久精品99| 欧美精品www| 精品国产一区二区三区久久久狼| 国产精品伦子伦免费视频| 九九精品在线播放| 国产精品99蜜臀久久不卡二区| 国产日韩一区在线| 日韩在线高清视频| 久久久国产在线视频| 国产精品自产拍在线观看中文| 国产一区二区在线免费| 久色乳综合思思在线视频| 欧美精品免费在线观看| 欧美午夜激情视频| 国产精品成人免费视频| 日韩三级影视基地| 久久精品视频中文字幕| 日韩h在线观看| 日韩欧美精品在线观看| 俺去了亚洲欧美日韩| 久久久精品网站| 久久精品99久久久久久久久| 欧美日韩亚洲精品内裤| 成人高h视频在线| 日韩精品丝袜在线| 成人免费xxxxx在线观看| 国产日韩一区在线| 69久久夜色精品国产7777| 亚洲成人xxx| 欧美黑人性生活视频| 57pao国产成人免费| 中国日韩欧美久久久久久久久| 国产亚洲视频中文字幕视频| 亚洲第一精品电影| 精品成人久久av| 欧美精品videosex极品1| 日韩中文字幕在线精品| 欧美一级大片在线观看| 国产91在线高潮白浆在线观看| 中文字幕日韩精品在线观看| 欧美日韩国产精品一区| 两个人的视频www国产精品| 国产精品第1页| 91精品国产高清久久久久久91| 国内成人精品视频| 成人在线一区二区| 综合激情国产一区| 久久久久久12| 色噜噜久久综合伊人一本| 欧美色道久久88综合亚洲精品| 欧美高跟鞋交xxxxxhd| 亚洲乱码一区二区| 国产精品情侣自拍| 欧美视频不卡中文| 激情久久av一区av二区av三区| 亚洲一级片在线看| 欧美中文字幕视频| 亚洲精品免费网站| 九九九热精品免费视频观看网站| xxxx欧美18另类的高清| 久久夜精品va视频免费观看| 亚洲精品视频网上网址在线观看| 亚洲无av在线中文字幕| www.日韩免费| 国产女人18毛片水18精品| 91免费版网站入口| 狠狠久久亚洲欧美专区| 欧美国产精品日韩| 亚洲最大的网站| 国产区精品在线观看| 欧美天堂在线观看| 精品中文字幕久久久久久| 亚洲精品国产精品久久清纯直播| 91高清视频免费观看| 狠狠爱在线视频一区| 日韩av中文在线| 欧美性高潮床叫视频| 欧美视频一区二区三区…| 久久亚洲电影天堂| 中文字幕在线视频日韩| 日韩国产欧美精品一区二区三区| 国产精品自拍网| 亚洲欧美综合另类中字| 久久99精品国产99久久6尤物| 最新国产精品亚洲| 中文字幕亚洲欧美在线| 91在线视频精品| 国内精品久久久久影院 日本资源| 成人高h视频在线| 亚洲视屏在线播放| 91香蕉嫩草神马影院在线观看| 黑丝美女久久久| 色综合色综合久久综合频道88| 欧美成人免费大片| 亚洲tv在线观看| 国内免费久久久久久久久久久| 日本a级片电影一区二区| 欧美性videos高清精品| 国产精品爽爽ⅴa在线观看| 欧美成年人视频网站| 亚洲第一综合天堂另类专| 欧美午夜片欧美片在线观看| 国产欧美日韩中文字幕在线| 7777kkkk成人观看| 777777777亚洲妇女| 亚洲国产又黄又爽女人高潮的| 91欧美视频网站| 国产91对白在线播放|