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

首頁 > 編程 > JSP > 正文

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

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

  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">
 <h: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程序,將得到如圖1所顯示效果。


圖1 第一個jsf程序的運行結果

  三、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>
?。糳iv>
  <h:outputtext id="fahrenheitlabel" value="請輸入華氏溫度:"/>
 ?。約pan>
  ?。糷:inputtext id="temperature" value="#{tc.fahrenheittemp}">
  ?。糵: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>
 <div>
 ?。糷: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 標簽來設置它們的顏色。菜鳥學堂:
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲福利视频专区| 日本高清+成人网在线观看| 日本一区二三区好的精华液| 91青草视频久久| 中文字幕日韩专区| 国产精品视频永久免费播放| 亚洲在线一区二区| 亚洲性生活视频在线观看| 久久精品电影网| 亚洲系列中文字幕| 欧美午夜视频一区二区| 91香蕉嫩草影院入口| 久久夜色精品亚洲噜噜国产mv| 久久九九全国免费精品观看| 97福利一区二区| 国产精品无码专区在线观看| 国产成人精品视频在线观看| 久久久中精品2020中文| 欧美性开放视频| 国产精品视频最多的网站| 精品久久香蕉国产线看观看亚洲| 日本国产高清不卡| 日韩激情视频在线播放| 97在线精品国自产拍中文| 欧美激情乱人伦一区| 亚洲第一级黄色片| 成人在线视频福利| 91热福利电影| 欧美激情一二三| 亚洲乱码国产乱码精品精| 96国产粉嫩美女| 成人有码在线播放| 成人免费淫片aa视频免费| 久久精视频免费在线久久完整在线看| 亚洲成人激情小说| 国产精品三级美女白浆呻吟| 亚洲成人免费在线视频| 国产偷国产偷亚洲清高网站| 国产成+人+综合+亚洲欧美丁香花| 久久久噜噜噜久久中文字免| 欧美一级电影久久| 国产日韩精品综合网站| 色综合久久中文字幕综合网小说| 国产一区二区三区视频| 国产在线精品成人一区二区三区| 久久国产精品久久国产精品| 欧美丰满少妇xxxx| 成人黄色片网站| 按摩亚洲人久久| www.99久久热国产日韩欧美.com| 狠狠久久五月精品中文字幕| 日产日韩在线亚洲欧美| www.国产精品一二区| 国产成人+综合亚洲+天堂| 午夜精品久久久久久久久久久久| 欧美一级淫片丝袜脚交| 一区二区三区四区精品| 日韩影视在线观看| 日韩欧美国产骚| 中文字幕精品一区二区精品| 亚洲激情久久久| 九九精品视频在线| 久久不射电影网| 亚洲成人黄色网| 久久久亚洲欧洲日产国码aⅴ| 国产伦精品一区二区三区精品视频| 中文字幕亚洲欧美日韩2019| 久久久精品视频在线观看| 91精品啪在线观看麻豆免费| 欧美黑人巨大xxx极品| 国产精品夫妻激情| 久久精品亚洲热| 国产精品久久中文| 欧美最猛黑人xxxx黑人猛叫黄| 精品中文字幕视频| 亚洲一区二区三区毛片| 久久亚洲精品国产亚洲老地址| 欧美激情视频在线免费观看 欧美视频免费一| 日韩一区二区福利| 欧美—级a级欧美特级ar全黄| 国a精品视频大全| 国产精品极品尤物在线观看| 高潮白浆女日韩av免费看| 亚洲欧美日本精品| 在线亚洲午夜片av大片| 亚洲人成五月天| 久久国产精品99国产精| 国产精品吴梦梦| 欧洲午夜精品久久久| 亚洲国产另类久久精品| 国产伊人精品在线| 狠狠综合久久av一区二区小说| 黑丝美女久久久| 中文字幕亚洲字幕| 2024亚洲男人天堂| 国产日韩欧美成人| 亚洲成人激情图| 国产日韩欧美在线视频观看| 欧美俄罗斯性视频| 国产精品免费电影| 91免费电影网站| 亚洲精品99久久久久中文字幕| 久久九九有精品国产23| 成人免费黄色网| 欧美日韩亚洲91| 亚洲欧美自拍一区| 国产精品aaa| 亚洲激情在线视频| 98精品在线视频| 91社区国产高清| 国产精品6699| 欧美xxxx做受欧美.88| 久久精品亚洲94久久精品| 国产精品自拍偷拍| 欧美在线一级va免费观看| 国产视频久久久久久久| 日韩中文av在线| 亚洲片在线资源| 欧美成人精品h版在线观看| 91免费看片在线| 欧美精品videos| 国产主播精品在线| 欧美乱大交xxxxx| 欧美电影在线观看完整版| 亚洲欧美激情精品一区二区| 久久精品国产综合| 中文字幕日韩免费视频| 黄色一区二区在线| 亚洲视频专区在线| 国产精品99久久久久久www| 亚洲老头同性xxxxx| 欧美黑人视频一区| 国产精品成人一区二区| 亚洲黄色在线看| 国产主播喷水一区二区| 性欧美视频videos6一9| 欧美精品videos| 26uuu久久噜噜噜噜| 91网站在线看| 亚洲国产精品专区久久| 日韩专区中文字幕| 亚洲老头老太hd| 日韩大片在线观看视频| 91夜夜未满十八勿入爽爽影院| 日韩欧美中文免费| 亚洲国产精品资源| 国精产品一区一区三区有限在线| 欧美性猛交xxxx乱大交极品| 欧美日本亚洲视频| 亚州成人av在线| 久久成年人免费电影| 欧美wwwxxxx| 亚洲最大福利视频| 国产精品久久久久久久久久免费| 国产精品久久久久久久久久久久久久| 日韩精品在线免费| 欧美国产日韩一区二区| 国产主播在线一区| 久久久久中文字幕2018| 国产中文字幕91| 色婷婷综合成人av| 91探花福利精品国产自产在线| 欧美一级淫片videoshd| 国产精品你懂得|