A4J 用戶指南
List of Tables
- 4.1. a4j:ajaxListener attributes
- 4.2. a4j:region attributes
- 4.3. a4j:page attributes
- 4.4. a4j:support attributes
- 4.5. a4j:commandLink attributes
- 4.6. a4j:commandButton attributes
- 4.7. a4j:outputPanel attributes
- 4.8. a4j:actionparam attributes
- 4.9. a4j:status attributes
- 4.10. a4j:loadBundle attributes
- 4.11. a4j:mediaOutput attributes
- 7.1. Initialization Parametres
- 7.2. org.ajax4jsf.Filter Initialization Parametres
- 10.1. Ajax4jsf Resources
Ajax4jsf 是一個添加Ajax功能到JSF項目中的開源框架,使用該框架不用寫JS代碼.
Ajax4jsf 充分利用了JSF框架的優(yōu)點,如: 生命周期, 驗證, 轉(zhuǎn)換的靈活性和受管理的靜態(tài)和動態(tài)資源. 使用Ajax4jsf, 具有Ajax支持的富組件和高度可自定義的外觀感覺可以很容易的與JSF結(jié)合起來.
Ajax4JSF 被設(shè)計用來:
在使用Ajax時充分顯示JSF的優(yōu)點.Ajax4jsf 完全被結(jié)合到 JSF 生命周期中. 當其他框架僅僅給你訪問Managed Bean的便利時,Ajax4JSF帶給你 Action 和 Value Change 監(jiān)聽器,激活服務(wù)端驗證,在Ajax請求-響應(yīng)周期中的轉(zhuǎn)化 這些功能.
添加 AJAX 功能到已經(jīng)存在的 JSF 項目. 該框架被實現(xiàn)為使用一個組件庫來添加ajax功能到你的頁 面中,而不要寫js代碼或者使用新的Ajax裝飾器替換你已經(jīng)做好的JSF組件. Ajax4jsf 具有頁面范圍(page-wide)的Ajax支持,而不是傳統(tǒng)的組件范圍(component-wide)的ajax支持. 這意味著你可以在頁面中定義一個激活Ajax請求的事件,和當根據(jù)客戶端事件觸發(fā)Ajax請求來改變服務(wù)器端數(shù)據(jù)后 如何使用JSF組件樹來同步顯示JSF頁面.
使用內(nèi)建的Ajax支持寫自定義富組件. 將來, 我們將有一個完全的組件開發(fā)包(CDK)來支持AJax4JSF. CDK 將包含代碼生成工具和一個使用類似JSP語法的模版工具.這些功能將去除一些創(chuàng)建組件的一個例行工作.使用這個喝滿油的組件工廠機器來創(chuàng)建一個帶有 Ajax功能的富組件將比使用傳統(tǒng)的編碼過程創(chuàng)建一個簡單的組件還要簡單.
項目的Java類與資源包. 除了核心的 AJAX 功能外, Ajax4jsf 也有管理資源的高級支持,例如:圖片,JS代碼和CSS樣式表單,資源框架使 簡單的打包這些資源到你自定義組件的Jar文件中成為可能.
動態(tài)(on-the-fly)將非常容易. 作為另外一種附加的功能, 資源框架有一個動態(tài)產(chǎn)生圖片的工具. 使用這個特性,你可以使用類似于使用Java Graphic2D庫的方法來創(chuàng)建圖片.
使用基于皮膚的技術(shù)來創(chuàng)建一個現(xiàn)代富用戶界面的外觀感覺(look-and-feel). Ajax4jsf 提供一個換膚特性 . 該特性允許通過命名的皮膚參數(shù)來簡單的定義和管理不同顏色模式與其他UI特性. 你可以從JSP代碼和Java代碼(例如:基于UI的文本來產(chǎn)生動態(tài)的圖片)來訪問這些皮膚參數(shù) . 注意:, 雖然換膚功能不是完全的替代傳統(tǒng)的CSS,但是它還是值得稱贊的.
測試components, actions, listeners, 和 pages 就像你在創(chuàng)建他們一樣容易. 一個制動測試工具正在開發(fā)中 .它將在你開發(fā)組件使為你的組件產(chǎn)生測試案例. 該測試框架不僅僅測試組件,也測試服務(wù)端和客戶端的功能包括JS代碼 .作為附加的有用工具,你不需要單獨的部署測試程序到Servlet容器中 就可以做到這些了.
Ajax4JSF 組件已經(jīng)可以使用了, 因此開發(fā)者可以立即使用這種省時的具有高級特性的工具來創(chuàng)建提供了更快更可靠的用戶體驗的Web程序了.
Table of Contents
要使用Ajax4JSF 框架你僅僅需要JDK1.4或者更高,任何JSF實現(xiàn),和你最喜歡的Servlet容器.在下一章我們將給你提供詳細的環(huán)境信息.
Ajax4jsf 被設(shè)計為一個容易使用的框架.僅僅有一點簡單的設(shè)置步驟就可以在你的JSF程序中使用Ajax功能了.
最新的Ajax4jsf 發(fā)布版在這里 https://ajax4jsf.dev.java.net/nonav/ajax/ajax-jsf/download.html 下載.
-
解壓 ajax4jsf.zip 文件.
-
復制 ajax4jsf.jar and oscache-2.2.jar 到程序的 WEB-INF/lib 文件夾下.
-
把下面的內(nèi)容添加到你的程序的 WEB-INF/web.xml 文件中:
<filter>
<display-name>Ajax4jsf Filter</display-name>
<filter-name>ajax4jsf</filter-name>
<filter-class>org.ajax4jsf.Filter</filter-class>
</filter>
<filter-mapping>
<filter-name>ajax4jsf</filter-name>
<servlet-name>Faces Servlet</servlet-name>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
注意. 你可以復制和粘貼上面的內(nèi)容在 README.txt 文件中.
-
添加下面的內(nèi)容:
<%@ taglib uri="https://ajax4jsf.dev.java.net/ajax" prefix="a4j"%>
到你每個使用Ajax功能的JSP頁面中.
讓我們來看一個簡單的JSF項目. 我們僅僅需要一個JSP頁面,里面包含一個Form和一些JSF標簽: <h:inputText> 和 <h:outputText>.
我們這個簡單的程序應(yīng)該可以讓我們輸入一些文字到<h:inputText>中, 然后發(fā)送數(shù)據(jù)到Server,并在 <h:outputText>中顯示Server的響應(yīng)(給我們一個Echo信息).
下面是一個我們需要的頁面代碼 (echo.jsp) :
<%@ taglib uri="https://ajax4jsf.dev.java.net/ajax" prefix="a4j"%>
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h"%>
<%@ taglib uri="http://java.sun.com/jsf/core" prefix="f"%>
<html>
<head>
<title>repeater </title>
</head>
<body>
<f:view>
<h:form>
<h:inputText size="50" value="#{bean.text}" >
<a4j:support event="onkeyup" reRender="rep"/>
</h:inputText>
<h:outputText value="#{bean.text}" id="rep"/>
</h:form>
</f:view>
</body>
</html>
就如你看到的,唯一一行于常給JSF頁面代碼不同的就是下面的一行
<a4j:support event="onkeyup" reRender="rep"/>
在這里我們在父標簽(<h:inputText>)中添加了一個AJAX 支持. 該支持綁定了JavaScript事件“onkeyup” .因此, 每一次該事件發(fā)布給父標簽時,我們的程序?qū)l(fā)送一個AJAX請求到Server.這意味著我們的受管理的bean將包含該“text” 域中我們輸入的最新數(shù)據(jù).
<a4j:support> 標簽的“reRender” 屬性(attribute)定義我們的頁面的哪一部分被更新. 在這里,該頁面唯一被更新的部位是 <h:outputText> 標簽,因為他的ID值和“reRender” 的屬性值向匹配. 在一個頁面中更新多個元素(elements)也是很簡單的:僅僅把他們的IDs放在 “reRender” 屬性中就可以了.
當然了,為了運行這個程序我們還需要一個受管理的bean
package demo;
public class Bean {
private String text;
public Bean() {
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
}
下一步, 我們需要在faces-config.xml 中注冊上面的bean:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN"
"http://java.sun.com/dtd/web-facesconfig_1_1.dtd">
<faces-config>
<managed-bean>
<managed-bean-name>bean</managed-bean-name>
<managed-bean-class>demo.Bean</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
<managed-property>
<property-name>text</property-name>
<value/>
</managed-property>
</managed-bean>
</faces-config>
注意:這里沒有任何東西直接和Ajax4jsf 有關(guān)聯(lián).
最后,不要忘了添加jar文件和更改 web.xml 文件:
<?xml version="1.0"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>a4jEchoText</display-name>
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>server</param-value>
</context-param>
<filter>
<display-name>Ajax4jsf Filter</display-name>
<filter-name>ajax4jsf</filter-name>
<filter-class>org.ajax4jsf.Filter</filter-class>
</filter>
<filter-mapping>
<filter-name>ajax4jsf</filter-name>
<servlet-name>Faces Servlet</servlet-name>
<dispatcher>REQUEST</dispatcher>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
</filter-mapping>
<listener>
<listener-class>
com.sun.faces.config.ConfigureListener
</listener-class>
</listener>
<!-- Faces Servlet -->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>
javax.faces.webapp.FacesServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Faces Servlet Mapping -->
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
</web-app>
就這樣了, 現(xiàn)在你的程序應(yīng)該可以工作了.
Table of Contents
該框架被實現(xiàn)為使用一個組件庫來添加ajax功能到你的頁面中,而不要寫js代碼或者使用新的Ajax裝飾器替換你已經(jīng)做好的JSF組件. Ajax4jsf 具有頁面范圍(page-wide)的Ajax支持,而不是傳統(tǒng)的組件范圍(component-wide)的ajax支持. 這意味著你可以在頁面中定義一個激活Ajax請求的事件,和當根據(jù)客戶端事件觸發(fā)Ajax請求來改變服務(wù)器端數(shù)據(jù)后 如何使用JSF組件樹來同步顯示JSF頁面. (This means you can define the event on the page that invokes an AJAX request and the areas of the page that should be synchronized with the JSF Component Tree after the AJAX request changes the data on the server according to the events fired on the client).
下面的圖片展示了它是如何工作的:
Ajax4jsf 允許你定義(意味著通過JSF tags)你希望通過AJAX請求更新的JSF頁面的不同部分并且提供的一些發(fā)送AJAX請求到服務(wù)器端的選項,除了你的JSF頁面于常規(guī)的JSF有點不 同外,沒有其他的不同了,這是一個你不需要寫JS代碼和XMLHttpRequest對象的天堂.
下面的圖片展示了Ajax4jsf 框架的一些重要的元素
Ajax 過濾器(Filter). 為了得到應(yīng)用 Ajax4jsf 的好處 你必須在在 web.xml 文件中注冊一個Ajax Filter.該過濾器有一些職責. Ajax Filter 可以識別多種ajax請求種類. 圖片3的序列圖展示了在處理常規(guī)頁面和AJAX請求頁面的不同之處.在開始的情況下,所有的JSF樹將被編碼(encoded). 在第二種情況下依據(jù)AJAX 區(qū)域(region) (你可以通過使用<a4j:region> tag來定義AJAX region )的大小(size). 就如你看到的,第二種情況下 過濾器將解析AJAX響應(yīng)的內(nèi)容,在它被發(fā)送到客戶端以前, 查看下面的圖片來理解這兩種方式:
在這兩種情況下, 你的程序所需要的靜態(tài)或者動態(tài)資源的信息將被注冊到ResourseBuilder 類中.當請求一個資源時(圖片4),AJAX filter 檢查資源緩存(Resource Cache)看看這個資源是否存在,如果存在該資源將被送到客戶端.否則過濾器將在ResourceBuilder中搜索注冊的資源. 如果該資源被注冊了,AJAX filter將發(fā)送一個請求到 ResourceBuilder來創(chuàng)建[create (deliver)]該資源.下面的圖片顯示了請求資源的處理過程.
Ajax動作組件(Action Components). 有3個Ajax動作組件: AjaxCommandButton, AjaxCommandLink 和 AjaxSupport. 你可以使用他們從客戶端發(fā)送AJAX請求.
Ajax容器 (Containers). AjaxContainer 是一個接口,該接口描述了在Ajax請求中應(yīng)該被解碼(decoded)的JSF頁面中的一個區(qū)域.AjaxViewRoot 和 AjaxRegion 實現(xiàn)了該接口.
JavaScript引擎 (Engine). Ajax4jsf JavaScript 引擎 在客戶端運行. 它知道如何根據(jù)來自于Ajax響應(yīng)的信息來更新你JSF頁面上的不同的區(qū)域. 程序開發(fā)者不需要直接使用這里的JavaScript代碼.它自動的下載到客戶端.
從JSF頁面發(fā)送ajax請求有不同的方法. 你可以使用 <a4j:commandButton>, <a4j:commandLink> 或者 <a4j:support> tags.
所有的這些標簽隱藏了在創(chuàng)建一個XMHttpRequest 對象和發(fā)送ajax請求所需要的JavaScript 活動.并且, 他們允許你選擇頁面中那個JSF組件被重新渲染(re-rendered) 來表現(xiàn)Ajax響應(yīng)的結(jié)果 (你可以列出他們的 IDs 在“reRender” 屬性中).
<a4j:commandButton> 和 <a4j:commandLink> tags 用來在 “onclick” JavaScript 事件中發(fā)送Ajax請求.
在你選擇JS事件(“onkeyup”, “onmouseover”, etc)時, <a4j:support> tag 允許你在普通的JSF組件中添加Ajax 功能和發(fā)送ajax請求.
提供Ajax請求功能的大部分重要的屬性如下:
-
reRender 屬性 - 就如我們前面提到過的,在一個Ajax響應(yīng)到來時重新渲染(reRendered)組件.
-
RequestDelay 屬性 – 用來調(diào)節(jié)請求的頻率.
<h:inputText size="50" value="#{bean.text}">
<a4j:support event="onkeyup" RequestDelay=”3”/>
</h:inputText>
因此每一個來自于鍵盤事件的請求將會延遲3 ms ,來減少請求的次數(shù).
-
EventsQueue – 儲存下一個請求的隊列的名字. 隊列幫助阻止下一個請求知道當前的處理完.
-
LimitToList 用來控制更新的區(qū)域. 設(shè)置為true – 將更新僅在reRender list中的區(qū)域, 如果為false,將更新所有Output Panels區(qū)域.
-
ajaxSingle 如果設(shè)置為false用來指定發(fā)送請求的區(qū)域 – 如果為true則發(fā)送整個區(qū)域 - only control caused event.(attributes specify regions to be sent with request if false – it’ll be full region in other case - only control caused event.)
你可能描述了一個你決定發(fā)送到服務(wù)器的頁面區(qū)域.當你發(fā)送ajax請求的時候,通過這種方式你可以控制JSF View的那個部分在服務(wù)器端被解碼(decoded).
描述你JSF頁面上的一個Ajax區(qū)域的最容易的方法是什么都不做.這是因為在<f:view> 和 </f:view> tags 中的內(nèi)容在默認值的情況下認為是ajax區(qū)域.
通過使用<a4j:region> tag你可以在一個JSF頁面中定義多個Ajax區(qū)域 (they can even be nested).
如果你希望渲染ajax響應(yīng)以外的區(qū)域,那么renderRegionOnly屬性值應(yīng)該設(shè)置為false.否則ajax更新被限制在活動區(qū)域的元素中.
在大部分情況下都可以使用 “reRender”中的ids來定義需要更新的 “AJAX zones”.
但是如果你的頁面包含<f:verbatim/> tag(你希望在ajax響應(yīng)中更新它的內(nèi)容)你不可以使用這種方式.
我們在上面描述的<f:verbatim/> tag 的問題涉及到JSF組件的transientFlag值. 如果該標記的值為true,這個組件不能參與保存和恢復組件樹(saving or restoring)的處理過程.
為了提供一種解決這個問題的方法, Ajax4jsf 利用<a4j:outputPanel> tag定義了一個output panel . 如果你把<f:verbatim/> tag放在output panel中, 那么在AJAX 響應(yīng)中 <f:verbatim/> tag和其他panel中的child tags中的內(nèi)容可以被更新 .有兩種方法來控制它:
-
設(shè)置“ajaxRendered” 屬性值為true.
-
設(shè)置動作組件的“reRender” 屬性值為output panel的 ID.
Table of Contents
和 ActionListener或者ValueChangeListener的工作方式一樣, 只是僅用于AJAX容器. 添加一個指定的類作為AjaxEvent的監(jiān)聽器. (sent in case of an AJAX request for this container).
<a4j:region selfRendered="true" ajaxListener="#{bean.processAjax}" id="Region">
…
</a4j:region>
當來自于Region的AJAX request觸發(fā)時,將調(diào)用bean的'processAjax'方法.
該標簽定義在AJax請求處理過程中被發(fā)送到服務(wù)器端解碼的部分JSF組件樹.
Table 4.2. a4j:region 的屬性
selfRendered | 如果為true,在調(diào)用應(yīng)用程序(InvokeApplication )階段自渲染子樹(如果immediate 屬性設(shè)置為true則是 Decode) |
renderRegionOnly | 標記,用來決定活動區(qū)域外的內(nèi)容在Ajax響應(yīng)中是否渲染.如果為"true" , 在AJAX response過程中活動區(qū)域外的組件都不渲染. 如果為"false", 將渲染包含在響應(yīng)中的所有組件樹.默認值為"true" |
rendered | 如果為 false, 該組件將不被重新渲染. |
id | 每個組件都應(yīng)該有個唯一的id. 如果沒有指定的話,將會自動產(chǎn)生. |
immediate | 如果該組件被Ajax請求激活的話,標記該組件應(yīng)該立即(在應(yīng)用請求值階段)被感興趣的監(jiān)聽器和動作處理,而不是等到調(diào)用應(yīng)用程序階段.(譯者注:該標記和JSF中的immediate標記所代表的意思差不多,跳過驗證階段到呈現(xiàn)響應(yīng)階段) |
binding | 組件綁定 |
ajaxListener | 方法綁定,當該組件被ajax請求激活時,將調(diào)用該監(jiān)聽器方法處理該事件.該方法必須為public的并且接受一個 AjaxEvent 參數(shù),返回void. |
<a4j:region>
<!--Some content-->
<a4j:region>
如果在該組件的區(qū)域中有一個Ajax請求調(diào)用了 – 該區(qū)域?qū)⒏鶕?jù)Ajax的設(shè)置被框架處理.
該組件呈現(xiàn)一個完全的HTML頁面結(jié)構(gòu).它必須是view root (JSP <f:view> tag)的第一個(并且是僅有的一個)子組件. 沒有Html代碼可以在該組件的外面. 它也支持在Ajax請求中處理子組件,就和<a4j:region>一樣.對于一個普通的請求,它將把結(jié)果呈現(xiàn)為在客戶端頁面< head>元素中的<script>元素.如果該組件包含一個"head" facet, 該facet的內(nèi)容也呈現(xiàn)在<head>中.對于一個Ajax請求,在整個結(jié)構(gòu)中僅僅涉及到的組件被呈現(xiàn).下面是個在JSP (jspx version)中使用它的例子:
<jsp:root xmlns:....
<f:view>
<a4j:page>
<f:facet name="head">
...
</f:facet>
<!-- page content here -->
</a4j:page>
</f:view>
</jsp:root>
Table 4.3. a4j:page attributes
selfRendered | 如果為true,在調(diào)用應(yīng)用程序(InvokeApplication )階段自渲染子樹(如果immediate 屬性設(shè)置為true則是 Decode) |
lang | 用來描述在產(chǎn)生該組件的markup時用到的語言(產(chǎn)生該組件標記所使用的語言) |
title | 該組件產(chǎn)生的Markup的title屬性值 |
renderRegionOnly | renderRegionOnly |
onunload | 在頁面unload時執(zhí)行的JS代碼 |
rendered | 如果是 false, 該組件不會被呈現(xiàn). |
contentType | 設(shè)置響應(yīng)的自定義的mime內(nèi)容類型 |
dir | 文本方向 |
id | 每個組件都應(yīng)該有個唯一的id. 如果沒有指定的話,將會自動產(chǎn)生. |
styleClass | 和HTML class 屬性對應(yīng). |
immediate | 如果該組件被Ajax請求激活的話,標記該組件應(yīng)該立即(在應(yīng)用請求值階段)被感興趣的監(jiān)聽器和動作處理,而不是等到調(diào)用應(yīng)用程序階段.(譯者注:該標記和JSF中的immediate標記所代表的意思差不多,跳過驗證階段到呈現(xiàn)響應(yīng)階段) |
onload | 在頁面load時執(zhí)行的JS代碼 |
style | 在該組件被呈現(xiàn)時應(yīng)用的CSS style(s) |
pageTitle | 作為頁面 title的字符串 |
binding | 組件綁定. |
ajaxListener | 方法綁定,當該組件被ajax請求激活時,將調(diào)用該監(jiān)聽器方法處理該事件.該方法必須為public的并且接受一個 AjaxEvent 參數(shù),返回void. |
<a4j:page>
<f:facet name=”head”>
…
</f:facet>
…
<a4j:page>
上面的示例結(jié)構(gòu)將被呈現(xiàn)為:
<HTML>
<HEAD>
…
</HEAD>
<body >
…
</body>
</HTML>
在 UIComponent-based組件上添加ajax功能,使他們有JavaScript事件屬性. 在解碼期間:如果一個請求為Ajax-performed, 從ExternalContext 中的requestParameterMap屬性中得到Map,如果該Map中"clientId" key對應(yīng)的值非空,在組件上創(chuàng)建一個 javax.faces.event.ActionEvent, 并且傳遞該事件到該組件的queueEvent()中,然后把他的reReander區(qū)域中的組件id添加到reReander屬性中.在編碼過程中.不 編碼一個組件. 相反的,在父組件上添加一個與事件屬性的值相同的值綁定(Instead, it adds ValueBinding for a property of the parent component with the name as a value of its "event" property).結(jié)果,當呈現(xiàn)時,父組件創(chuàng)建一個在提交一個ajax請求時用到的JS代碼.如果該組件有子UIParameter組件,添加他的 name/value作為附加的請求參數(shù).如果父組件是一個UIInput的實例,并且ajaxType屬性是input, 則也提交input 域中的值. 在這種情況下,你可以在UIForm外面提交一個單一的input域. (As a result, when rendered, the parent component builds JavaScript code for submitting an AJAX request on this event. If the component has child UIParameter components, appends it's name/value as additional request parameters. If a parent component is an instance of UIInput and the ajaxType property is "input", submits the value of the input field, also. In this case, you can submit a single input field outside of UIForm.)
Table 4.4. a4j:support 屬性
actionListener | 方法綁定,當該組件被ajax請求激活時,將調(diào)用該監(jiān)聽器方法處理該事件.該方法必須為public的并且接受一個 AjaxEvent 參數(shù),返回void. |
parentProperties | parentProperties |
action | 方法綁定到要被激活的程序動作方法, 如果該 UIComponent 被用戶激活, 根據(jù)immediate屬性的值,方法在 請求處理生命周期中的Apply Request Values 或者 Invoke Application 階段 被調(diào)用. |
oncomplete | 在客戶端請求完成時調(diào)用的js代碼 |
rendered | 如果為false,該組件將不會被顯示. |
status | Request status 組件的id(在 UIComopnent.findComponent()中使用) |
reRender | 該組件調(diào)用Ajax請求后重新渲染的組件的ID(在 UIComopnent.findComponent()中使用),可以使一個id,也可以使逗號分開的很多id,或者是數(shù)據(jù)or集合的EL表達式 |
targetId | reRender的別名 : 該組件調(diào)用Ajax請求后重新渲染的組件的ID(在 UIComopnent.findComponent()中使用),可以使一個id,也可以使逗號分開的很多id,或者是數(shù)據(jù)or集合的EL表達式 |
id | 每個組件都應(yīng)該有個唯一的id. 如果沒有指定的話,將會自動產(chǎn)生. |
disableDefault | 使目標事件的動作不可用 ( 在javascript代碼中添加 "return false;" ) |
requestDelay | 在JS事件上延遲 ( 單位 ms. )發(fā)送Ajax請求.與事件隊列公共工作可以減少鍵盤或者鼠標移動觸發(fā)請求的次數(shù) |
eventsQueue | 用來避免在同一個事件上的重復請求的隊列的名字.可以用來減少周期事件(如:按鍵,鼠標移動)請求的次數(shù). |
bypassUpdates | 如果使true,在處理驗證階段后跳過更新模型值階段到呈現(xiàn)階段.可以用來驗證組件的輸入值. |
immediate | 如果該組件被Ajax請求激活的話,標記該組件應(yīng)該立即(在應(yīng)用請求值階段)被感興趣的監(jiān)聽器和動作處理,而不是等到調(diào)用應(yīng)用程序階段.(譯者注:該標記和JSF中的immediate標記所代表的意思差不多,跳過驗證階段到呈現(xiàn)響應(yīng)階段) |
limitToList | 如果為true,僅僅更新'reRender'屬性中指定的組件,否則(默認值)更新所有Ajax Region中的組件 |
ajaxSingle | 如果為 true , 僅僅提交一個field/link,而不是整個form中的內(nèi)容. |
event | 父組件的JS事件屬性的名稱 ( onclick , onchange, etc. ) , for which we will build AJAX submission code. |
binding | 組件綁定. |
所有你需要指定的東西 - 父組件用來觸發(fā)ajax請求的事件和被reRender的區(qū)域, 和處理事件的Java bean方法.
<a4j:region selfRendered="true">
…
<h:selectBooleanCheckbox value="#{pizza.tip}">
<a4j:support event="change" reRender="#{partsId.list}"
action="#{Some.show_hide}"/>
</h:selectBooleanCheckbox>
…
</a4j:region>
因此,在上面的例子中,checkbox狀態(tài)的改變將提交當前的區(qū)域. 'show_hide'動作將被調(diào)用,并且 'list'中的id所指定的組件將被更新.
呈現(xiàn)一個Html <a> 元素,當點擊時的動作就象一個form提交一樣.
在解碼的過程中:
從ExternalContext的屬性requestParameterMap中得到一個Map,如果該Map中包含"clientId" key的非空值, 在組件上創(chuàng)建一個 javax.faces.event.ActionEvent 事件,并且傳遞該事件給組件的queueEvent() 方法.如果該請求是Ajax-performed,把reRander屬性中的IDs值添加到嵌套的AjaxContainer的 rendered areas list中 ,在解碼的過程中也添加組件的參數(shù)(PARAM_NAME 和 PARAM_VALUE 是任何嵌套的子UIParameter的names 和 values .) names 和 values必須是被URLEncoded處理過的.如果styleClass屬性被指定了,呈現(xiàn)它的值為html中的class屬性的值. 呈現(xiàn)任何non-UIParameter子組件為<a>的相應(yīng)的子組件. 這些看起來就像一個Link文本.
Table 4.5. a4j:commandLink attributes
actionListener | 方法綁定,當該組件被ajax請求激活時,將調(diào)用該監(jiān)聽器方法處理該事件.該方法必須為public的并且接受一個 AjaxEvent 參數(shù),返回void. |
title | 該組件產(chǎn)生的標記元素的提示文字(當鼠標移動到該組件上面出現(xiàn)的提示文字) |
oncomplete | 在客戶端請求完成時調(diào)用的js代碼 |
shape | default|rect|circle|poly [CI] 該屬性指定一個區(qū)域的形狀.可能的取值: * default: 指定整個區(qū)域. * rect:指定一個矩形區(qū)域. * circle: 定義一個圓形區(qū)域. * poly: 定義一個多邊形區(qū)域. |
target | |
rendered | 如果為false,該組件將不會被顯示. |
charset | 該屬性指定了通過鏈接指派的資源的字符編碼. |
reRender | 該組件調(diào)用Ajax請求后重新渲染的組件的ID(在 UIComopnent.findComponent()中使用),可以使一個id,也可以使逗號分開的很多id,或者是數(shù)據(jù)or集合的EL表達式 |
targetId | Alias for reRender : 該組件調(diào)用Ajax請求后重新渲染的組件的ID(在 UIComopnent.findComponent()中使用),可以使一個id,也可以使逗號分開的很多id,或者是數(shù)據(jù)or集合的EL表達式 |
id | 每個組件都應(yīng)該有個唯一的id. 如果沒有指定的話,將會自動產(chǎn)生. |
dir | 文本方向. |
rev | 該屬性用來描述從通過 href 屬性指定的錨點到當前文檔的反向鏈接。該屬性值是通過空格分隔的 link 類型(值)的列表。 |
bypassUpdates | 如果使true,在處理驗證階段后跳過更新模型值階段到呈現(xiàn)階段.可以用來驗證組件的輸入值. |
styleClass | 和HTML的class屬性一樣. |
accesskey | 觸發(fā)該組件的快捷鍵 |
limitToList | 如果為true,僅僅更新'reRender'屬性中指定的組件,否則(默認值)更新所有Ajax Region中的組件 |
onkeypress | 鍵盤事件,鍵被按下和松開 |
ajaxSingle | 如果使true,僅僅提交一個field/link,而不是所有被控制的 |
ondblclick | HTML: 雙擊事件 |
style | HTML: 應(yīng)用在該組件上的CSS. |
onblur | 當元素失去焦點時發(fā)生的事件 |
onmouseover | 當滑鼠移動到組件上方時 |
onkeyup | 當使用者按下并放開按鍵 |
value | 該組件的當前值 |
action | 方法綁定到要被激活的程序動作方法, 如果該 UIComponent 被用戶激活, 根據(jù)immediate屬性的值,方法在 請求處理生命周期中的Apply Request Values 或者 Invoke Application 階段 被調(diào)用. |
tabindex | 設(shè)置不同元素之間獲得焦點的順序 |
hreflang | 該屬性指定了通過 href 指派的資源的基本語言,并且僅在 href 被指定的情況下使用(也就是說如果 A 中沒有指定 href 屬性,就不應(yīng)該出現(xiàn) hreflang 屬性)。 |
type | 該屬性指定鏈接資源所采用的內(nèi)容類型。(譯者注:例如網(wǎng)頁通常為 text/html) |
lang | 產(chǎn)生該組件標記所使用的語言 |
onclick | 當鼠標點擊時發(fā)生的事件 |
status | 請求狀態(tài)組件的ID(在UIComopnent.findComponent()中使用) |
onmouseout | 鼠標光標移開元素時發(fā)生的事件 |
onkeydown | 鍵按下時發(fā)生的事件 |
onmousedown | 按下鼠標按鍵時發(fā)生的事件 |
requestDelay | 在JS事件上延遲 ( 單位 ms. )發(fā)送Ajax請求.與事件隊列公共工作可以減少鍵盤或者鼠標移動觸發(fā)請求的次數(shù) |
eventsQueue | 用來避免在同一個事件上的重復請求的隊列的名字.可以用來減少周期事件(如:按鍵,鼠標移動)請求的次數(shù). |
rel | 該屬性描述了從當前文檔到通過 href 屬性定義的錨點之間的關(guān)系。該屬性值是通過空格分隔的 link 類型(值)的列表(譯者注:在 Web 標準開發(fā)中,這個通常用來代替 target 屬性,配合腳本,用來表示目的窗口)。 |
immediate | 如果該組件被Ajax請求激活的話,標記該組件應(yīng)該立即(在應(yīng)用請求值階段)被感興趣的監(jiān)聽器和動作處理,而不是等到調(diào)用應(yīng)用程序階段.(譯者注:該標記和JSF中的immediate標記所代表的意思差不多,跳過驗證階段到呈現(xiàn)響應(yīng)階段) |
onfocus | 使用在表單元素中,當元素獲得焦點時發(fā)生的事件 |
onmouseup | 當釋放鼠標按鍵時發(fā)生的事件 |
binding | 組件綁定. |
onmousemove | 鼠標光標在元素上移動時發(fā)生的事件 |
coords | 定義區(qū)域 -- coords a.矩形:必須使用四個數(shù)字,前兩個數(shù)字為左上角座標,后兩個數(shù)字為右下角座標 例:<area shape=rect coords=100,50,200,75 href="URL"> b.圓形:必須使用三個數(shù)字,前兩個數(shù)字為圓心的座標,最后一個數(shù)字為半徑長度 例:<area shape=circle coords=85,155,30 href="URL"> c.任意圖形(多邊形):將圖形之每一轉(zhuǎn)折點座標依序填入 例:<area shape=poly coords=232,70,285,70,300,90,250,90,200,78 href="URL"> |
通常a4j:commandLink 是一個 具有AJAX 支持的HTML <input> 元素. 包含所有的a4j:support的主要功能, 還有它自己的onclick事件的Ajax請求和所有與a4j:Support組合的CommandLink特性.
呈現(xiàn)一個HTML "input" 元素.
在解碼的過程中:
從ExternalContext的屬性requestParameterMap中得到一個Map,如果該Map中包含"clientId" key的非空值, 在組件上創(chuàng)建一個 javax.faces.event.ActionEvent 事件,并且傳遞該事件給組件的queueEvent() 方法.如果該請求是Ajax-performed,把reRander屬性中的IDs值添加到嵌套的AjaxContainer的 rendered areas list中 .
在編碼的過程中:
為onclick事件創(chuàng)建一個AJAX.Submit JavaScript調(diào)用.呈現(xiàn)組件的clientId 為name屬性的值.呈現(xiàn)組件的當前值為value屬性的值.
如果styleClass屬性被指定了,呈現(xiàn)它的值為class屬性的值. 呈現(xiàn) HTML "input"元素的子元素.
Table 4.6. a4j:commandButton attributes
actionListener | 方法綁定,當該組件被ajax請求激活時,將調(diào)用該監(jiān)聽器方法處理該事件.該方法必須為public的并且接受一個 AjaxEvent 參數(shù),返回void. |
title | 該組件產(chǎn)生的標記元素的提示文字(當鼠標移動到該組件上面出現(xiàn)的提示文字) |
oncomplete | 在客戶端請求完成時調(diào)用的js代碼 |
rendered | 如果為false,該組件將不會被顯示. |
reRender | 該組件調(diào)用Ajax請求后重新渲染的組件的ID(在 UIComopnent.findComponent()中使用),可以使一個id,也可以使逗號分開的很多id,或者是數(shù)據(jù)or集合的EL表達式 |
targetId | Alias for reRender : 該組件調(diào)用Ajax請求后重新渲染的組件的ID(在 UIComopnent.findComponent()中使用),可以使一個id,也可以使逗號分開的很多id,或者是數(shù)據(jù)or集合的EL表達式 |
onchange | 使用在表單元素中,當某些東西改變時發(fā)生的事件 |
dir | 文本方向. |
id | 每個組件都應(yīng)該有個唯一的id. 如果沒有指定的話,將會自動產(chǎn)生. |
bypassUpdates | 如果使true,在處理驗證階段后跳過更新模型值階段到呈現(xiàn)階段.可以用來驗證組件的輸入值. |
styleClass | 和HTML的class屬性一樣. |
accesskey | 觸發(fā)該組件的快捷鍵 |
limitToList | 如果為true,僅僅更新'reRender'屬性中指定的組件,否則(默認值)更新所有Ajax Region中的組件 |
onkeypress | 鍵盤事件,鍵被按下和松開 |
ajaxSingle | 如果使true,僅僅提交一個field/link,而不是所有被控制的 |
ondblclick | HTML: 雙擊事件 |
image | 在 這個button中要顯示的圖片的絕對或者相對URL 如果指定了該 "input" 元素將為"image"類型. 否則, it will be of the type specified by the "type" property with a label specified by the "value" property. |
style | HTML: 應(yīng)用在該組件上的CSS. |
size | 定義組件顯示的尺度 |
onblur | 當失去焦點時發(fā)生的事件 |
onmouseover | 當滑鼠移動到組件上方時 |
value | 該組件的當前值 |
action | 方法綁定到要被激活的程序動作方法, 如果該 UIComponent 被用戶激活, 根據(jù)immediate屬性的值,方法在 請求處理生命周期中的Apply Request Values 或者 Invoke Application 階段 被調(diào)用. |
onkeyup | 當使用者按下并放開按鍵 |
tabindex | 設(shè)置不同元素之間獲得焦點的順序 |
lang | 產(chǎn)生該組件標記所使用的語言 |
type | submit|reset|image|button 指定創(chuàng)建組件的類型,默認值為Submit. |
disabled | 把控件的狀態(tài)設(shè)置為不能使用 |
onclick | 當鼠標點擊時發(fā)生的事件 |
status | 請求狀態(tài)組件的ID(在UIComopnent.findComponent()中使用) |
onmouseout | 鼠標光標移開元素時發(fā)生的事件 |
alt | 文本方向. |
onkeydown | 鍵按下時發(fā)生的事件 |
onmousedown | 按下鼠標按鍵時發(fā)生的事件 |
requestDelay | 在JS事件上延遲 ( 單位 ms. )發(fā)送Ajax請求.與事件隊列公共工作可以減少鍵盤或者鼠標移動觸發(fā)請求的次數(shù) |
eventsQueue | 用來避免在同一個事件上的重復請求的隊列的名字.可以用來減少周期事件(如:按鍵,鼠標移動)請求的次數(shù). |
immediate | 如果該組件被Ajax請求激活的話,標記該組件應(yīng)該立即(在應(yīng)用請求值階段)被感興趣的監(jiān)聽器和動作處理,而不是等到調(diào)用應(yīng)用程序階段.(譯者注:該標記和JSF中的immediate標記所代表的意思差不多,跳過驗證階段到呈現(xiàn)響應(yīng)階段) |
onfocus | 當組件獲得焦點時發(fā)生的事件 |
onmouseup | 當釋放鼠標按鍵時發(fā)生的事件 |
binding | 組件綁定. |
onmousemove | 鼠標光標在元素上移動時發(fā)生的事件 |
簡單來說a4j:CommandButton 是一個帶有AJAX Support的 HTML <input> 元素 . 包含所有的a4j:support的主要功能, 還有它自己的onclick事件的Ajax請求和所有與a4j:Support組合的CommandButton特性.
創(chuàng)建頁面中具有 AJAX-enabled的一個區(qū)域. 作為普通的請求,根據(jù)layout的屬性值("inline" or "block")呈現(xiàn)為 <span> 或者 <div> HTML 元素. ( "id"屬性將是clientId 屬性的值.) 對于一個AJAX請求,如果ajaxRendered被設(shè)置為true,該元素的內(nèi)容被包含在ajax響應(yīng)中.
Table 4.7. a4j:outputPanel attributes
styleClass | 和HTML的class屬性一樣. |
title | 該組件產(chǎn)生的標記元素的提示文字(當鼠標移動到該組件上面出現(xiàn)的提示文字) |
lang | 產(chǎn)生該組件標記所使用的語言 |
layout | HTML layout用于產(chǎn)生 markup. 可能的取值是: "block" 產(chǎn)生一個 HTML <div> 元素, "inline" 產(chǎn)生一個 HTML <span> 元素, 和 "none"不產(chǎn)生 HTML 元素. 對于none 當子元素的rendered屬性被設(shè)置為false時 這里有個小例外 ,這是創(chuàng)建一個具有相同id的空 <span> 元素 作為子元素,用來當作一個用于后序處理的占位符 |
keepTransient | 指 定所有子組件為non-transient的標記.如果為true,所有的子組件將被設(shè)置為non-transient,并且在以保存的組件樹中 (keep in saved components tree). For output in self-renderer region all content ( By default, all content in <f:verbatim> tags and non-jsf elements in facelets, marked as transient - since, self-rendered ajax regions don't plain output for ajax processing ). |
ajaxRendered | Defines, whether the content of this component must be (or not) included in AJAX response created by parent AJAX Container, even if it is not forced by reRender list of ajax action. Ignored if component marked to output by Ajax action. default false |
style | HTML: 應(yīng)用在該組件上的CSS. |
rendered | 如果為false,該組件將不會被顯示. |
binding | 組件綁定. |
dir | 文本方向. |
id | 每個組件都應(yīng)該有個唯一的id. 如果沒有指定的話,將會自動產(chǎn)生. |
<h:form>
<a4j:region>
<h:outputText value="Input your name" />
<a4j:outputPanel>
<h:message for="userName" style="color:red" />
</a4j:outputPanel>
<h:inputText id="un" value="#{nb.userName}" required="true"/>
<a4j:outputPanel id="test" layout="block">
<h:outputText value="#{nb.userName}" />
</a4j:outputPanel>
<a4j:commandButton value="submit"></a4j:commandLink>
</a4j:region>
</h:form>
在上面的例子中,在每個a4j:commandButton請求時 OutputPanels 中的 outputText 將被 reRendered. 當驗證錯誤時,消息將出現(xiàn);或者,text將重復出現(xiàn).
聯(lián)合兩個JSF tags的橋梁, <f:actionListener>; 和 <f:param>. 在呈現(xiàn)階段,像往常一樣被符組件 (<h:commandLink>; 或者 like) 解碼,在處理請求階段,如果父組件執(zhí)行一個動作事件, 更新"assignTo" 屬性的值為它的新值.如果一個轉(zhuǎn)換屬性被指定了,使用它來編碼和解碼該值 為保存在html 參數(shù)中的字符串.
Table 4.8. a4j:actionparam attributes
noEscape | 如 果設(shè)置為true,該值將不會被附上但引號 并且每一轉(zhuǎn)義字符. This allows the use of the value as JavaScript code for calculating value on the client-side. This doesn't work with non-AJAX components. |
value | 初始化的值或者值綁定 |
converter | 使用一個轉(zhuǎn)換(converter )的id 或者引用一個converter. |
assignTo | EL表達式用來更新bean的屬性. 如果父組件執(zhí)行一個 actionEvent,該值將被更新. |
binding | 組件綁定. |
name | 該參數(shù)的名字 |
id | 每個組件都應(yīng)該有個唯一的id. 如果沒有指定的話,將會自動產(chǎn)生. |
在客戶端呈現(xiàn)一個表現(xiàn)ajax請求狀態(tài)的標識.
在編碼過程中:
創(chuàng)建兩個帶有id的該組件的子(clientId )span元素,或者添加了":status.start" 和 ":status:stop" 字符串的 ajax區(qū)域的目標(使用for屬性來指定). "start" span 具有 "display:none" style (隱藏).在span里面,呈現(xiàn)startText/stopText屬性值或者如果"start" 和 "stop" facets存在的話,呈現(xiàn)facets的內(nèi)容. 在執(zhí)行一個ajax請求時, 客戶端的js代碼改變 "start" span 的可見屬性并且隱藏"stop". 當該指示器所指示的請求都完成時,恢復"stop" 并且隱藏"start" .start[style,styleClass] 和 stop[style,styleClass] 被呈現(xiàn)為 spans 的 style 和 class 屬性 .
During Encoding: Creates two "span" elements with id created as clientId of this component or of target AJAX region (pointed to by the "for" property) with appended ":status.start" and ":status:stop" strings. "start" span has "display:none" style (hidden). Inside this span, renders the value of the startText/stopText properties or, if they exist, the content of "start" and "stop" facets. On performing an AJAX request, the client-side script changes the visibility of the "start" span and hides "stop". After all requests for this indicator are completed, restores "stop" and hide "start" start[style,styleClass] and stop[style,styleClass] are rendered for spans as style and class atributes, respectivetly.
在解碼的過程中:
....
Creates two "span" or "div"(depending on 'layout' attribute) elements with id created as clientId of this component or of target AJAX region (pointed to by the "for" property) with appended ":status.start" and ":status:stop" strings. "start" element has "display:none" style (hidden). Inside this element, renders the value of the startText/stopText properties or, if they exist, the content of "start" and "stop" facets. On performing an AJAX request, the client-side script changes the visibility of the "start" element and hides "stop". After all requests for this indicator are completed, restores "stop" and hide "start" start[style,styleClass] and stop[style,styleClass] are rendered for spans as style and class atributes, respectivetly.
Table 4.9. a4j:status attributes
startStyleClass | 在開始一個請求時應(yīng)用到組件上的CSS類 |
stopStyle | 在 一個請求響應(yīng)完成時應(yīng)用到組件上的CSS |
stopStyleClass | 在 一個請求響應(yīng)完成時應(yīng)用到組件上的CSS類 |
layout | 定義面板的布局,可以為block或者inline |
title | 該組件產(chǎn)生的標記元素的提示文字(當鼠標移動到該組件上面出現(xiàn)的提示文字) |
rendered | 如果為false,該組件將不會被顯示. |
id | 每個組件都應(yīng)該有個唯一的id. 如果沒有指定的話,將會自動產(chǎn)生. |
dir | 文本方向. |
styleClass | 和HTML的class屬性一樣. |
startStyle | 在開始一個請求時應(yīng)用到組件上的CSS類 |
onkeypress | 鍵盤事件,鍵被按下和松開 |
ondblclick | HTML: 雙擊事件 |
style | HTML: 應(yīng)用在該組件上的CSS. |
onmouseover | 當滑鼠移動到組件上方時 |
for | 指定應(yīng)用于 AjaxContainer組件的ID ( 在javax.faces.UIComopnent.findComponent() 中使用). |
onkeyup | 當使用者按下并放開按鍵 |
lang | 產(chǎn)生該組件標記所使用的語言 |
onclick | 當鼠標點擊時發(fā)生的事件 |
onmouseout | 鼠標光標移開元素時發(fā)生的事件 |
startText | 在請求開始時顯示的文本 |
onkeydown | 鍵按下時發(fā)生的事件 |
onmousedown | 按下鼠標按鍵時發(fā)生的事件 |
forceId | 如果為true,呈現(xiàn)組件id為HTML代碼而不是JSF產(chǎn)生的代碼.(譯者注:參考Myfaces中的ForceId.) |
stopText | 當請求完成時顯示的文本 |
onmouseup | 當釋放鼠標按鍵時發(fā)生的事件 |
binding | 組件綁定. |
onmousemove | 鼠標光標在元素上移動時發(fā)生的事件 |
指示請求狀態(tài)的兩種表示方式:
-
定義 "startText" 和 "stopText" 屬性
<a4j:status startText="Performing Request"
stopText="Request Done"
for="stat1"/>
-
定義 "start" 和 "stop" facets
<a4j:status for="stat2">
<f:facet name="start">
<h:graphicImage value="/images/ajax_process.gif" />
</f:facet>
<f:facet name="stop">
<h:graphicImage value="/images/ajax_stoped.gif" />
</f:facet>
</a4j:status>
在任何一種狀態(tài)下,當請求開始時 - ":status.start" span 將被呈現(xiàn) 并且在請求結(jié)束后":status.stop" span 將出現(xiàn).
將狀態(tài)應(yīng)用到組件上也有兩種方法:
-
指定目標 AJAX Containers 的id為“for” 屬性的值
-
在組件上定義 “status” 屬性 指定到狀態(tài).
如果for省略了 - 狀態(tài)組件將指向它所在的區(qū)域(status component will be pointed to region where it's placed )
加載一個本地化當前view的資源包,并且暴露它(作為一個Map)為當前請求的請求參數(shù). In difference of original f:loadBundle tag, stored in components tree and activate on ajax/non ajax responses
Table 4.10. a4j:loadBundle attributes
var | 在請求范圍中使用的變量 |
basename | 資源文件的basename |
rendered | 如果為false,該組件將不會被顯示. |
binding | 組件綁定. |
id | 每個組件都應(yīng)該有個唯一的id. 如果沒有指定的話,將會自動產(chǎn)生. |
用用戶指定的資源( images, sounds, video, active objects, applets ...)來創(chuàng)建任何連接元素類型的類.在CreateContent屬性中指定的方法將把從DataBean中指定的值傳遞給OutputStream.重要: 在value中指定的數(shù)據(jù)bean必須實現(xiàn)Serializable接口.
Table 4.11. a4j:mediaOutput attributes
declare | declare but don't instantiate flag |
dir | 文本方向. |
id | 每個組件都應(yīng)該有個唯一的id. 如果沒有指定的話,將會自動產(chǎn)生. |
rev | 該屬性用來描述從通過 href 屬性指定的錨點到當前文檔的反向鏈接。該屬性值是通過空格分隔的 link 類型(值)的列表。 |
mimeType | 應(yīng)用于響應(yīng)頭的mime類型( 'image/jpeg' etc ) |
style | HTML: 應(yīng)用在該組件上的CSS. |
onmouseover | 當滑鼠移動到組件上方時 |
onkeyup | 當使用者按下并放開按鍵 |
tabindex | 設(shè)置不同元素之間獲得焦點的順序 |
archive | 空格分開的URIs |
converter | converter |
lang | 產(chǎn)生該組件標記所使用的語言 |
createContent | 方法調(diào)用表達式用來傳遞資源到 OutputStream. 必須有兩個參數(shù) java.io.OutputStream 和 java.lang.Object ( deserialized value of data attribute ) |
onmouseout | 鼠標光標移開元素時發(fā)生的事件 |
element | 連接資源的html元素的名字-可能是 <a> <img> <object> <applet> <script> or <link> |
rel | 該屬性描述了從當前文檔到通過 href 屬性定義的錨點之間的關(guān)系。該屬性值是通過空格分隔的 link 類型(值)的列表(譯者注:在 Web 標準開發(fā)中,這個通常用來代替 target 屬性,配合腳本,用來表示目的窗口)。 |
onmouseup | 當釋放鼠標按鍵時發(fā)生的事件 |
cacheable | cacheable |
binding | 組件綁定. |
onmousemove | 鼠標光標在元素上移動時發(fā)生的事件 |
expires | expires |
coords | 定義區(qū)域 -- coords a.矩形:必須使用四個數(shù)字,前兩個數(shù)字為左上角座標,后兩個數(shù)字為右下角座標 例:<area shape=rect coords=100,50,200,75 href="URL"> b.圓形:必須使用三個數(shù)字,前兩個數(shù)字為圓心的座標,最后一個數(shù)字為半徑長度 例:<area shape=circle coords=85,155,30 href="URL"> c.任意圖形(多邊形):將圖形之每一轉(zhuǎn)折點座標依序填入 例:<area shape=poly coords=232,70,285,70,300,90,250,90,200,78 href="URL"> |
title | 該組件產(chǎn)生的標記元素的提示文字(當鼠標移動到該組件上面出現(xiàn)的提示文字) |
shape | default|rect|circle|poly [CI] 該屬性指定一個區(qū)域的形狀.可能的取值: * default: 指定整個區(qū)域. * rect:指定一個矩形區(qū)域. * circle: 定義一個圓形區(qū)域. * poly: 定義一個多邊形區(qū)域. |
target | |
session | session |
charset | 該屬性指定了通過鏈接指派的資源的字符編碼. |
rendered | 如果為false,該組件將不會被顯示. |
codetype | 代碼的內(nèi)容類型 |
classid | 指定一個實現(xiàn) |
styleClass | 和HTML的class屬性一樣. |
accesskey | 觸發(fā)該組件的快捷鍵 |
onkeypress | 鍵盤事件,鍵被按下和松開 |
ondblclick | HTML: 雙擊事件 |
align | bottom|middle|top|left|right 只用元素的對齊方式.不建議使用. |
vspace | 不建議使用 |
standby | 當載入時顯示的文字 |
lastModified | lastModified |
border | 不建議使用. |
onblur | 當元素失去焦點時發(fā)生的事件 |
value | 在程序時候計算的值,并且保存在URI中(也是cache Key的一部分 ), 在產(chǎn)生是傳遞到send method. 可以用來更新緩存的值.重要的: 既然序列化的數(shù)據(jù)保存在URI中,避免使用大的對象 |
hreflang | |
codebase | 用于 classid, data, archive的base URI |
type | 該屬性指定鏈接資源所采用的內(nèi)容類型。(譯者注:例如網(wǎng)頁通常為 text/html) |
uriAttribute | 資源連接屬性的名字. ( 'href' for <a>, 'src' for <img> or <script>, etc |
onclick | 當鼠標點擊時發(fā)生的事件 |
onkeydown | 鍵按下時發(fā)生的事件 |
onmousedown | 按下鼠標按鍵時發(fā)生的事件 |
hspace | 不建議使用了, |
onfocus | 使用在表單元素中,當元素獲得焦點時發(fā)生的事件 |
在 our Examples page.上有個創(chuàng)建圖片的示例. 就像我們前面提到的一樣,任何實現(xiàn)了 Serializable的 Bean 都可以是createContent方法的數(shù)據(jù)提供者.
Ajax4jsf 提供了一種在UI設(shè)計中很容易使用的換皮膚功能.使用這個框架,你可以很容易的在資源文件中使用命名皮膚參數(shù)來控制程序的顯示外觀.這里有個例子,提供了幾種皮膚:
http://livedemo.exadel.com/vcpDemo/ |
使用Ajax4jsf 框架的skinability 服務(wù),你可以很容易的控制程序的look-and-feel. 在Ajax4jsf的幫助下,使用skinability 服務(wù),你可以在標準的JSF組件和自定義的JSF組件中定義相同的風格 .
為了使用skinability 功能,請按照下面的步驟來:
-
創(chuàng)建一個自定義的render kit并且在faces-config.xml 中注冊它:
<render-kit>
<render-kit-id>NEW_SKIN</render-kit-id>
<render-kit-class>
org.ajax4jsf.framework.renderer.ChameleonRenderKitImpl
</render-kit-class>
</render-kit>
-
然 后,我們需要為已經(jīng)定義好的組件皮膚 創(chuàng)建和注冊自定義renderers (Then we need to create and register custom renderers for the component skins based on the look-and-feel predefined variables that have been defined for the render-kit):
<renderer>
<component-family>javax.faces.Command</component-family>
<renderer-type>javax.faces.Link</renderer-type>
<renderer-class>
newskin.HtmlCommandLinkRenderer
</renderer-class>
</renderer>
-
最后,我們需要放置一個保存皮膚參數(shù)的屬性文件在類路徑根目錄下面.該屬性文件有兩個要求:
-
文件名必須是
― 在上面的例子中 將是<name of renderer class>
.skin.propertiesnewskin.skin.properties
. -
文件的第一行應(yīng)該是
render.kit=
― 在上面的例子中 將是<render-kit-id>
render.kit=NEW_SKIN
.
-
關(guān)于創(chuàng)建自定義 renderers 的更多的信息可以在下面的連接中找到:
http://java.sun.com/javaee/javaserverfaces/reference/docs/index.html |
Table of Contents
下面是你使用 Ajax4jsf的技術(shù)條件.
-
Java
-
JavaServer Faces
-
Java application server or servlet container
-
Browser (on client side)
(注意: Ajax4JSF 也和 Facelets JSF 組件兼容.)
-
Sun JSF 1.1RI
-
JSF 1.2
-
MyFaces 1.1.1 - 1.1.3
-
Apache Tomcat 4.1 - 5.5
-
IBM Web Sphere 5.1 - 6
-
BEA Web Logic 8.1 - 9
-
Oracle AS / OC4J 10.1.3
-
Resin 3.0
-
Jetty 5.1.X
-
Sun Application Server 8 (J2EE 1.4)
-
Glassfish (J2EE 5)
-
JBoss 3.2 - 4.0
Table of Contents
Ajax4jsf支持JSF中的所有組件和標簽.在一個已經(jīng)存在的JSF項目中添加Ajax4jsf支持,你必須把Ajax4jsf 庫放在項目的lib目錄下,并且在web.xml文件中添加過濾器mapping.如果僅僅添加Ajax4JSF功能 則已經(jīng)存在的項目的行為將不會改變.
這些參數(shù)幫助開發(fā)和提高Ajax4JSF的擴展性.
Table 7.1. 初始化參數(shù)
Name | Default | Description |
---|---|---|
org.ajax4jsf.LOGFILE | none | 指向程序或者容器的日志文件的URL( 如果可能的話).如果該參數(shù)被設(shè)置了,給定的URL的內(nèi)容將出現(xiàn)在Debug錯誤頁面的iframe 中 |
org.ajax4jsf.VIEW_HANDLERS | none | 逗 號隔開的自定義ViewHandler 實例的列表.handlers 將按照順序插入在ajax4jsf viewhandlers 的前面.例如,在 facelets中該參數(shù)必須包含 com.sun.facelets.FaceletViewHandler , 代替在faces-config.xml中聲明 |
org.ajax4jsf.CONTROL_COMPONENTS | none | 逗 號分開的用于特殊控制的組件名字 - 例如資源綁定loader , MyFaces alias bean components 等等.通過反射從靜態(tài)的 COMPONENT_TYPE域中得到組件的類型. For components with such types encode methods always will be called in rendering AJAX responses, even if component not in updated part |
org.ajax4jsf.ENCRYPT_RESOURCE_DATA | false | For generated resources ( such as encrypt generation data, encoded in resource URL. for example, url for image generated from mediaOutput component will contain name of genetation method - since, for hacker attack is possible to create request for any JSF baked beans or other attributes. To prevent such attacks, set this parameter to 'true' in critical applications ( work with JRE > 1.4 |
org.ajax4jsf.ENCRYPT_PASSWORD | random | 用來加密資源數(shù)據(jù)的密碼. 如果沒有設(shè)置,則使用隨機密碼 |
org.ajax4jsf.SKIN | DEFAULT | 程序中用到的皮膚名字.可以是皮膚的名字或者EL表達式( #{...} ) 指向String屬性 ( 皮膚名字) or具有org.ajax4jsf.framework.skin.Skin類型的屬性 -在最后一種情況下,該實例將會作為當前程序的皮膚. |
Table 7.2. org.ajax4jsf.Filter 初始化參數(shù)
Name | Default | Description |
---|---|---|
log4j-init-file | - | Path (relative to web application context) to log4j.xml configuration file - cn be used to setup per-application custom logging. |
enable-cache | true | Enable caching of framework-generated resources (java script, CSS, images etc). For debug purposes - development custom JavaScript or Style - prevent to use old cached in browser. |
forceparser | true | Force parsing by filter HTML syntax checker on any JSF page. If false, only AJAX responses will be parsed to syntax check and conwersion to well-formed XML. setting to false improve performanse, but can provide visual effects on ajax updates |
Ajax4jsf 與任何JSF (both JSF 1.1 and JSF 1.2) 實現(xiàn)都兼容.不需要附加的設(shè)置就可以和大部分JSF 組件庫共同工作. 更多的信息參考:
java.sun.com |
Ajax4jsf 與所有的Apache MyFaces versions (1.1.1 - 1.1.3)兼容,并且包含附加的類庫,如: Tomahawk Sandbox 和將來的Trinidad (以前的 ADF Faces). 但是有一些東西需要配置,為了使 MyFaces 和 Ajax4jsf更好的共同工作.
在web.xml文件中定義的不同F(xiàn)ilters會有一些沖突. 為了避免這些問題,在web.xml文件中 Ajax4jsf filter 必須放在其他filters的前面 .
更多信息參考: http://myfaces.apache.org/
在高層次上支持 Facelets 是項目的主要特性之一.為了與Ajax4jsf一同工作, 使用每個 Facelets 版本都是一樣的(除了在新發(fā)布的版本中有一些 Facelets bugs的修復).
注意: 一些JSF框架,如 Facelets使用自己的ViewHandler 并且希望它在ViewHandlers連中處于第一個位置. Ajax4jsf AjaxViewHandler is no exception to this(也是如此?).為了解決這個沖突,從 1.0b5開始,我們提供了 context parameter, org.ajax4jsf.VIEW_HANDLERS,用來定義handlers的順序. 例如,下面的聲明:
<context-param>
<param-name>org.ajax4jsf.VIEW_HANDLERS</param-name>
<param-value>com.sun.facelets.FaceletViewHandler</param-value>
</context-param>
說明Facelets 將理所當然的在第一個位置, 然而 AjaxViewHandler 將偷偷摸摸的在前面做一些臨時的小工作(當然也是非常重要的).(注意: 你不在 WEB-INF/faces-config.xml中定義 FaceletViewHandler .)
最近, 我們遇到一些與 JBoss Seam兼容的問題. 主要的問題是 在服務(wù)啟動時的"ClassNotFoundException" exception.
該問題是由JBoss ClassLoader 的配置引起的.關(guān)于該問題的詳細描述可以在 JBoss Wiki 上找到.
在工作區(qū)中,你可以使用下面的方法設(shè)置這些框架共同工作(JSF with facelets implementation):
-
復制下面的jars到 $JBOSSSERVERHOME/default/lib:
// 譯者注: 作者忘了寫那些類庫了....
確定上面提到的類庫沒有被部署到你的程序中
用于一個global JBoss Classloader 的問題,這些事情必須被做.
-
確定 Facelets View Handler 沒有在 faces-config中指定
-
把 web.xml 該為如下的內(nèi)容:
web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<!-- Seam -->
<listener>
<listener-class>org.jboss.seam.servlet.SeamListener</listener-class>
</listener>
<!-- Propagate conversations across redirects -->
<filter>
<filter-name>Seam Redirect Filter</filter-name>
<filter-class>org.jboss.seam.servlet.SeamRedirectFilter</filter-class>
</filter>
<!-- ajax4jsf -->
<filter>
<display-name>Ajax4jsf Filter</display-name>
<filter-name>ajax4jsf</filter-name>
<filter-class>org.ajax4jsf.Filter</filter-class>
</filter>
<filter-mapping>
<filter-name>ajax4jsf</filter-name>
<url-pattern>*.seam</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>Seam Redirect Filter</filter-name>
<url-pattern>*.seam</url-pattern>
</filter-mapping>
<filter>
<filter-name>Seam Exception Filter</filter-name>
<filter-class>org.jboss.seam.servlet.SeamExceptionFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>Seam Exception Filter</filter-name>
<url-pattern>*.jsf</url-pattern>
</filter-mapping>
<!-- JSF -->
<context-param>
<param-name>javax.faces.STATE_SAVING_METHOD</param-name>
<param-value>client</param-value>
</context-param>
<context-param>
<param-name>org.ajax4jsf.VIEW_HANDLERS</param-name>
<param-value>com.sun.facelets.FaceletViewHandler</param-value>
</context-param>
<context-param>
<param-name>javax.faces.DEFAULT_SUFFIX</param-name>
<param-value>.xhtml</param-value>
</context-param>
<context-param>
<param-name>facelets.REFRESH_PERIOD</param-name>
<param-value>2</param-value>
</context-param>
<context-param>
<param-name>facelets.DEVELOPMENT</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>com.sun.faces.validateXml</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>com.sun.faces.verifyObjects</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>org.ajax4jsf.SKIN</param-name>
<param-value>DEFAULT</param-value>
</context-param>
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Faces Servlet Mapping -->
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.seam</url-pattern>
</servlet-mapping>
<!-- MyFaces -->
<listener>
<listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>
</listener>
</web-app>
-
如果你有任何帶有參數(shù)(f:param)的h:commandLink,請使用a4j:commandLink來替換它,否則參數(shù)將丟失.
Exadel Studio 4 是一個完全支持 Exadel VCP, Ajax4jsf, Facelets, Struts, MyFaces, 和其他Web 技術(shù)的IDE. 除此以外, 它無縫的結(jié)合了可視化和面向代碼的開發(fā)過程. 支持Ajax4JSF 和 VCP的方式之一是提供特別的預定義的功能,該功能可以在任何JSF項目中添加ajax3jsf支持,并提供 Visual Page Editor, Open On, Content Assist, 和 Components Palette features等功能.
Exadel VCP 是一個建立在ajax4jsf上的一個高級框架,用于建立用于web程序的富接口.它添加了很多 AJAX 和 UI components并且 包含很多易于更改的 skinnability for UI designs.
Table 10.1. Ajax4jsf 資源
Resources | Links |
---|---|
JSF中文技術(shù)文摘 | http://hi.baidu.com/jsfcn |
Aajax4jsf on java.net | https://ajax4jsf.dev.java.net/ |
Aajax4jsf 4 Chinese |
http://bingyu1108.googlepages.com/ajax4jsf-homepageforchinese |
Exadel VCP |
http://www.exadel.com/web/portal/products/VisualComponentPlatform |
Exadel Forum | |
Exadel VCP Wiki | |
Ajax4jsf / Exadel VCP Blog | http://jroller.com/page/a4j |