[转]A4J 用户指南

A4J 用户指南


序言:



Ajax4JSF是一个很容易使用的框架.

有什么问题可以在
JSF中文论坛讨论.

Chapter 1. 介绍

这里是一些介绍a4j的内容,暂时先不翻译了,等有时间再补充上.

Ajax4jsf 是一个添加Ajax功能到JSF项目中的开源框架,使用该框架不用写JS代码.

Ajax4jsf 充分利用了JSF框架的优点,如: 生命周期, 验证, 转换的灵活性和受管理的静态和动态资源. 使用Ajax4jsf, 具有Ajax支持的富组件和高度可自定义的外观感觉可以很容易的与JSF结合起来.

Ajax4JSF 被设计用来:

在使用Ajax时充分显示JSF的优点.Ajax4jsf 完全被结合到 JSF 生命周期中. 当其他框架仅仅给你访问Managed Bean的便利时,Ajax4JSF带给你 Action 和 Value Change 监听器,激活服务端验证,在Ajax请求-响应周期中的转化 这些功能.

添加 AJAX 功能到已经存在的 JSF 项目. 该框架被实现为使用一个组件库来添加ajax功能到你的页面中,而不要写js代码或者使用新的Ajax装饰器替换你已经做好的JSF组件. Ajax4jsf 具有页面范围(page-wide)的Ajax支持,而不是传统的组件范围(component-wide)的ajax支持.  这意味着你可以在页面中定义一个激活Ajax请求的事件,和当根据客户端事件触发Ajax请求来改变服务器端数据后 如何使用JSF组件树来同步显示JSF页面.

使用内建的Ajax支持写自定义富组件. 将来, 我们将有一个完全的组件开发包(CDK)来支持AJax4JSF. CDK 将包含代码生成工具和一个使用类似JSP语法的模版工具.这些功能将去除一些创建组件的一个例行工作.使用这个喝满油的组件工厂机器来创建一个带有Ajax功能的富组件将比使用传统的编码过程创建一个简单的组件还要简单.

项目的Java类与资源包. 除了核心的 AJAX 功能外, Ajax4jsf 也有管理资源的高级支持,例如:图片,JS代码和CSS样式表单,资源框架使 简单的打包这些资源到你自定义组件的Jar文件中成为可能.

动态(on-the-fly)将非常容易. 作为另外一种附加的功能, 资源框架有一个动态产生图片的工具. 使用这个特性,你可以使用类似于使用Java Graphic2D库的方法来创建图片.

使用基于皮肤的技术来创建一个现代富用户界面的外观感觉(look-and-feel). Ajax4jsf 提供一个换肤特性 . 该特性允许通过命名的皮肤参数来简单的定义和管理不同颜色模式与其他UI特性. 你可以从JSP代码和Java代码(例如:基于UI的文本来产生动态的图片)来访问这些皮肤参数 . 注意:, 虽然换肤功能不是完全的替代传统的CSS,但是它还是值得称赞的.

测试components, actions, listeners, 和 pages 就像你在创建他们一样容易. 一个制动测试工具正在开发中 .它将在你开发组件使为你的组件产生测试案例. 该测试框架不仅仅测试组件,也测试服务端和客户端的功能包括JS代码 .作为附加的有用工具,你不需要单独的部署测试程序到Servlet容器中 就可以做到这些了.

 Ajax4JSF 组件已经可以使用了, 因此开发者可以立即使用这种省时的具有高级特性的工具来创建提供了更快更可靠的用户体验的Web程序了.

Chapter 2. 开始使用Ajax4jsf

环境要求

要使用Ajax4JSF 框架你仅仅需要JDK1.4或者更高,任何JSF实现,和你最喜欢的Servlet容器.在下一章我们将给你提供详细的环境信息.

Ajax4jsf 被设计为一个容易使用的框架.仅仅有一点简单的设置步骤就可以在你的JSF程序中使用Ajax功能了.

下载 Ajax4jsf

最新的Ajax4jsf 发布版在这里 https://ajax4jsf.dev.java.net/nonav/ajax/ajax-jsf/download.html 下载.

安装

  • 解压 ajax4jsf.zip 文件.

  • 复制 ajax4jsf.jar and oscache-2.2.jar 到程序的 WEB-INF/lib 文件夹下.

  • 把下面的内容添加到你的程序的 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>
        

    注意. 你可以复制和粘贴上面的内容在 README.txt 文件中.

  • 添加下面的内容:

      <%@ taglib uri="https://ajax4jsf.dev.java.net/ajax" prefix="a4j"%>
        

    到你每个使用Ajax功能的JSP页面中.

简单的 AJAX Echo 项目

让我们来看一个简单的JSF项目. 我们仅仅需要一个JSP页面,里面包含一个Form和一些JSF标签: <h:inputText> 和 <h:outputText>.

我们这个简单的程序应该可以让我们输入一些文字到<h:inputText>中, 然后发送数据到Server,并在 <h:outputText>中显示Server的响应(给我们一个Echo信息).

JSP 页面

下面是一个我们需要的页面代码 (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” .因此, 每一次该事件发布给父标签时,我们的程序将发送一个AJAX请求到Server.这意味着我们的受管理的bean将包含该“text” 域中我们输入的最新数据.

<a4j:support> 标签的“reRender” 属性(attribute)定义我们的页面的哪一部分被更新. 在这里,该页面唯一被更新的部位是 <h:outputText> 标签,因为他的ID值和“reRender” 的属性值向匹配. 在一个页面中更新多个元素(elements)也是很简单的:仅仅把他们的IDs放在 “reRender” 属性中就可以了.

数据 Bean

当然了,为了运行这个程序我们还需要一个受管理的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

下一步, 我们需要在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 有关联.

Web.xml

最后,不要忘了添加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>

就这样了, 现在你的程序应该可以工作了.

部署

最终,你可以在Servlet容器中部署你的程序了. 在你喜欢的容器中部署,然后在你的浏览器中输入: http://localhost:8080/a4jEchoText/echo.jsf

Chapter 3.Ajax4jsf 框架中的基本概念

介绍

该框架被实现为使用一个组件库来添加ajax功能到你的页面中,而不要写js代码或者使用新的Ajax装饰器替换你已经做好的JSF组件. Ajax4jsf 具有页面范围(page-wide)的Ajax支持,而不是传统的组件范围(component-wide)的ajax支持.  这意味着你可以在页面中定义一个激活Ajax请求的事件,和当根据客户端事件触发Ajax请求来改变服务器端数据后 如何使用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页面的不同部分并且提供的一些发送AJAX请求到服务器端的选项,除了你的JSF页面于常规的JSF有点不同外,没有其他的不同了,这是一个你不需要写JS代码和XMLHttpRequest对象的天堂.

结构概览

下面的图片展示了Ajax4jsf 框架的一些重要的元素

Ajax 过滤器(Filter).  为了得到应用 Ajax4jsf 的好处 你必须在在 web.xml 文件中注册一个Ajax Filter.该过滤器有一些职责. Ajax Filter 可以识别多种ajax请求种类. 图片3的序列图展示了在处理常规页面和AJAX请求页面的不同之处.在开始的情况下,所有的JSF树将被编码(encoded). 在第二种情况下依据AJAX 区域(region) (你可以通过使用<a4j:region> tag来定义AJAX region  )的大小(size). 就如你看到的,第二种情况下 过滤器将解析AJAX响应的内容,在它被发送到客户端以前, 查看下面的图片来理解这两种方式:

在这两种情况下, 你的程序所需要的静态或者动态资源的信息将被注册到ResourseBuilder 类中.当请求一个资源时(图片4),AJAX filter 检查资源缓存(Resource Cache)看看这个资源是否存在,如果存在该资源将被送到客户端.否则过滤器将在ResourceBuilder中搜索注册的资源. 如果该资源被注册了,AJAX filter将发送一个请求到 ResourceBuilder来创建[create (deliver)]该资源.下面的图片显示了请求资源的处理过程.

Ajax动作组件(Action Components).  有3个Ajax动作组件: AjaxCommandButton, AjaxCommandLink 和 AjaxSupport. 你可以使用他们从客户端发送AJAX请求.

Ajax容器 (Containers).  AjaxContainer 是一个接口,该接口描述了在Ajax请求中应该被解码(decoded)的JSF页面中的一个区域.AjaxViewRoot 和 AjaxRegion 实现了该接口.

JavaScript引擎 (Engine).  Ajax4jsf JavaScript 引擎 在客户端运行. 它知道如何根据来自于Ajax响应的信息来更新你JSF页面上的不同的区域. 程序开发者不需要直接使用这里的JavaScript代码.它自动的下载到客户端.

如何做...

发送一个 AJAX 请求

从JSF页面发送ajax请求有不同的方法. 你可以使用 <a4j:commandButton>, <a4j:commandLink> 或者 <a4j:support> tags.

所有的这些标签隐藏了在创建一个XMHttpRequest 对象和发送ajax请求所需要的JavaScript 活动.并且, 他们允许你选择页面中那个JSF组件被重新渲染(re-rendered) 来表现Ajax响应的结果 (你可以列出他们的 IDs 在“reRender” 属性中).

<a4j:commandButton> 和 <a4j:commandLink> tags 用来在 “onclick” JavaScript 事件中发送Ajax请求.

在你选择JS事件(“onkeyup”, “onmouseover”, etc)时, <a4j:support> tag 允许你在普通的JSF组件中添加Ajax 功能和发送ajax请求.

提供Ajax请求功能的大部分重要的属性如下:

  • reRender 属性 - 就如我们前面提到过的,在一个Ajax响应到来时重新渲染(reRendered)组件.

  • RequestDelay 属性 – 用来调节请求的频率.

        <h:inputText size="50" value="#{bean.text}">
        <a4j:support event="onkeyup" RequestDelay=”3”/>
        </h:inputText>
        

    因此每一个来自于键盘事件的请求将会延迟3 ms ,来减少请求的次数.

  • EventsQueue – 储存下一个请求的队列的名字. 队列帮助阻止下一个请求知道当前的处理完.

  • LimitToList 用来控制更新的区域. 设置为true – 将更新仅在reRender list中的区域, 如果为false,将更新所有Output Panels区域.

  • ajaxSingle 如果设置为false用来指定发送请求的区域  – 如果为true则发送整个区域 - 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.)

决定发送什么

你可能描述了一个你决定发送到服务器的页面区域.当你发送ajax请求的时候,通过这种方式你可以控制JSF View的那个部分在服务器端被解码(decoded).

描述你JSF页面上的一个Ajax区域的最容易的方法是什么都不做.这是因为在<f:view> 和 </f:view> tags 中的内容在默认值的情况下认为是ajax区域.

通过使用<a4j:region> tag你可以在一个JSF页面中定义多个Ajax区域 (they can even be nested).

如果你希望渲染ajax响应以外的区域,那么renderRegionOnly属性值应该设置为false.否则ajax更新被限制在活动区域的元素中.

决定改变什么

在大部分情况下都可以使用 “reRender”中的ids来定义需要更新的 “AJAX zones”.

但是如果你的页面包含<f:verbatim/> tag(你希望在ajax响应中更新它的内容)你不可以使用这种方式.

我们在上面描述的<f:verbatim/> tag 的问题涉及到JSF组件的transientFlag值. 如果该标记的值为true,这个组件不能参与保存和恢复组件树(saving or restoring)的处理过程.

为了提供一种解决这个问题的方法, Ajax4jsf 利用<a4j:outputPanel> tag定义了一个output panel . 如果你把<f:verbatim/> tag放在output panel中, 那么在AJAX 响应中 <f:verbatim/> tag和其他panel中的child tags中的内容可以被更新 .有两种方法来控制它:

  • 设置“ajaxRendered” 属性值为true.

  • 设置动作组件的“reRender” 属性值为output panel的 ID.

 

Chapter 4. Ajax4JSF 组件库

a4j:ajaxListener

和 ActionListener或者ValueChangeListener的工作方式一样, 只是仅用于AJAX容器. 添加一个指定的类作为AjaxEvent的监听器. (sent in case of an AJAX request for this container).

Table 4.1. a4j:ajaxListener attributes

type注册到AjaxListener 中类的完全限定的Java类名

    <a4j:region selfRendered="true" ajaxListener="#{bean.processAjax}" id="Region">
…
</a4j:region>

当来自于Region的AJAX request触发时,将调用bean的'processAjax'方法.

a4j:region

该标签定义在AJax请求处理过程中被发送到服务器端解码的部分JSF组件树.

Table 4.2. a4j:region 的属性

selfRendered如果为true,在调用应用程序(InvokeApplication )阶段自渲染子树(如果immediate 属性设置为true则是 Decode)
renderRegionOnly标记,用来决定活动区域外的内容在Ajax响应中是否渲染.如果为"true" , 在AJAX response过程中活动区域外的组件都不渲染. 如果为"false", 将渲染包含在响应中的所有组件树.默认值为"true"
rendered如果为 false, 该组件将不被重新渲染.
id每个组件都应该有个唯一的id. 如果没有指定的话,将会自动产生.
immediate如果该组件被Ajax请求激活的话,标记该组件应该立即(在应用请求值阶段)被感兴趣的监听器和动作处理,而不是等到调用应用程序阶段.(译者注:该标记和JSF中的immediate标记所代表的意思差不多,跳过验证阶段到呈现响应阶段)
binding组件绑定
ajaxListener方法绑定,当该组件被ajax请求激活时,将调用该监听器方法处理该事件.该方法必须为public的并且接受一个 AjaxEvent 参数,返回void.

    <a4j:region>
<!--Some content-->
<a4j:region>

如果在该组件的区域中有一个Ajax请求调用了  – 该区域将根据Ajax的设置被框架处理.

a4j:page

该组件呈现一个完全的HTML页面结构.它必须是view root (JSP <f:view> tag)的第一个(并且是仅有的一个)子组件. 没有Html代码可以在该组件的外面. 它也支持在Ajax请求中处理子组件,就和<a4j:region>一样.对于一个普通的请求,它将把结果呈现为在客户端页面<head>元素中的<script>元素.如果该组件包含一个"head" facet, 该facet的内容也呈现在<head>中.对于一个Ajax请求,在整个结构中仅仅涉及到的组件被呈现.下面是个在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,在调用应用程序(InvokeApplication )阶段自渲染子树(如果immediate 属性设置为true则是 Decode)
lang用来描述在产生该组件的markup时用到的语言(产生该组件标记所使用的语言)
title该组件产生的Markup的title属性值
renderRegionOnlyrenderRegionOnly
onunload在页面unload时执行的JS代码
rendered如果是 false, 该组件不会被呈现.
contentType设置响应的自定义的mime内容类型
dir文本方向
id  每个组件都应该有个唯一的id. 如果没有指定的话,将会自动产生.
styleClass和HTML class 属性对应.
immediate如果该组件被Ajax请求激活的话,标记该组件应该立即(在应用请求值阶段)被感兴趣的监听器和动作处理,而不是等到调用应用程序阶段.(译者注:该标记和JSF中的immediate标记所代表的意思差不多,跳过验证阶段到呈现响应阶段)
onload在页面load时执行的JS代码
style在该组件被呈现时应用的CSS style(s)
pageTitle作为页面 title的字符串
binding组件绑定.
ajaxListener方法绑定,当该组件被ajax请求激活时,将调用该监听器方法处理该事件.该方法必须为public的并且接受一个 AjaxEvent 参数,返回void.

        <a4j:page>
<f:facet name=”head”>
…
</f:facet>
…
<a4j:page>

上面的示例结构将被呈现为:

        <HTML>
<HEAD>
…
</HEAD>
<body >
…
</body>
</HTML>

a4j:support

在 UIComponent-based组件上添加ajax功能,使他们有JavaScript事件属性. 在解码期间:如果一个请求为Ajax-performed, 从ExternalContext 中的requestParameterMap属性中得到Map,如果该Map中"clientId" key对应的值非空,在组件上创建一个 javax.faces.event.ActionEvent, 并且传递该事件到该组件的queueEvent()中,然后把他的reReander区域中的组件id添加到reReander属性中.在编码过程中.不编码一个组件. 相反的,在父组件上添加一个与事件属性的值相同的值绑定(Instead, it adds ValueBinding for a property of the parent component with the name as a value of its "event" property).结果,当呈现时,父组件创建一个在提交一个ajax请求时用到的JS代码.如果该组件有子UIParameter组件,添加他的name/value作为附加的请求参数.如果父组件是一个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请求激活时,将调用该监听器方法处理该事件.该方法必须为public的并且接受一个 AjaxEvent 参数,返回void.
parentPropertiesparentProperties
action方法绑定到要被激活的程序动作方法, 如果该 UIComponent 被用户激活, 根据immediate属性的值,方法在 请求处理生命周期中的Apply Request Values 或者 Invoke Application 阶段 被调用.
oncomplete 在客户端请求完成时调用的js代码
rendered如果为false,该组件将不会被显示.
statusRequest status 组件的id(在 UIComopnent.findComponent()中使用)
reRender该组件调用Ajax请求后重新渲染的组件的ID(在 UIComopnent.findComponent()中使用),可以使一个id,也可以使逗号分开的很多id,或者是数据or集合的EL表达式
targetIdreRender的别名 : 该组件调用Ajax请求后重新渲染的组件的ID(在 UIComopnent.findComponent()中使用),可以使一个id,也可以使逗号分开的很多id,或者是数据or集合的EL表达式
id每个组件都应该有个唯一的id. 如果没有指定的话,将会自动产生.
disableDefault使目标事件的动作不可用 ( 在javascript代码中添加 "return false;" )
requestDelay在JS事件上延迟 ( 单位 ms. )发送Ajax请求.与事件队列公共工作可以减少键盘或者鼠标移动触发请求的次数
eventsQueue用来避免在同一个事件上的重复请求的队列的名字.可以用来减少周期事件(如:按键,鼠标移动)请求的次数.
bypassUpdates如果使true,在处理验证阶段后跳过更新模型值阶段到呈现阶段.可以用来验证组件的输入值.
immediate如果该组件被Ajax请求激活的话,标记该组件应该立即(在应用请求值阶段)被感兴趣的监听器和动作处理,而不是等到调用应用程序阶段.(译者注:该标记和JSF中的immediate标记所代表的意思差不多,跳过验证阶段到呈现响应阶段)
limitToList如果为true,仅仅更新'reRender'属性中指定的组件,否则(默认值)更新所有Ajax Region中的组件
ajaxSingle如果为 true , 仅仅提交一个field/link,而不是整个form中的内容.
event 父组件的JS事件属性的名称 ( onclick , onchange, etc. ) , for which we will build AJAX submission code.
binding组件绑定.

 

所有你需要指定的东西 - 父组件用来触发ajax请求的事件和被reRender的区域, 和处理事件的Java bean方法.

    <a4j:region selfRendered="true">
…
<h:selectBooleanCheckbox value="#{pizza.tip}">
<a4j:support />
</h:selectBooleanCheckbox>
…
</a4j:region>

因此,在上面的例子中,checkbox状态的改变将提交当前的区域. 'show_hide'动作将被调用,并且 'list'中的id所指定的组件将被更新.

a4j:commandLink

呈现一个Html <a> 元素,当点击时的动作就象一个form提交一样.

在解码的过程中:

     从ExternalContext的属性requestParameterMap中得到一个Map,如果该Map中包含"clientId" key的非空值, 在组件上创建一个 javax.faces.event.ActionEvent 事件,并且传递该事件给组件的queueEvent() 方法.如果该请求是Ajax-performed,把reRander属性中的IDs值添加到嵌套的AjaxContainer的 rendered areas list中 ,在解码的过程中也添加组件的参数(PARAM_NAME 和 PARAM_VALUE 是任何嵌套的子UIParameter的names 和 values .) names 和 values必须是被URLEncoded处理过的.如果styleClass属性被指定了,呈现它的值为html中的class属性的值. 呈现任何non-UIParameter子组件为<a>的相应的子组件. 这些看起来就像一个Link文本.

Table 4.5. a4j:commandLink attributes

actionListener方法绑定,当该组件被ajax请求激活时,将调用该监听器方法处理该事件.该方法必须为public的并且接受一个 AjaxEvent 参数,返回void.
title该组件产生的标记元素的提示文字(当鼠标移动到该组件上面出现的提示文字)
oncomplete在客户端请求完成时调用的js代码
shapedefault|rect|circle|poly [CI] 该属性指定一个区域的形状.可能的取值: * default: 指定整个区域. * rect:指定一个矩形区域. * circle: 定义一个圆形区域. * poly: 定义一个多边形区域.
target 
rendered如果为false,该组件将不会被显示.
charset该属性指定了通过链接指派的资源的字符编码.
reRender该组件调用Ajax请求后重新渲染的组件的ID(在 UIComopnent.findComponent()中使用),可以使一个id,也可以使逗号分开的很多id,或者是数据or集合的EL表达式
targetIdAlias for reRender : 该组件调用Ajax请求后重新渲染的组件的ID(在 UIComopnent.findComponent()中使用),可以使一个id,也可以使逗号分开的很多id,或者是数据or集合的EL表达式
id每个组件都应该有个唯一的id. 如果没有指定的话,将会自动产生.
dir文本方向.
rev该属性用来描述从通过 href 属性指定的锚点到当前文档的反向链接。该属性值是通过空格分隔的 link 类型(值)的列表。
 
bypassUpdates如果使true,在处理验证阶段后跳过更新模型值阶段到呈现阶段.可以用来验证组件的输入值.
styleClass和HTML的class属性一样.
accesskey触发该组件的快捷键
limitToList如果为true,仅仅更新'reRender'属性中指定的组件,否则(默认值)更新所有Ajax Region中的组件
onkeypress键盘事件,键被按下和松开
ajaxSingle如果使true,仅仅提交一个field/link,而不是所有被控制的
ondblclickHTML: 双击事件
styleHTML: 应用在该组件上的CSS.
onblur当元素失去焦点时发生的事件
onmouseover当滑鼠移动到组件上方时
 
onkeyup当使用者按下并放开按键
value该组件的当前值
action方法绑定到要被激活的程序动作方法, 如果该 UIComponent 被用户激活, 根据immediate属性的值,方法在 请求处理生命周期中的Apply Request Values 或者 Invoke Application 阶段 被调用.
tabindex设置不同元素之间获得焦点的顺序
hreflang该属性指定了通过 href 指派的资源的基本语言,并且仅在 href 被指定的情况下使用(也就是说如果 A 中没有指定 href 属性,就不应该出现 hreflang 属性)。
type该属性指定链接资源所采用的内容类型。(译者注:例如网页通常为 text/html)
lang产生该组件标记所使用的语言
onclick当鼠标点击时发生的事件
 
status请求状态组件的ID(在UIComopnent.findComponent()中使用)
onmouseout鼠标光标移开元素时发生的事件
onkeydown键按下时发生的事件
onmousedown按下鼠标按键时发生的事件
requestDelay在JS事件上延迟 ( 单位 ms. )发送Ajax请求.与事件队列公共工作可以减少键盘或者鼠标移动触发请求的次数
eventsQueue用来避免在同一个事件上的重复请求的队列的名字.可以用来减少周期事件(如:按键,鼠标移动)请求的次数.
rel该属性描述了从当前文档到通过 href 属性定义的锚点之间的关系。该属性值是通过空格分隔的 link 类型(值)的列表(译者注:在 Web 标准开发中,这个通常用来代替 target 属性,配合脚本,用来表示目的窗口)。
immediate如果该组件被Ajax请求激活的话,标记该组件应该立即(在应用请求值阶段)被感兴趣的监听器和动作处理,而不是等到调用应用程序阶段.(译者注:该标记和JSF中的immediate标记所代表的意思差不多,跳过验证阶段到呈现响应阶段)
onfocus使用在表单元素中,当元素获得焦点时发生的事件
onmouseup当释放鼠标按键时发生的事件
binding组件绑定.
onmousemove鼠标光标在元素上移动时发生的事件
coords定义区域 -- coords
a.矩形:必须使用四个数字,前两个数字为左上角座标,后两个数字为右下角座标
例:<area shape=rect coords=100,50,200,75 href="URL">
b.圆形:必须使用三个数字,前两个数字为圆心的座标,最后一个数字为半径长度
例:<area shape=circle coords=85,155,30 href="URL">
c.任意图形(多边形):将图形之每一转折点座标依序填入
例:<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特性.

a4j:commandButton

呈现一个HTML "input" 元素.

在解码的过程中:

         从ExternalContext的属性requestParameterMap中得到一个Map,如果该Map中包含"clientId" key的非空值, 在组件上创建一个 javax.faces.event.ActionEvent 事件,并且传递该事件给组件的queueEvent() 方法.如果该请求是Ajax-performed,把reRander属性中的IDs值添加到嵌套的AjaxContainer的 rendered areas list中 .

在编码的过程中:

        为onclick事件创建一个AJAX.Submit JavaScript调用.呈现组件的clientId 为name属性的值.呈现组件的当前值为value属性的值.

如果styleClass属性被指定了,呈现它的值为class属性的值.  呈现 HTML "input"元素的子元素.

Table 4.6. a4j:commandButton attributes

actionListener方法绑定,当该组件被ajax请求激活时,将调用该监听器方法处理该事件.该方法必须为public的并且接受一个 AjaxEvent 参数,返回void.
title该组件产生的标记元素的提示文字(当鼠标移动到该组件上面出现的提示文字)
oncomplete在客户端请求完成时调用的js代码
rendered如果为false,该组件将不会被显示.
reRender该组件调用Ajax请求后重新渲染的组件的ID(在 UIComopnent.findComponent()中使用),可以使一个id,也可以使逗号分开的很多id,或者是数据or集合的EL表达式
targetIdAlias for reRender : 该组件调用Ajax请求后重新渲染的组件的ID(在 UIComopnent.findComponent()中使用),可以使一个id,也可以使逗号分开的很多id,或者是数据or集合的EL表达式
onchange使用在表单元素中,当某些东西改变时发生的事件
dir文本方向.
id每个组件都应该有个唯一的id. 如果没有指定的话,将会自动产生.
bypassUpdates如果使true,在处理验证阶段后跳过更新模型值阶段到呈现阶段.可以用来验证组件的输入值.
styleClass和HTML的class属性一样.
accesskey触发该组件的快捷键
limitToList如果为true,仅仅更新'reRender'属性中指定的组件,否则(默认值)更新所有Ajax Region中的组件
onkeypress键盘事件,键被按下和松开
ajaxSingle如果使true,仅仅提交一个field/link,而不是所有被控制的
ondblclickHTML: 双击事件
image在这个button中要显示的图片的绝对或者相对URL 如果指定了该 "input" 元素将为"image"类型. 否则, it will be of the type specified by the "type" property with a label specified by the "value" property.
styleHTML: 应用在该组件上的CSS.
size定义组件显示的尺度
onblur当失去焦点时发生的事件
onmouseover当滑鼠移动到组件上方时
 
value该组件的当前值
action方法绑定到要被激活的程序动作方法, 如果该 UIComponent 被用户激活, 根据immediate属性的值,方法在 请求处理生命周期中的Apply Request Values 或者 Invoke Application 阶段 被调用.
onkeyup当使用者按下并放开按键
tabindex设置不同元素之间获得焦点的顺序
lang产生该组件标记所使用的语言
typesubmit|reset|image|button 指定创建组件的类型,默认值为Submit.
disabled把控件的状态设置为不能使用
onclick当鼠标点击时发生的事件
 
status请求状态组件的ID(在UIComopnent.findComponent()中使用)
onmouseout鼠标光标移开元素时发生的事件
alt文本方向.
onkeydown键按下时发生的事件
onmousedown按下鼠标按键时发生的事件
requestDelay在JS事件上延迟 ( 单位 ms. )发送Ajax请求.与事件队列公共工作可以减少键盘或者鼠标移动触发请求的次数
eventsQueue用来避免在同一个事件上的重复请求的队列的名字.可以用来减少周期事件(如:按键,鼠标移动)请求的次数.
immediate如果该组件被Ajax请求激活的话,标记该组件应该立即(在应用请求值阶段)被感兴趣的监听器和动作处理,而不是等到调用应用程序阶段.(译者注:该标记和JSF中的immediate标记所代表的意思差不多,跳过验证阶段到呈现响应阶段)
onfocus当组件获得焦点时发生的事件
onmouseup当释放鼠标按键时发生的事件
binding组件绑定.
onmousemove鼠标光标在元素上移动时发生的事件

简单来说a4j:CommandButton 是一个带有AJAX Support的 HTML <input> 元素 . 包含所有的a4j:support的主要功能, 还有它自己的onclick事件的Ajax请求和所有与a4j:Support组合的CommandButton特性.

a4j:outputPanel

创建页面中具有 AJAX-enabled的一个区域. 作为普通的请求,根据layout的属性值("inline" or "block")呈现为 <span> 或者 <div> HTML 元素. ( "id"属性将是clientId 属性的值.) 对于一个AJAX请求,如果ajaxRendered被设置为true,该元素的内容被包含在ajax响应中.

Table 4.7. a4j:outputPanel attributes

styleClass和HTML的class属性一样.
title该组件产生的标记元素的提示文字(当鼠标移动到该组件上面出现的提示文字)
lang产生该组件标记所使用的语言
layoutHTML layout用于产生 markup. 可能的取值是: "block" 产生一个 HTML <div> 元素, "inline" 产生一个 HTML <span> 元素, 和 "none"不产生 HTML 元素. 对于none 当子元素的rendered属性被设置为false时 这里有个小例外 ,这是创建一个具有相同id的空 <span> 元素 作为子元素,用来当作一个用于后序处理的占位符
keepTransient指定所有子组件为non-transient的标记.如果为true,所有的子组件将被设置为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 ).
ajaxRenderedDefines, 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
styleHTML: 应用在该组件上的CSS.
rendered如果为false,该组件将不会被显示.
binding组件绑定.
dir文本方向.
id每个组件都应该有个唯一的id. 如果没有指定的话,将会自动产生.

    <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. 当验证错误时,消息将出现;或者,text将重复出现.

a4j:actionparam

联合两个JSF tags的桥梁, <f:actionListener>; 和 <f:param>. 在呈现阶段,像往常一样被符组件 (<h:commandLink>; 或者 like) 解码,在处理请求阶段,如果父组件执行一个动作事件, 更新"assignTo" 属性的值为它的新值.如果一个转换属性被指定了,使用它来编码和解码该值 为保存在html 参数中的字符串.

Table 4.8. a4j:actionparam attributes

noEscape如果设置为true,该值将不会被附上但引号 并且每一转义字符. 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使用一个转换(converter )的id 或者引用一个converter.
assignToEL表达式用来更新bean的属性. 如果父组件执行一个 actionEvent,该值将被更新.
binding组件绑定.
name该参数的名字
id每个组件都应该有个唯一的id. 如果没有指定的话,将会自动产生.

a4j:status

在客户端呈现一个表现ajax请求状态的标识.

在编码过程中:

    创建两个带有id的该组件的子(clientId )span元素,或者添加了":status.start" 和 ":status:stop" 字符串的 ajax区域的目标(使用for属性来指定). "start" span 具有 "display:none" style (隐藏).在span里面,呈现startText/stopText属性值或者如果"start" 和 "stop" facets存在的话,呈现facets的内容. 在执行一个ajax请求时, 客户端的js代码改变 "start" span 的可见属性并且隐藏"stop". 当该指示器所指示的请求都完成时,恢复"stop" 并且隐藏"start" .start[style,styleClass] 和 stop[style,styleClass] 被呈现为 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在开始一个请求时应用到组件上的CSS类
stopStyle在 一个请求响应完成时应用到组件上的CSS
stopStyleClass在 一个请求响应完成时应用到组件上的CSS类
layout定义面板的布局,可以为block或者inline
title该组件产生的标记元素的提示文字(当鼠标移动到该组件上面出现的提示文字)
rendered如果为false,该组件将不会被显示.
id每个组件都应该有个唯一的id. 如果没有指定的话,将会自动产生.
dir文本方向.
styleClass和HTML的class属性一样.
startStyle在开始一个请求时应用到组件上的CSS类
onkeypress键盘事件,键被按下和松开
ondblclickHTML: 双击事件
styleHTML: 应用在该组件上的CSS.
onmouseover当滑鼠移动到组件上方时
 
for指定应用于 AjaxContainer组件的ID ( 在javax.faces.UIComopnent.findComponent() 中使用).
onkeyup当使用者按下并放开按键
lang产生该组件标记所使用的语言
onclick当鼠标点击时发生的事件
 
onmouseout鼠标光标移开元素时发生的事件
startText在请求开始时显示的文本
onkeydown键按下时发生的事件
onmousedown按下鼠标按键时发生的事件
forceId如果为true,呈现组件id为HTML代码而不是JSF产生的代码.(译者注:参考Myfaces中的ForceId.)
stopText当请求完成时显示的文本
onmouseup当释放鼠标按键时发生的事件
binding组件绑定.
onmousemove鼠标光标在元素上移动时发生的事件

指示请求状态的两种表示方式:

  1. 定义 "startText" 和 "stopText" 属性

                    <a4j:status startText="Performing Request"
        stopText="Request Done"
        for="stat1"/>
        
  2. 定义 "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>
        

    在任何一种状态下,当请求开始时 - ":status.start" span 将被呈现 并且在请求结束后":status.stop" span 将出现.

将状态应用到组件上也有两种方法:

  1. 指定目标 AJAX Containers 的id为“for” 属性的值

  2. 在组件上定义 “status” 属性 指定到状态.

如果for省略了 - 状态组件将指向它所在的区域(status component will be pointed to region where it's placed )

a4j:loadBundle

加载一个本地化当前view的资源包,并且暴露它(作为一个Map)为当前请求的请求参数. 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每个组件都应该有个唯一的id. 如果没有指定的话,将会自动产生.

a4j:mediaOutput

用用户指定的资源( images, sounds, video, active objects, applets ...)来创建任何连接元素类型的类.在CreateContent属性中指定的方法将把从DataBean中指定的值传递给OutputStream.重要: 在value中指定的数据bean必须实现Serializable接口.

Table 4.11. a4j:mediaOutput attributes

declaredeclare but don't instantiate flag
dir文本方向.
id每个组件都应该有个唯一的id. 如果没有指定的话,将会自动产生.
rev该属性用来描述从通过 href 属性指定的锚点到当前文档的反向链接。该属性值是通过空格分隔的 link 类型(值)的列表。
 
mimeType应用于响应头的mime类型( 'image/jpeg' etc )
styleHTML: 应用在该组件上的CSS.
onmouseover当滑鼠移动到组件上方时
 
onkeyup当使用者按下并放开按键
tabindex设置不同元素之间获得焦点的顺序
archive空格分开的URIs
converterconverter
lang产生该组件标记所使用的语言
createContent方法调用表达式用来传递资源到 OutputStream. 必须有两个参数 java.io.OutputStream 和 java.lang.Object ( deserialized value of data attribute )
onmouseout鼠标光标移开元素时发生的事件
element连接资源的html元素的名字-可能是 <a> <img> <object> <applet> <script> or <link>
rel该属性描述了从当前文档到通过 href 属性定义的锚点之间的关系。该属性值是通过空格分隔的 link 类型(值)的列表(译者注:在 Web 标准开发中,这个通常用来代替 target 属性,配合脚本,用来表示目的窗口)。
onmouseup当释放鼠标按键时发生的事件
cacheablecacheable
binding组件绑定.
onmousemove鼠标光标在元素上移动时发生的事件
expiresexpires
coords定义区域 -- coords
a.矩形:必须使用四个数字,前两个数字为左上角座标,后两个数字为右下角座标
例:<area shape=rect coords=100,50,200,75 href="URL">
b.圆形:必须使用三个数字,前两个数字为圆心的座标,最后一个数字为半径长度
例:<area shape=circle coords=85,155,30 href="URL">
c.任意图形(多边形):将图形之每一转折点座标依序填入
例:<area shape=poly coords=232,70,285,70,300,90,250,90,200,78 href="URL">
title该组件产生的标记元素的提示文字(当鼠标移动到该组件上面出现的提示文字)
shapedefault|rect|circle|poly [CI] 该属性指定一个区域的形状.可能的取值: * default: 指定整个区域. * rect:指定一个矩形区域. * circle: 定义一个圆形区域. * poly: 定义一个多边形区域.
target 
sessionsession
charset该属性指定了通过链接指派的资源的字符编码.
rendered如果为false,该组件将不会被显示.
codetype代码的内容类型
classid指定一个实现
styleClass和HTML的class属性一样.
accesskey触发该组件的快捷键
onkeypress键盘事件,键被按下和松开
ondblclickHTML: 双击事件
alignbottom|middle|top|left|right 只用元素的对齐方式.不建议使用.
vspace不建议使用
standby当载入时显示的文字
lastModifiedlastModified
border不建议使用.
onblur当元素失去焦点时发生的事件
value在程序时候计算的值,并且保存在URI中(也是cache Key的一部分 ), 在产生是传递到send method. 可以用来更新缓存的值.重要的: 既然序列化的数据保存在URI中,避免使用大的对象
hreflang 
codebase用于 classid, data, archive的base URI
type该属性指定链接资源所采用的内容类型。(译者注:例如网页通常为 text/html)
uriAttribute资源连接属性的名字.  ( 'href' for <a>, 'src' for <img> or <script>, etc
onclick当鼠标点击时发生的事件
 
onkeydown键按下时发生的事件
onmousedown按下鼠标按键时发生的事件
hspace不建议使用了,
onfocus使用在表单元素中,当元素获得焦点时发生的事件

our Examples page.上有个创建图片的示例. 就像我们前面提到的一样,任何实现了 Serializable的 Bean 都可以是createContent方法的数据提供者.

Chapter 5. Ajax4jsf中的更换皮肤功能

Ajax4jsf 提供了一种在UI设计中很容易使用的换皮肤功能.使用这个框架,你可以很容易的在资源文件中使用命名皮肤参数来控制程序的显示外观.这里有个例子,提供了几种皮肤:

http://livedemo.exadel.com/vcpDemo/

使用Ajax4jsf 框架的skinability 服务,你可以很容易的控制程序的look-and-feel. 在Ajax4jsf的帮助下,使用skinability 服务,你可以在标准的JSF组件和自定义的JSF组件中定义相同的风格 .

为了使用skinability 功能,请按照下面的步骤来:

  1. 创建一个自定义的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>
        
  2. 然后,我们需要为已经定义好的组件皮肤 创建和注册自定义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>
        
  3. 最后,我们需要放置一个保存皮肤参数的属性文件在类路径根目录下面.该属性文件有两个要求:

    • 文件名必须是<name of renderer class>.skin.properties ― 在上面的例子中 将是newskin.skin.properties .

    • 文件的第一行应该是 render.kit=<render-kit-id> ― 在上面的例子中 将是  render.kit=NEW_SKIN .

关于创建自定义 renderers 的更多的信息可以在下面的连接中找到:

http://java.sun.com/javaee/javaserverfaces/reference/docs/index.html

Chapter 6. 技术要求

下面是你使用 Ajax4jsf的技术条件.

  • Java

  • JavaServer Faces

  • Java application server or servlet container

  • Browser (on client side)

支持的 Java 版本

  • JDK 1.4 - 1.5

支持的 JavaServer Faces 实现

(注意: Ajax4JSF 也和 Facelets JSF 组件兼容.)

  • Sun JSF 1.1RI

  • JSF 1.2

  • MyFaces 1.1.1 - 1.1.3

支持的 Servers

  • 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

支持的 Browsers

  • IE 5 - 6

  • FireFox 1.0 - 1.5

  • Opera 8.0 - 9.0

  • Netscape 7.0

Chapter 7. 附加的设置

Ajax4jsf支持JSF中的所有组件和标签.在一个已经存在的JSF项目中添加Ajax4jsf支持,你必须把Ajax4jsf 库放在项目的lib目录下,并且在web.xml文件中添加过滤器mapping.如果仅仅添加Ajax4JSF功能 则已经存在的项目的行为将不会改变.

web项目描述参数

这些参数帮助开发和提高Ajax4JSF的扩展性.

 

Table 7.1. 初始化参数

NameDefaultDescription
org.ajax4jsf.LOGFILEnone指向程序或者容器的日志文件的URL( 如果可能的话).如果该参数被设置了,给定的URL的内容将出现在Debug错误页面的iframe 中
org.ajax4jsf.VIEW_HANDLERSnone逗号隔开的自定义ViewHandler 实例的列表.handlers 将按照顺序插入在ajax4jsf viewhandlers 的前面.例如,在 facelets中该参数必须包含 com.sun.facelets.FaceletViewHandler , 代替在faces-config.xml中声明
org.ajax4jsf.CONTROL_COMPONENTSnone逗号分开的用于特殊控制的组件名字 - 例如资源绑定loader , MyFaces alias bean components 等等.通过反射从静态的 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_DATAfalseFor 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_PASSWORDrandom用来加密资源数据的密码. 如果没有设置,则使用随机密码
org.ajax4jsf.SKINDEFAULT程序中用到的皮肤名字.可以是皮肤的名字或者EL表达式( #{...} ) 指向String属性 ( 皮肤名字) or具有org.ajax4jsf.framework.skin.Skin类型的属性 -在最后一种情况下,该实例将会作为当前程序的皮肤.


 

Table 7.2. org.ajax4jsf.Filter 初始化参数

NameDefaultDescription
log4j-init-file-Path (relative to web application context) to log4j.xml configuration file - cn be used to setup per-application custom logging.
enable-cachetrueEnable 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.
forceparsertrueForce 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


Sun JSF RI

Ajax4jsf 与任何JSF (both JSF 1.1 and JSF 1.2) 实现都兼容.不需要附加的设置就可以和大部分JSF 组件库共同工作. 更多的信息参考:

java.sun.com

Apache MyFaces

Ajax4jsf 与所有的Apache MyFaces versions (1.1.1 - 1.1.3)兼容,并且包含附加的类库,如: Tomahawk Sandbox 和将来的Trinidad (以前的 ADF Faces). 但是有一些东西需要配置,为了使 MyFaces 和 Ajax4jsf更好的共同工作.

在web.xml文件中定义的不同Filters会有一些冲突. 为了避免这些问题,在web.xml文件中 Ajax4jsf filter 必须放在其他filters的前面 .

更多信息参考: http://myfaces.apache.org/

Facelets Support

在高层次上支持 Facelets 是项目的主要特性之一.为了与Ajax4jsf一同工作, 使用每个 Facelets 版本都是一样的(除了在新发布的版本中有一些 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 Support

最近, 我们遇到一些与 JBoss Seam兼容的问题. 主要的问题是 在服务启动时的"ClassNotFoundException" exception.

该问题是由JBoss ClassLoader 的配置引起的.关于该问题的详细描述可以在 JBoss Wiki 上找到.

在工作区中,你可以使用下面的方法设置这些框架共同工作(JSF with facelets implementation):

  • 复制下面的jars到 $JBOSSSERVERHOME/default/lib:

    // 译者注: 作者忘了写那些类库了....

    确定上面提到的类库没有被部署到你的程序中

    用于一个global JBoss Classloader 的问题,这些事情必须被做.

  • 确定 Facelets View Handler 没有在 faces-config中指定

  • 把 web.xml 该为如下的内容:

    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>
        
  • 如果你有任何带有参数(f:param)的h:commandLink,请使用a4j:commandLink来替换它,否则参数将丢失.

Chapter 8. IDE支持

Exadel Studio 4 是一个完全支持 Exadel VCP, Ajax4jsf, Facelets, Struts, MyFaces, 和其他Web 技术的IDE. 除此以外, 它无缝的结合了可视化和面向代码的开发过程. 支持Ajax4JSF 和 VCP的方式之一是提供特别的预定义的功能,该功能可以在任何JSF项目中添加ajax3jsf支持,并提供 Visual Page Editor, Open On, Content Assist, 和 Components Palette features等功能.

Chapter 9. Exadel VCP 和 Ajax4jsf

Exadel VCP 是一个建立在ajax4jsf上的一个高级框架,用于建立用于web程序的富接口.它添加了很多 AJAX 和 UI components并且 包含很多易于更改的 skinnability for UI designs.

powered by  http://blog.hexiao.cn/ 

 

转载于:https://www.cnblogs.com/think8848/archive/2008/09/09/1287635.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值