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

首頁 > 編程 > JSP > 正文

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

2019-11-18 16:38:36
字體:
來源:轉載
供稿:網友

  java在最近幾年逐漸升溫,隨著Java SE 5和Java SE 6的推出,Java的未來更顯得無比輝煌。但以Java為基礎的jsp在Java SE 5推出之前卻一直抬不起頭來,這最重要的原因就是JSP雖然功能十分強大,但最大的優點也是它的最大缺點,功能強大就意味著復雜,尤其是設計前端界面的可視化工具不多,也不夠強大。因此,設計JSP頁面就變得十分復雜和繁瑣...
  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="

 ?。?@ taglib uri="

 ?。糷tml>

 ?。糷ead>

  <meta HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=GB2312">

 ?。紅itle>第一個JSF程序</title>

  </head>

 ?。糱ody>

   <f:view>

  ?。糷:form id="simpleForm">

   <h:outputText id="favoriteLabel" value="請輸入一個數字:"/>

  ?。糷:inputText id="favoriteValue" value="#{simple.longValue}">

    <f:validateLongrange maximum="30" minimum="0"/>

  ?。?h:inputText>

   <p/>

  ?。糷: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="

  <%@ taglib uri="

  上面2行代碼聲明了JSP中要使用哪一個JSF標簽庫。內核庫使用前綴(prefix)f聲明,而HTML庫使用前綴(prefix)h聲明。這兩個前綴并不是必須要使用,而只是一個建議。在程序中,內核庫必須要使用,因為view在所有的JSF頁中必須使用。而HTML標簽在運行時將JSF標簽轉化為HTML組件,這個h前綴并不是必須的,而是JSF規范推薦使用的,這樣,我們使我們的JSF程序更易讀。

  在聲明后是幾行標準的HTML語句,本文不再詳述。從<f:view>開始,是一段JSF語句。這段代碼如下所示:

  <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>

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


  三、JSP如何響應JSF的請求

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

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

 ?。?@ taglib uri="

 ?。?@ taglib uri="

  <html>

 ?。糷ead>

   <meta HTTP-EQUIV="Content-Type" CONTENT="text/html;CHARSET=GB2312">

 ?。紅itle>溫度轉換程序</title>

 ?。?head>

  <body>

  ?。糵:view>

  ?。糷:form>

  ?。糳iv>

   ?。糷:outputText id="fahrenheitLabel" value="請輸入華氏溫度:"/>

    <span>

    ?。糷:inputText id="temperature" value="#{tc.fahrenheitTemp}">

     <f:validateDoublerange minimum="-100.0" maximum="100.0"/>

    ?。糵:valuechangeListener type="tempconv.page.TCChangedListener"/>

    </h:inputText>

   ?。?span>

  ?。?div>

  ?。糳iv>

    <h:outputText id="celsiusLabel" value="攝氏溫度:"/>

   ?。約pan>

     <h:outputText id="celsiusValue" value="#{tc.celsiusTemp}">

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

   <f:valuechangeListener type="tempconv.page.TCChangedListener"/>

 ?。?h:inputText>

  inputText標簽根據相應的值設置了id和value的屬性。在JSF中是通過setAttribute(String name, Object value)設置每一個屬性值的。但我們需要注意的是JSF標簽可以指定相應的默認值。這有些類似java中的系統屬性,如果你給了一個屬性名子,那系統將返回這個屬性的值,如果指定它的默認值,并且這個屬性不存在的話,將返回這個默認值。

  接下來讓我們來看看上面程序的最重要的部分,也就是UIInput組件的事件處理。

 ?。糵:valuechangeListener type="tempconv.page.TCChangedListener"/>

  在JSF中事件處理是由valuechangeListener標簽完成的。這個標簽所表示的事件在文本框的值發生變化時引發事件。但有意思的是這個事件并不馬上提交,而是要等到用戶點擊"提交"按鈕后這個事件連同相應的數據才提交給后端。因此,這個事件請求也叫做預提交。最后,讓我們看看UICommand的代碼實現。

 ?。糳iv>

  ?。糷: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一区二区在线在线观看| 欧美电影在线播放| 国产精品成人v| 国产不卡av在线| 中文国产成人精品久久一| 色偷偷亚洲男人天堂| 91精品久久久久久久| 精品在线小视频| 日韩福利视频在线观看| 久久国产精品网站| 91精品国产综合久久香蕉| 亚洲精品久久久久久久久久久久久| 国产精品一区专区欧美日韩| 欧美精品一本久久男人的天堂| 国产精品无av码在线观看| 日韩一区二区三区xxxx| 亚洲高清免费观看高清完整版| 国产精品亚洲一区二区三区| 97在线日本国产| 久久九九国产精品怡红院| 日韩精品极品在线观看播放免费视频| 深夜福利一区二区| 欧美理论片在线观看| 成人国产精品免费视频| 欧美二区在线播放| 国产精品福利片| 亚洲欧洲国产一区| 亚洲成**性毛茸茸| 国产精品96久久久久久又黄又硬| 92福利视频午夜1000合集在线观看| 久久久久亚洲精品| 久久91亚洲精品中文字幕| 懂色aⅴ精品一区二区三区蜜月| 国产精品福利小视频| 国自产精品手机在线观看视频| 亚洲国产精品一区二区久| 最近2019年好看中文字幕视频| 国产美女精品视频| 国产偷国产偷亚洲清高网站| 亚洲奶大毛多的老太婆| 色综合久久久久久中文网| 国产精品美女午夜av| 国产精品免费观看在线| 亚洲激情在线观看| 日韩av免费在线看| 国产综合在线观看视频| 欧美性猛交xxxxx免费看| 国产一区二区激情| 久久久久国色av免费观看性色| 欧美高跟鞋交xxxxhd| 国产久一一精品| 欧美成人一二三| 国产成人自拍视频在线观看| 亚洲精品电影网站| 亚洲欧美福利视频| 久久伊人精品一区二区三区| 亚洲精品资源在线| 精品国产欧美一区二区三区成人| 岛国av一区二区在线在线观看| 最近2019年日本中文免费字幕| 亚洲天堂开心观看| 亚洲毛片在线观看.| 亚洲电影在线看| 日产日韩在线亚洲欧美| 国产精品黄页免费高清在线观看| 91精品国产色综合久久不卡98口| 日韩视频免费大全中文字幕| 欧美极品少妇全裸体| 国产精品极品美女在线观看免费| 亚洲欧美一区二区三区四区| 欧美精品www| 精品视频在线播放免| 欧美成在线观看| 中文字幕日韩av电影| 777777777亚洲妇女| 欧美综合第一页| 国产成人精品国内自产拍免费看| 久久伊人免费视频| 日本久久亚洲电影| 欧美日韩精品在线观看| 18性欧美xxxⅹ性满足| 精品国产依人香蕉在线精品| 亚洲成人激情小说| 国产亚洲欧洲高清一区| 国产伦精品免费视频| 久久这里只有精品视频首页| 三级精品视频久久久久| 国产精品丝袜久久久久久不卡| 国产美女被下药99| 国产成人一区二区三区小说| 日韩欧美国产中文字幕| 在线看欧美日韩| 国产精品久久久久免费a∨大胸| 狠狠综合久久av一区二区小说| 日韩成人在线免费观看| 亚洲国产精品久久久久秋霞不卡| 亚洲午夜未满十八勿入免费观看全集| 91豆花精品一区| 国产美女久久精品香蕉69| 国产精品一区二区久久久久| 国产视频福利一区| 国产精品嫩草影院一区二区| 国产成人精品久久亚洲高清不卡| 国产一区二区三区三区在线观看| 国产日产久久高清欧美一区| 亚洲精品wwwww| 这里只有精品丝袜| 中文字幕视频一区二区在线有码| 911国产网站尤物在线观看| 日韩欧美成人网| 亚洲日韩第一页| 成人久久久久久久| 亚洲一区二区国产| 日韩国产欧美精品一区二区三区| 国产精品小说在线| 久久精品99久久香蕉国产色戒| 久久影院免费观看| 久久久av亚洲男天堂| 亚洲人成亚洲人成在线观看| 亚洲国产精品专区久久| 菠萝蜜影院一区二区免费| 国产精品视频免费在线观看| 国产成人小视频在线观看| 亚洲天天在线日亚洲洲精| 国产精品入口夜色视频大尺度| 欧美成人在线免费| 51视频国产精品一区二区| 中文字幕久久亚洲| 亚洲色图18p| 亚洲成人免费网站| 91亚洲精品一区| 欧美第一黄色网| 欧美黄色三级网站| 91色精品视频在线| 亚洲视频999| 91精品国产色综合久久不卡98口| 国产精品视频大全| 欧美伦理91i| 成人免费黄色网| 欧美大片在线看免费观看| 欧美日韩一区二区三区| 国产一区二区三区在线| 69视频在线免费观看| 亚洲码在线观看| 免费不卡欧美自拍视频| 亚洲成人激情在线| 亚洲老头老太hd| 国产在线拍揄自揄视频不卡99| 久久69精品久久久久久国产越南| 日产日韩在线亚洲欧美| 欧美日韩国产精品| 国产精品流白浆视频| 欧美性在线视频| 国产精品国模在线| 中文字幕日韩免费视频| 久久五月情影视| 亚洲国产一区二区三区在线观看| 亚洲电影免费观看高清完整版| 精品日韩视频在线观看|