精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

通過JSF 2實(shí)現(xiàn)可重用的Ajax化組件

開發(fā) 后端
51CTO向讀者們具體介紹過Ajax支持包,以及利用“Ajax聽取JSF2客戶端處理代碼中的事件和錯(cuò)誤”。今天51CTO編輯向大家推薦這篇文章:結(jié)合復(fù)合組件和Ajax輕而易舉地實(shí)現(xiàn)支持Ajax自定義組件。

51CTO向讀者們具體介紹過Ajax支持包,以及利用“Ajax聽取JSF 2客戶端處理代碼中的事件和錯(cuò)誤”。今天51CTO編輯向大家推薦這篇文章結(jié)合復(fù)合組件和Ajax輕而易舉地實(shí)現(xiàn)支持Ajax自定義組件。

關(guān)于本系列JSFfu系列建立在DavidGeary的同名簡(jiǎn)介文章的概念的基礎(chǔ)之上。本系列將深入探究JSF2及其生態(tài)系統(tǒng),同時(shí)還將介紹如何將一些JavaEE技術(shù),如Contexts和DependencyInjection,與JSF相集成。

在本文中,我將向您介紹如何實(shí)現(xiàn)自動(dòng)完成組件,它將使用Ajax管理其完成項(xiàng)列表。在此過程中,您將了解如何將Ajax集成到您自己的復(fù)合組件中。

本系列的代碼基于在企業(yè)容器,如GlassFish或Resin,中運(yùn)行的JSF2。本文的最后一部分將詳細(xì)討論如何使用GlassFish來安裝和運(yùn)行本文的代碼。

JSF自動(dòng)完成自定義組件

因谷歌搜索字段而聞名的自動(dòng)完成字段(也稱作建議框)是許多Web應(yīng)用程序的組合。它們也是Ajax的典型應(yīng)用。自動(dòng)完成字段隨帶了許多Ajax框架,比如Scriptaculous和JQuery,如圖1—AjaxDaddy的自動(dòng)完成組件集成(參閱參考資料)—所示:

AjaxDaddy自動(dòng)完成組件
 圖1.AjaxDaddy自動(dòng)完成組件

 本文將討論如何使用JSF來實(shí)現(xiàn)支持Ajax的自動(dòng)完成字段。您將了解如何實(shí)現(xiàn)如圖2所示的自動(dòng)完成字段,其中將顯示一個(gè)簡(jiǎn)短的虛擬國(guó)家列表(選自Wikipedia的“虛擬國(guó)家列表”一文;請(qǐng)參閱參考資料):

自動(dòng)完成字段
 圖2.自動(dòng)完成字段

#p#

 圖3和圖4顯示了運(yùn)行中的自動(dòng)完成字段。在圖3中,在字段中輸入Al之后,國(guó)家列表將縮減至使用這兩個(gè)字母開頭的名稱:

使用Al開頭的完成項(xiàng)目
 圖3.使用Al開頭的完成項(xiàng)目

同樣,圖4顯示了在字段中輸入Bar之后顯示的結(jié)果。列表僅顯示以Bar開頭的國(guó)家名。

以Bar開頭的完成項(xiàng)目
 圖4.以Bar開頭的完成項(xiàng)目

使用自動(dòng)完成組件

復(fù)合組件:基礎(chǔ)如果您不熟悉如何實(shí)現(xiàn)JSF2復(fù)合組件,那么您可以從“JSF2簡(jiǎn)介,第2部分:模板及復(fù)合組件”這篇文章中了解基本知識(shí)。

.Locations自動(dòng)完成字段是一個(gè)JSF復(fù)合組件,并應(yīng)用于facelet,如清單1所示:

清單1.facelet

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"  
  2.    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
  3. <html xmlns="http://www.w3.org/1999/xhtml" 
  4.       xmlns:h="http://java.sun.com/jsf/html" 
  5.       xmlns:util="http://java.sun.com/jsf/composite/util"> 
  6.    <h:head> 
  7.       <title>#{msgs.autoCompleteWindowTitle}</title> 
  8.    </h:head> 
  9.  
  10.    <h:body> 
  11.       <div style="padding: 20px;"> 
  12.          <h:form> 
  13.             <h:panelGrid columns="2"> 
  14.                #{msgs.locationsPrompt}  
  15.                <util:autoComplete value="#{user.country}" 
  16.                      completionItems="#{autoComplete.countries}" /> 
  17.             </h:panelGrid> 
  18.          </h:form> 
  19.       </div> 
  20.    </h:body> 
  21. </html>   
  22.  

清單1中的facelet通過聲明適當(dāng)?shù)拿Q空間—util—以及借助組件的相關(guān)標(biāo)記(<util:autoComplete>)來使用autoComplete復(fù)合組件。

注意清單1中<util:autoComplete>標(biāo)記的兩個(gè)屬性:

•value是名稱為user的托管bean的國(guó)家屬性。

•completionItems是字段的完成項(xiàng)目的初始集。

User類是一個(gè)簡(jiǎn)單的托管bean,專為本例而設(shè)計(jì)。其代碼如清單2所示:

#p#

清單2.User類

  1. package com.corejsf;  
  2.  
  3. import java.io.Serializable;  
  4.  
  5. import javax.inject.Named;   
  6. import javax.enterprise.context.SessionScoped;   
  7.  
  8. @Named()  
  9. @SessionScoped  
  10. public class User implements Serializable {  
  11.   private String country;  
  12.   public String getCountry() { return country; }  
  13.   public void setCountry(String country) { this.country = country; }  
  14. }  
  15.  

請(qǐng)注意@Named注釋,它與@SessionScoped一起實(shí)例化了一個(gè)名稱為user的托管bean,并在JSF第一次在facelet中遇到#{user.country}時(shí)將它置于session作用域中。此應(yīng)用程序中唯一的#{user.country}引用發(fā)生在清單1中,其中,我將user托管bean的country屬性指定為<util:autoComplete>組件的值。

清單3顯示了AutoComplete類,該類定義了countries屬性,即自動(dòng)完成組件的完成項(xiàng)目列表:

清單3.完成項(xiàng)目

  1. package com.corejsf;  
  2.  
  3. import java.io.Serializable;  
  4.  
  5. import javax.enterprise.context.ApplicationScoped;  
  6. import javax.inject.Named;  
  7.  
  8. @Named  
  9. @ApplicationScoped  
  10. public class AutoComplete implements Serializable {  
  11.    public String[] getLocations() {  
  12.       return new String[] {  
  13.         "Abari", "Absurdsvanj", "Adjikistan", "Afromacoland",  
  14.         "Agrabah", "Agaria", "Aijina", "Ajir", "Al-Alemand",  
  15.         "Al Amarja", "Alaine", "Albenistan", "Aldestan",  
  16.         "Al Hari", "Alpine Emirates", "Altruria",  
  17.         "Allied States of America", "BabaKiueria", "Babalstan",  
  18.         "Babar's Kingdom","Backhairistan", "Bacteria",  
  19.         "Bahar", "Bahavia", "Bahkan", "Bakaslavia",  
  20.         "Balamkadar", "Baki", "Balinderry", "Balochistan",  
  21.         "Baltish", "Baltonia", "Bataniland, Republic of",  
  22.         "Bayview", "Banania, Republica de", "Bandrika",  
  23.         "Bangalia", "Bangstoff", "Bapetikosweti", "Baracq",  
  24.         "Baraza", "Barataria", "Barclay Islands",  
  25.         "Barringtonia", "Bay View", "Basenji",  
  26.       };  
  27.    }  
  28. }  
  29.  

自動(dòng)完成組件的使用方法已經(jīng)介紹完畢。現(xiàn)在,您將了解它的工作原理。

#p#

自動(dòng)完成組件的工作原理

自動(dòng)完成組件是一個(gè)JSF2復(fù)合組件,因此,與大多數(shù)復(fù)合組件相同,它是在XHTML文件中實(shí)現(xiàn)的。組件包括一個(gè)文本輸入和一個(gè)列表框,以及一些JavaScript代碼。最開始,列表框style是display:none,其作用是讓列表框不可見。

自動(dòng)完成組件響應(yīng)三個(gè)事件:

◆文本輸入中的keyup事件

◆文本輸入中的blur(失焦)事件

◆列表框中的change(選擇)事件

當(dāng)用戶在文本輸入中鍵入內(nèi)容時(shí),自動(dòng)完成組件會(huì)調(diào)用每個(gè)keyup事件的JavaScript函數(shù)。該函數(shù)結(jié)合鍵盤輸入事件,以不大于350ms的間隔定期調(diào)用Ajax。因此,在響應(yīng)文本輸入中的keyup事件時(shí),自動(dòng)完成組件會(huì)以不大于350ms的間隔定期向服務(wù)器發(fā)起Ajax調(diào)用。(其作用是防止快速輸入時(shí)的大量Ajax調(diào)用將服務(wù)器淹沒。在實(shí)踐中,結(jié)合事件的頻率可能會(huì)稍高,但這足以演示如何在JavaScript中結(jié)合事件,同時(shí)這是一個(gè)非常實(shí)用的工具。)

當(dāng)用戶從列表框中選擇項(xiàng)目時(shí),自動(dòng)完成組件會(huì)向服務(wù)器發(fā)起另一個(gè)Ajax調(diào)用。

文本輸入和列表框都附加了監(jiān)聽程序,它們?cè)贏jax調(diào)用期間完成與服務(wù)器相關(guān)的大部分有意義的工作。在響應(yīng)keyup事件時(shí),文本輸入的監(jiān)聽程序會(huì)更新列表框的完成項(xiàng)目。在響應(yīng)列表框的選擇事件時(shí),列表框的監(jiān)聽程序會(huì)將列表框的選中項(xiàng)目復(fù)制到文本輸入中,并隱藏列表框。

現(xiàn)在,您已經(jīng)了解了自動(dòng)完成組件的工作原理。接下來,我們來看看它的具體實(shí)現(xiàn)。

實(shí)現(xiàn)自動(dòng)完成組件

自動(dòng)完成組件實(shí)現(xiàn)包括以下工件:

◆一個(gè)復(fù)合組件

◆一系列JavaScript函數(shù)

◆一個(gè)用于更新完成項(xiàng)目的值變更監(jiān)聽程序

我將從清單4開始復(fù)合組件:

清單4.autoComplete組件

  1. <ui:composition xmlns="http://www.w3.org/1999/xhtml" 
  2.     xmlns:ui="http://java.sun.com/jsf/facelets" 
  3.     xmlns:f="http://java.sun.com/jsf/core" 
  4.     xmlns:h="http://java.sun.com/jsf/html"      
  5.     xmlns:composite="http://java.sun.com/jsf/composite"> 
  6.       
  7.     <!-- INTERFACE --> 
  8.     <composite:interface> 
  9.       <composite:attribute name="value" required="true"/> 
  10.       <composite:attribute name="completionItems" required="true"/> 
  11.     </composite:interface>   
  12.  
  13.     <!-- IMPLEMENATION -->            
  14.     <composite:implementation> 
  15.       <div id="#{cc.clientId}"> 
  16.         <h:outputScript library="javascript"   
  17.            name="prototype-1.6.0.2.js" target="head"/> 
  18.           
  19.         <h:outputScript library="javascript"   
  20.            name="autoComplete.js" target="head"/> 
  21.         
  22.         <h:inputText id="input" value="#{cc.attrs.value}"   
  23.            onkeyup="com.corejsf.updateCompletionItems(this, event)" 
  24.            onblur="com.corejsf.inputLostFocus(this)" 
  25.            valueChangeListener="#{autocompleteListener.valueChanged}"/> 
  26.               
  27.         <h:selectOneListbox id="listbox" style="display: none" 
  28.            valueChangeListener="#{autocompleteListener.completionItemSelected}"> 
  29.           
  30.             <f:selectItems value="#{cc.attrs.completionItems}"/> 
  31.             <f:ajax render="input"/> 
  32.             
  33.         </h:selectOneListbox> 
  34.       <div> 
  35.     </composite:implementation>      
  36. </ui:composition> 
  37.  

清單4的實(shí)現(xiàn)部分完成了三項(xiàng)任務(wù)。首先,該組件發(fā)起Ajax調(diào)用以響應(yīng)文本輸入中的keyup事件,并通過分配給文本輸入中的keyup和blur事件的JavaScript函數(shù)在文本輸入失焦時(shí)隱藏列表框。

其實(shí),該組件通過JSF2的<f:ajax>標(biāo)記來發(fā)起Ajax調(diào)用來響應(yīng)列表框中的change事件。當(dāng)用戶從列表框中進(jìn)行選擇時(shí),JSF會(huì)向服務(wù)器發(fā)起一個(gè)Ajax調(diào)用,并在Ajax調(diào)用返回時(shí)更新文本輸入的值。

在<div>中封裝復(fù)合組件清單4中的復(fù)合組件通過復(fù)合組件的客戶機(jī)標(biāo)識(shí)符將其實(shí)現(xiàn)封裝在<div>中。這樣,其他組件便可通過其客戶機(jī)ID來引用自動(dòng)完成組件。舉例來說,另一個(gè)組件可能會(huì)希望在Ajax調(diào)用期間執(zhí)行或呈現(xiàn)一個(gè)或多個(gè)自動(dòng)完成組件。

.第三,文本輸入和列表框都附加了相應(yīng)的值變更監(jiān)聽程序,因此當(dāng)JSF發(fā)起Ajax調(diào)用來響應(yīng)用戶在文本輸入中的鍵入操作時(shí),JSF會(huì)調(diào)用服務(wù)器上的文本輸入的值變更監(jiān)聽程序。當(dāng)用戶從列表框中選擇項(xiàng)目時(shí),JSF會(huì)向服務(wù)器發(fā)起一個(gè)Ajax調(diào)用并調(diào)用列表框的值變更監(jiān)聽程序。

#p#

清單5顯示了自動(dòng)完成組件所使用的JavaScript:

清單5.JavaScript

  1. if (!com)  
  2.    var com = {}  
  3.  
  4. if (!com.corejsf) {  
  5.    var focusLostTimeout  
  6.    com.corejsf = {  
  7.       errorHandler : function(data) {  
  8.          alert("Error occurred during Ajax call: " + data.description)  
  9.       },  
  10.  
  11.       updateCompletionItems : function(input, event) {  
  12.          var keystrokeTimeout  
  13.  
  14.          jsf.ajax.addOnError(com.corejsf.errorHandler)  
  15.  
  16.          var ajaxRequest = function() {  
  17.  
  18.             jsf.ajax.request(input, event, {  
  19.                render: com.corejsf.getListboxId(input),  
  20.                x: Element.cumulativeOffset(input)[0],  
  21.                y: Element.cumulativeOffset(input)[1]  
  22.                      + Element.getHeight(input)  
  23.             })  
  24.          }  
  25.  
  26.          window.clearTimeout(keystrokeTimeout)  
  27.          keystrokeTimeout = window.setTimeout(ajaxRequest, 350)  
  28.       },  
  29.  
  30.       inputLostFocus : function(input) {  
  31.          var hideListbox = function() {  
  32.             Element.hide(com.corejsf.getListboxId(input))  
  33.          }  
  34.  
  35.          focusLostTimeout = window.setTimeout(hideListbox, 200)  
  36.       },  
  37.  
  38.       getListboxId : function(input) {  
  39.          var clientId = new String(input.name)  
  40.          var lastIndex = clientId.lastIndexOf(':')  
  41.          return clientId.substring(0, lastIndex) + ':listbox'  
  42.       }  
  43.    }  
  44. }  
  45.  

清單5中的JavaScript包括三個(gè)函數(shù),我把它們放置在com.corejsf名稱空間的內(nèi)部。我實(shí)現(xiàn)了名稱空間(從技術(shù)上說是一個(gè)JavaScript字面對(duì)象),以防止其他人有意或無意修改我的三個(gè)函數(shù)。

如果這些函數(shù)未包含在com.corejsf中,則其他人可以實(shí)現(xiàn)自己的updateCompletionItems函數(shù),從而將我的實(shí)現(xiàn)替換成它們。一些JavaScript庫(kù)可以實(shí)現(xiàn)一個(gè)updateCompletionItems函數(shù),但最理想的情況是任何人都不用設(shè)計(jì)com.corejsf.updateCompletionItems。(相反,拋棄com,并使用corejsf.updateCompletionItems可能已經(jīng)足夠,但有時(shí)會(huì)難以控制。)

因此,這些函數(shù)做了些什么?updateCompletionItems()函數(shù)向服務(wù)器發(fā)起Ajax請(qǐng)求—通過調(diào)用JSF的jsf.ajax.request()函數(shù)—要求JSF僅在Ajax調(diào)用返回時(shí)呈現(xiàn)列表框組件。updateCompletionItems()函數(shù)還傳遞了兩個(gè)額外的參數(shù)到j(luò)sf.ajax.request()中:列表框左上角的x和y坐標(biāo)。jsf.ajax.request()函數(shù)會(huì)將這些函數(shù)參數(shù)轉(zhuǎn)換為通過Ajax調(diào)用發(fā)送的請(qǐng)求參數(shù)。

JSF會(huì)在文本輸入失焦時(shí)調(diào)用inputLostFocus()函數(shù)。該函數(shù)的作用是使用Prototype的Element對(duì)象來隱藏列表框。

updateCompletionItems()和inputLostFocus()將它們的功能存儲(chǔ)在一個(gè)函數(shù)中。然后,它們安排自己的函數(shù)分別在350ms和200ms時(shí)執(zhí)行。換句話說,每個(gè)函數(shù)都有各自的任務(wù),但它會(huì)讓任務(wù)延時(shí)350ms或200ms。文本輸入會(huì)在keyup事件后延時(shí),因此,updateCompletionItems()方法會(huì)最多每隔350ms發(fā)送一個(gè)Ajax請(qǐng)求。其思想是,如果用戶輸入速度極快,則不會(huì)讓Ajax調(diào)用淹沒服務(wù)器。

inputLostFocus函數(shù)會(huì)在文本輸入失焦時(shí)調(diào)用,并延時(shí)其任務(wù)200ms。這種延時(shí)是必要的,因?yàn)樵撝禃?huì)在Ajax調(diào)用返回時(shí)復(fù)制到列表框之外,并且列表框必須為可見才能確保它正常運(yùn)行。

最后,請(qǐng)注意getListBoxId()函數(shù)。這個(gè)幫助器函數(shù)會(huì)從文本輸入的客戶機(jī)標(biāo)識(shí)符中獲取列表框的客戶機(jī)標(biāo)識(shí)符。該函數(shù)可以完成此任務(wù),因?yàn)樗鼘⑴c清單4中的autoComplete組件相結(jié)合。autoComplete組件將input和listbox分別指定為文本框和列表框的組件標(biāo)識(shí)符,因此getListBoxId()函數(shù)會(huì)刪除input并附加listbox,以便獲取文本輸入的客戶機(jī)標(biāo)識(shí)符。

#p#

清單6顯示了監(jiān)聽程序的最終實(shí)現(xiàn):

清單6.監(jiān)聽程序

  1. package com.corejsf;  
  2.  
  3. import java.io.Serializable;  
  4. import java.util.ArrayList;  
  5. import java.util.List;  
  6. import java.util.Map;  
  7.  
  8. import javax.enterprise.context.SessionScoped;  
  9. import javax.faces.component.UIInput;  
  10. import javax.faces.component.UISelectItems;  
  11. import javax.faces.component.UISelectOne;  
  12. import javax.faces.context.FacesContext;  
  13. import javax.faces.event.ValueChangeEvent;  
  14. import javax.inject.Named;  
  15.  
  16. @Named  
  17. @SessionScoped  
  18. public class AutocompleteListener implements Serializable {  
  19.    private static String COMPLETION_ITEMS_ATTR = "corejsf.completionItems";  
  20.     
  21.    public void valueChanged(ValueChangeEvent e) {  
  22.       UIInput input = (UIInput)e.getSource();  
  23.       UISelectOne listbox = (UISelectOne)input.findComponent("listbox");  
  24.  
  25.       if (listbox != null) {  
  26.          UISelectItems items = (UISelectItems)listbox.getChildren().get(0);  
  27.          Map<String, Object> attrs = listbox.getAttributes();  
  28.          List<String> newItems = getNewItems((String)input.getValue(),  
  29.             getCompletionItems(listbox, items, attrs));  
  30.  
  31.          items.setValue(newItems.toArray());  
  32.          setListboxStyle(newItems.size(), attrs);  
  33.       }  
  34.    }  
  35.     
  36.    public void completionItemSelected(ValueChangeEvent e) {  
  37.      UISelectOne listbox = (UISelectOne)e.getSource();  
  38.      UIInput input = (UIInput)listbox.findComponent("input");  
  39.       
  40.      if(input != null) {  
  41.         input.setValue(listbox.getValue());  
  42.      }  
  43.      Map<String, Object> attrs = listbox.getAttributes();  
  44.      attrs.put("style", "display: none");  
  45.    }  
  46.      
  47.    private List<String> getNewItems(String inputValue, String[] completionItems) {  
  48.       List<String> newnewItems = new ArrayList<String>();  
  49.       
  50.       for (String item : completionItems) {  
  51.          String s = item.substring(0, inputValue.length());  
  52.          if (s.equalsIgnoreCase(inputValue))  
  53.            newItems.add(item);  
  54.       }  
  55.       
  56.       return newItems;  
  57.    }  
  58.     
  59.    private void setListboxStyle(int rows, Map<String, Object> attrs) {  
  60.       if (rows > 0) {  
  61.          Map<String, String> reqParams = FacesContext.getCurrentInstance()  
  62.             .getExternalContext().getRequestParameterMap();  
  63.         
  64.          attrs.put("style", "display: inline; position: absolute; left: "  
  65.              + reqParams.get("x") + "px;" + " top: " + reqParams.get("y") + "px");  
  66.  
  67.          attrs.put("size", rows == 1 ? 2 : rows);  
  68.       }  
  69.       else  
  70.          attrs.put("style", "display: none;");  
  71.    }  
  72.  
  73.    private String[] getCompletionItems(UISelectOne listbox,  
  74.       UISelectItems items, Map<String, Object> attrs) {  
  75.          Strings] completionItems = (String[])attrs.get(COMPLETION_ITEMS_ATTR);  
  76.       
  77.          if (completionItems == null) {  
  78.             completionItems = (String[])items.getValue();  
  79.             attrs.put(COMPLETION_ITEMS_ATTR, completionItems);  
  80.          }  
  81.       return completionItems;  
  82.    }  
  83. }  
  84.  

JSF在Ajax調(diào)用期間調(diào)用監(jiān)聽程序的valueChanged()方法來響應(yīng)文本輸入中的keyup事件。該方法會(huì)創(chuàng)建一組新的完成項(xiàng)目,然后將列表框的項(xiàng)目設(shè)置為這個(gè)新的項(xiàng)目集。該方法還會(huì)設(shè)置列表框的樣式屬性,以確定Ajax調(diào)用返回時(shí)是否顯示列表框。

清單6中的setListboxStyle()方法將使用x和y請(qǐng)求我在發(fā)起清單5中的Ajax調(diào)用時(shí)指定的參數(shù)值。

JSF會(huì)在Ajax調(diào)用期間調(diào)用監(jiān)聽程序的其他公共方法completionItemSelected(),以響應(yīng)列表框中的選擇事件。該方法會(huì)將列表框的值復(fù)制到文本輸入中,并隱藏列表框。

請(qǐng)注意,valueChanged()方法還會(huì)將原始完成項(xiàng)目存儲(chǔ)在列表框的某個(gè)屬性中。由于每個(gè)autoComplete組件都維護(hù)自己的完成項(xiàng)目列表,因此多個(gè)autoComplete組件可以在相同頁(yè)面中和諧共存,而不會(huì)影響彼此的完成項(xiàng)目。

#p#

使用GlassFish和Eclipse運(yùn)行示例

本系列中的代碼適合在JEE6容器中運(yùn)行,比如GlassFish或Resin。您可以通過調(diào)整讓它們適應(yīng)servlet容器,但這并非理想方案。因此,我的目標(biāo)是側(cè)重于充分發(fā)揮JSF2和JEE6的潛力,而不是配置問題。我仍然堅(jiān)持使用GlassFishv3。

在本文的其余部分,我將向您展示如何使用GlassFishv3和Eclipse來運(yùn)行本文的示例代碼。此處的說明還適用于本系列其他文章的代碼。(我將使用Eclipse3.4.1,因此最好是使用與之相近的版本。)

圖5展示了本文代碼的目錄結(jié)構(gòu)。其中的autoComplete目錄包含應(yīng)用程序和一個(gè)空的Eclipse工作空間目錄。

本文下載部分的源代碼

圖5.本文下載部分的源代碼

現(xiàn)在,您已經(jīng)下載了代碼,接下來就可以運(yùn)行它了。首先,您需要GlassFishEclipse插件,可從https://glassfishplugins.dev.java.net下載它,如圖6所示:

GlassFishEclipse插件
圖6.GlassFishEclipse插件

請(qǐng)依照插件的安裝說明操作。

要安裝本文的代碼,請(qǐng)?jiān)贓clipse中創(chuàng)建一個(gè)DynamicWeb項(xiàng)目。為此,可以通過File>New菜單來實(shí)現(xiàn):如果未看到DynamicWebProject,那么請(qǐng)選擇Other,并在接下來的對(duì)話框中打開Web文件夾并選擇DynamicWebProject,如圖7所示:

創(chuàng)建一個(gè)DynamicWeb項(xiàng)目
 圖7.創(chuàng)建一個(gè)DynamicWeb項(xiàng)目

#p#

下一步是配置項(xiàng)目。在NewDynamicWebProject向?qū)У牡谝粋€(gè)頁(yè)面中做出以下選擇,如圖8所示:

1.在Projectcontents下,保留Usedefault框?yàn)槲催x中狀態(tài)。在Directory字段中,輸入(或?yàn)g覽到)示例代碼的autoComplete目錄。

2.對(duì)于TargetRuntime,請(qǐng)選擇GlassFishv3JavaEE6。

3.對(duì)于DynamicWebModuleversion,請(qǐng)輸入2.5。

4.對(duì)于Configuration,請(qǐng)選擇DefaultConfigurationforGlassFishv3JavaEE6。

5.在EARMembership下,保留AddprojecttoanEAR框?yàn)槲催x中狀態(tài),并在EARProjectName:字段中輸入autoCompleteEAR。

配置應(yīng)用程序
 圖8.配置應(yīng)用程序,步驟1

單擊Next,然后輸入如圖9所示的值:

1.對(duì)于ContextRoot:,輸入autoComplete。

2.對(duì)于ContentDirectory:,輸入web。

3.對(duì)于JavaSourceDirectory:,輸入src/java。保留Generatedeploymentdescriptor框?yàn)槲催x中狀態(tài)。

配置應(yīng)用程序
 圖9.配置應(yīng)用程序,步驟2

現(xiàn)在,您應(yīng)該已經(jīng)建立了一個(gè)autoComplete項(xiàng)目,它將顯示在Eclipse的ProjectExplorer視圖中,如圖10所示:

autoComplete項(xiàng)目
 圖10.autoComplete項(xiàng)目

#p#

現(xiàn)在,選擇項(xiàng)目,右鍵單擊它并選擇RunonServer,如圖11所示:

使用Eclipse在服務(wù)器上運(yùn)行
圖11.使用Eclipse在服務(wù)器上運(yùn)行

從RunOnServer對(duì)話框的服務(wù)器列表中選擇GlassFishv3JavaEE6,如圖12所示:

選擇GlassFish
圖12.選擇GlassFish

#p#

單擊Finish。Eclipse應(yīng)該會(huì)相繼啟動(dòng)GlassFish和autoComplete應(yīng)用程序,如圖13所示:

在Eclipse中運(yùn)行
 13.在Eclipse中運(yùn)行

結(jié)束語(yǔ)

借助JSF2,開發(fā)人員可以輕松地創(chuàng)建功能強(qiáng)大、支持Ajax的自定義組件。您不需要在XML中實(shí)現(xiàn)基于Java的組件或呈現(xiàn)器,或者集成第三方JavaScript來發(fā)起Ajax調(diào)用。借助JSF2,您只需要使用幾乎與任何JSF2facelet視圖相同的標(biāo)記來創(chuàng)建一個(gè)復(fù)合組件,并根據(jù)需求添加一些JavaScript或Java代碼,以及voilà—您將實(shí)現(xiàn)一個(gè)奇妙自定義組件,為應(yīng)用程序用戶提供極為方便的數(shù)據(jù)輸入功能。

在JSFfu的下一期中,我將討論實(shí)現(xiàn)Ajax化JSF自定義組件的更多方面,比如將<f:ajax>標(biāo)記集成到您的自定義組件中,以參與其他人發(fā)起的Ajax。

【編輯推薦】

  1. JSF2中Ajax事件和錯(cuò)誤
  2. JSF2.0通過最終投票 JSF已經(jīng)實(shí)現(xiàn)所有特性
責(zé)任編輯:佚名 來源: developerWorks 中國(guó)
相關(guān)推薦

2009-06-23 10:17:09

Ajax事件和錯(cuò)誤JSF2

2011-07-21 17:11:09

AjaxJSF

2009-06-25 14:05:08

Ajax JSF

2023-10-17 07:23:00

Vue組件代碼

2009-06-25 13:03:48

JSF的UI組件

2009-06-29 13:22:19

JSF技術(shù)JSF組件

2009-03-13 15:24:50

catchDisposeWCF

2009-06-26 13:20:50

JSF和Ajax

2009-06-29 10:09:55

AjaxJSF

2009-06-24 13:06:41

JSF組件Facelets

2009-06-22 13:27:01

JSF組件模型

2009-06-01 09:30:51

JSF2.0FaceletsAjax4JSF

2009-06-24 14:59:00

圖形bean組件JSF圖形組件

2009-06-22 15:07:45

原則和技巧JSF自定義復(fù)合組件

2020-06-02 09:06:31

VueTransition前端

2024-01-03 08:00:00

Java軟件開發(fā)代碼

2009-06-22 13:41:58

FaceletsJSF組件

2011-07-21 13:24:14

java

2023-11-08 13:55:27

2012-02-24 15:25:45

ibmdw
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

粉嫩av一区二区三区免费野| 高清国产一区二区三区| 中文字幕一区二区精品| 色婷婷一区二区三区在线观看| 草莓福利社区在线| 91在线视频官网| 国产女精品视频网站免费| 欧美成人三级在线观看| 九一亚洲精品| 日韩欧美在线影院| 激情五月亚洲色图| 欧洲精品二区| 欧美国产欧美综合| 成人免费看片网址| 在线观看黄色国产| 国产日韩亚洲欧美精品| 久久精品国产一区二区三区| 青青草视频播放| 亚洲日韩中文字幕一区| 欧美性猛交xxxxx水多| 日本黄xxxxxxxxx100| 国产永久免费高清在线观看| 国产91精品精华液一区二区三区| 国产精品青草久久久久福利99| 久久精品无码人妻| 天天操综合网| 在线视频欧美日韩| 一女三黑人理论片在线| 永久免费精品视频| 欧美精品自拍偷拍| 久久综合色视频| 久久不射影院| 亚洲蜜臀av乱码久久精品蜜桃| 久久久久久99| 色丁香婷婷综合久久| 国产精品一区二区你懂的| 国产成人一区二区三区| 波多野结衣国产| 黄色欧美日韩| 久久久久久com| 国产a免费视频| 91精品综合久久久久久久久久久 | 亚洲激情图片qvod| 亚洲三区在线| 香蕉视频在线免费看| 久久蜜桃av一区二区天堂| 国产亚洲自拍偷拍| 日批免费在线观看| av电影在线观看完整版一区二区| 91视频网页| 亚洲h视频在线观看| 国产精品一区二区久久不卡| 国产综合久久久久久| 亚洲一级片免费看| 久久国产成人午夜av影院| 国产精品视频区| 国产精品乱码久久久| 久久精品国产秦先生| 国产在线久久久| 97人妻精品一区二区三区动漫| 美女视频一区二区三区| 91精品国产综合久久久久久蜜臀 | 中文字幕欧美视频在线| ass极品国模人体欣赏| 成人在线免费小视频| 日韩中文字幕av| 国产又粗又硬又长又爽| 欧美日韩精品免费观看视频完整| 欧美大胆在线视频| 日本一级淫片色费放| 一区二区三区四区五区精品视频 | 18岁网站在线观看| 神马久久资源| 欧美久久久久久久久久| 少妇熟女视频一区二区三区| 欧美精品密入口播放| 亚洲欧美色婷婷| 天堂av网手机版| 一级毛片免费高清中文字幕久久网| 欧美巨猛xxxx猛交黑人97人| 日本一级淫片色费放| 久久精品主播| 成人女保姆的销魂服务| 老司机午夜福利视频| 久久婷婷国产综合精品青草| 亚洲一卡二卡区| 丁香花在线影院| 色老汉av一区二区三区| 久久婷婷中文字幕| 欧美黑白配在线| 日韩在线小视频| 日本网站在线免费观看| 蜜桃视频在线观看一区二区| 国产精品99久久久久久久 | 国产日本一区二区| 亚洲色图都市激情| 黑人巨大精品| 欧美va天堂va视频va在线| 亚洲av无码一区二区二三区| 午夜国产一区二区| 91av视频在线免费观看| 97久久人国产精品婷婷| 久久久久久久久久久99999| 一区二区三区在线观看www| 国产精品一二三产区| 欧美日本精品一区二区三区| 天天插天天射天天干| 婷婷精品进入| 国产成人福利网站| 好男人在线视频www| 亚洲欧洲成人精品av97| 黑森林福利视频导航| 成人激情自拍| 色婷婷av一区二区三区在线观看| 一区二区三区福利视频| 国产很黄免费观看久久| 亚洲成人第一| 欧美xoxoxo| 精品电影一区二区三区 | 天天射天天综合网| 日韩免费在线看| 天堂成人在线观看| 一区二区三区欧美亚洲| 97超碰人人爽| 日韩av在线播放网址| 欧洲s码亚洲m码精品一区| 亚洲AV无码成人片在线观看| 国产精品视频在线看| 日本xxxxxxx免费视频| 精品国产18久久久久久洗澡| 不卡中文字幕av| 一级特黄色大片| 久久久蜜桃精品| 99爱视频在线| 日韩系列在线| 51ⅴ精品国产91久久久久久| 全国男人的天堂网| 亚洲国产乱码最新视频 | 久久精品视频16| 超碰精品在线观看| 欧美精品久久久久久久| 亚洲va久久久噜噜噜无码久久| 亚洲乱码日产精品bd| caoporm在线视频| 99成人超碰| 91九色视频导航| 超碰在线无需免费| 日韩精品中文字幕一区二区三区| 国产女人被狂躁到高潮小说| 国产精品一二三| 奇米777四色影视在线看| 国产一区二区三区| 欧美巨乳美女视频| 日批视频在线播放| 色综合久久久久综合体桃花网| 日本xxx在线播放| 久久久久国内| 天天综合狠狠精品| 在线成人免费| 久久99亚洲热视| 精品国产九九九| 亚洲一区电影777| 亚洲国产精品无码久久久久高潮| 羞羞视频在线观看欧美| 日韩欧美视频一区二区| 色999韩欧美国产综合俺来也| 日韩在线视频观看| 亚洲黄色小说网| 粉嫩老牛aⅴ一区二区三区| 久久亚洲无码视频| 国模少妇一区二区三区| 女女百合国产免费网站| 国产伦理久久久久久妇女 | 色婷婷久久av| 亚洲精品久久久久久久久久久久久久| 亚洲第一精品在线| 色婷婷在线影院| 免费国产亚洲视频| 精品久久久无码人妻字幂| 欧美偷窥清纯综合图区| 国产精品扒开腿做爽爽爽视频| 免费黄网站在线| 精品国产91乱码一区二区三区| 欧美黑人一区二区| 国产精品超碰97尤物18| 亚洲中文字幕无码一区| 奇米777欧美一区二区| www.亚洲成人网| 免费观看久久av| 亚洲自拍偷拍福利| 蜜臀国产一区| 欧美大片免费观看在线观看网站推荐| 五月婷中文字幕| 欧美午夜一区二区| 五月天婷婷丁香| 国产精品成人在线观看| 国产麻豆剧传媒精品国产av| 另类欧美日韩国产在线| 日本福利视频一区| 五月天综合网站| 热re99久久精品国产99热 | 日本一区高清不卡| 欧美日韩国产一区二区在线观看| 欧美洲成人男女午夜视频| 国产福利在线播放麻豆| 亚洲一二三在线| 亚洲欧美国产高清va在线播放| 欧美调教femdomvk| 日韩久久久久久久久| 亚洲视频在线观看一区| 老司机福利av| 成人av动漫在线| 中文字幕剧情在线观看| 日韩av不卡一区二区| a级黄色一级片| 中文无码久久精品| 亚洲国产午夜伦理片大全在线观看网站| 粉嫩一区二区三区四区公司1| 国产玖玖精品视频| 成人免费网站www网站高清| 欧美激情高清视频| 丝袜国产在线| 色偷偷88888欧美精品久久久| 同心难改在线观看| 亚洲国产精品久久91精品| 国产免费视频一区二区三区| 欧美无人高清视频在线观看| 欧美精品一二三四区| 天天综合色天天| 99视频在线看| 亚洲无线码一区二区三区| 午夜免费激情视频| ●精品国产综合乱码久久久久 | 欧美伦理在线视频| 国产精品一区二区在线观看 | 欧美大胆a人体大胆做受| 欧美激情免费视频| 日本在线视频www鲁啊鲁| 美女性感视频久久久| 成人福利网站| 久久天天躁日日躁| 黄色av免费在线| 久久综合电影一区| 肉肉视频在线观看| 九色精品免费永久在线| 男人天堂亚洲天堂| 国模极品一区二区三区| 91jq激情在线观看| 91禁国产网站| 女生影院久久| 国产精品美女久久久免费| 国产一区二区主播在线| 国产精品一香蕉国产线看观看| 日本在线中文字幕一区二区三区| 国产精品成人av性教育| julia一区二区三区中文字幕| 国产精品毛片a∨一区二区三区|国| 奇米777日韩| 国产精品美女网站| 韩国三级成人在线| 岛国视频一区免费观看| 欧美日韩导航| 日本一区视频在线| 天天综合网网欲色| 隔壁人妻偷人bd中字| 99成人免费视频| 少妇激情一区二区三区| 久久99精品国产麻豆婷婷| 亚洲综合伊人久久| 99国产精品久久| 成年人在线免费看片| 最新热久久免费视频| 亚洲一区二区91| 在线观看91视频| av一区二区三| 精品亚洲夜色av98在线观看| 国产福利电影在线| 欧美尺度大的性做爰视频| 天堂中文av在线资源库| 国产精品视频26uuu| 日韩不卡在线视频| 欧美日韩一区二区视频在线观看| 日韩欧美中文| 免费 成 人 黄 色| 美女一区二区三区| 久久久久久久无码| 亚洲人一二三区| 亚洲综合久久网| 欧美一区二区三区免费| 日本福利片在线| 久久国产精品亚洲| 久久91导航| 成人影片在线播放| 大色综合视频网站在线播放| 国产在线无码精品| 日日摸夜夜添夜夜添精品视频 | 51vv免费精品视频一区二区 | 欧美丰满少妇人妻精品| 日韩久久一区二区| 亚洲AV无码成人精品区东京热| 欧美一卡二卡三卡四卡| 毛片网站在线观看| 欧美高清视频在线观看| 国产精品.xx视频.xxtv| 久久国产精品久久精品国产| 91精品蜜臀一区二区三区在线| 日本三区在线观看| 成人小视频在线| 神马午夜精品91| 91久久国产最好的精华液| 嫩草影院一区二区| 久久国产精彩视频| 色成人综合网| 亚洲丰满在线| 久久成人国产| 中国特级黄色片| 亚洲你懂的在线视频| 中文av免费观看| 亚洲男人天堂2024| 韩日毛片在线观看| 成人免费看片网址| 国产精品videosex极品| 色网站在线视频| 国产精品久久看| 中文字幕观看视频| 国产亚洲精品日韩| 性欧美1819sex性高清| 久久精品国产精品国产精品污| 国产综合视频| 国产成人精品综合久久久久99| 1024国产精品| 国产手机精品视频| 久久久国产精品一区| 欧美亚洲综合视频| 亚洲一区二区不卡视频| 奇米精品一区二区三区四区| 人与嘼交av免费| 在线观看一区日韩| 国产精品一二三区视频| 国产成人福利视频| 超碰成人久久| 男人添女人下面免费视频| 国产精品系列在线| 在线视频 中文字幕| 精品国产一区二区三区久久久狼 | 精品视频在线免费看| 91激情在线| 成人免费视频97| 亚洲精品中文字幕乱码| 黄色片子免费看| 亚洲福利视频三区| 亚洲欧洲国产综合| 国产成+人+综合+亚洲欧洲 | 暴力调教一区二区三区| 日韩成人免费观看| 亚洲天堂日韩电影| 日韩护士脚交太爽了| 警花观音坐莲激情销魂小说| 国产乱人伦偷精品视频不卡| 久久亚洲国产成人精品性色| 亚洲成年人影院在线| 在线男人天堂| 五月天丁香综合久久国产| 久久成人精品无人区| 久草中文在线视频| 亚洲国产欧美精品| 国精产品一区二区三区有限公司| 亚洲一区二区高清视频| 国产精品一卡二| 99精品在线播放| 日韩中文字幕不卡视频| 2020国产精品极品色在线观看| 亚洲 高清 成人 动漫| 欧美激情综合五月色丁香小说| 国产精品无码天天爽视频| 久久久天堂国产精品女人| 国产成人精品免费视| 中文av字幕在线观看| 午夜影视日本亚洲欧洲精品| 九九在线视频| 91国产在线播放| 老牛嫩草一区二区三区日本| 免费精品在线视频| 日韩国产中文字幕| 人人精品久久| 国产特级黄色大片| 最新国产成人在线观看| 天天射,天天干| 国产情人节一区| 在线亚洲成人| 欧美一区免费观看| 日韩精品在线免费观看| 国产欧美日韩电影| 成人观看免费完整观看| 亚洲男人天堂av| 精品视频一二三| 成人黄动漫网站免费| 蜜桃视频在线观看一区二区| 亚洲综合一二三| 久久成人av网站|