JSF好像充满了争议,被很多Java大牛们所抱怨,而很多主流厂商却非常支持,毕竟是J2EE5的亲生儿子嘛。
而Ajax却是Web2.0的热门技术之一,N多客户问我,今天你们Ajax了没有?
Ajax4Jsf是结合这两样技术的一个开源项目,本周刚被Jboss从Exadel收购(合作?),闲暇时分,和一哥们一同试了把它的功能,现交个作业。
首先,A4J是开源的,而且文档比较齐全,demo丰富,它有个分支是G4J,即GWT4JSF,但是这次Jboss收购了之后好像没有在其官方网站上看到G4J的消息,如果大家感兴趣,The Server Side 上有说G4J的文章可以参考。
其次,A4J除了能很顺手的用手工编写Jsp的方式书写(废话),Exadel公司还出了一款功能强大的Eclipse Plugin:Exadel Studio Pro,现在也一并给了Jboss,并可以免费使用,而且将于今年夏天开源,感兴趣的朋友可以试用下。
现在让我们用一个注册页面的小例子,看看他的几个简单的功能:
1.根据鼠标事件,自动验证输入值并返回结果
效果1:验证中
效果2:验证错误
效果3:验证成功
功能很简单,代码也简单:
xml 代码
<t:column><a4j:region id="reg_email">
- <a4j:region id="reg_email">
- <t:panelGrid columns="4" cellpadding="0" cellspacing="0"
- border="0">
- <t:column width="12">
- <t:outputText value="电子邮件" />
- t:column>
- <t:column>
- <t:inputText value="#{loginBean.email}" id="email">
- <a4j:support
- actionListener="#{loginBean.processEmailValidation}"
- event="onblur" reRender="detail_mail">
- a4j:support>
- t:inputText>
- t:column>
- <t:column>
- <a4j:status for="reg_email">
- <f:facet name="start">
- <t:panelGrid border="1" cellpadding="0" cellspacing="0"
- columns="1" styleClass="bighei" bgcolor="#FFF200">
- <t:outputText value="验证中.." />
- t:panelGrid>
- f:facet>
- <f:facet name="stop">
- <a4j:outputPanel id="detail_mail">
- <t:panelGrid border="1" cellpadding="0" cellspacing="0"
- columns="1" styleClass="bighei" bgcolor="#FFF2E9"
- rendered="#{!loginBean.validEmail}">
- <t:outputText value="#{loginBean.validEmailStr}">t:outputText>
- t:panelGrid>
- <t:panelGrid border="1" cellpadding="0" cellspacing="0"
- columns="1" styleClass="bighei" bgcolor="#E2F5FF"
- rendered="#{loginBean.validEmail}">
- <t:outputText value="邮箱地址填写正确!">t:outputText>
- t:panelGrid>
- a4j:outputPanel>
- f:facet>
- a4j:status>
- t:column>
- t:panelGrid>
- a4j:region>
加粗的部分是a4j的一些页面片段,简单介绍一下:
xml 代码
- <a4j:support
- actionListener="#{loginBean.processEmailValidation}"
- event="onblur" reRender="detail_mail">
- a4j:support>
监听inputText 的鼠标事件onblur,并执行loginBean中的processEmailValidation方法,执行完毕后刷新id为"detail_mail"的标签区域。<a4j:status for="reg_email"></a4j:status><a4j:status for="reg_email"><a4j:outputpanel id="detail_mail"><a4j:status for="reg_email">监听reg_email定义的区域中的状态变化, 并通过<f:facet name="&lt;strong&gt;start</strong>"></f:facet><f:facet name="start"><f:facet name="start">和<f:facet name="stop"></f:facet><f:facet name="stop"><f:facet name="start"><f:facet name="stop">显示状态改变时,和改变后的页面。<a4j:outputpanel id="detail_mail"></a4j:outputpanel><a4j:outputpanel id="detail_mail"> </a4j:outputpanel></f:facet></f:facet></f:facet></f:facet></f:facet></a4j:status></a4j:outputpanel></a4j:status><a4j:status for="reg_email"><a4j:outputpanel><a4j:status for="reg_email"><f:facet name="start"><f:facet name="stop"><f:facet name="start"><f:facet name="stop"><a4j:outputpanel>中的内容比较简单,根据bean中的validEmail属性的值,决定显示那个panelgrid。这里应该有更简单的写法,不知道大家有没有发现?</a4j:outputpanel></f:facet></f:facet></f:facet></f:facet></a4j:status></a4j:outputpanel></a4j:status>
bean部分的验证代码更简单:
java 代码
- public void processEmailValidation(ActionEvent input) {
- if (ModelValidation.validateEmail(getEmail())) {
- try {
- userService.checkEmail(getEmail());
- setValidEmail(true);
- }
- catch (ReduplicateException e) {
- setValidEmail(false);
- setValidEmailStr("对不起,此email已被注册!");
- }
- }
- else {
- setValidEmail(false);
- setValidEmailStr("邮件地址格式错误!");
- }
- }
其中userService通过Ioc注入,与数据库交互,并进行一些简单的如长度等的验证。
2.验证码图片,并可通过点击图片自身来刷新
效果:
页面代码:
xml 代码
- <a4j:outputPanel id="detail_media">
- <a4j:commandLink reRender="detail_media">
- <a4j:mediaOutput element="img" cacheable="false"
- session="false" createContent="#{loginBean.paint}"
- value="#{paintData}" mimeType="image/jpeg" />
- a4j:commandLink>
- a4j:outputPanel>
java bean中代码:
java 代码
- public void paint(OutputStream out, Object data) throws IOException {
- if (data instanceof PaintData) {
- PaintData paintData = (PaintData) data;
-
- Random randomNumber = new Random();
- int outPutNumber_int = 0;
- while (outPutNumber_int < 1000) {
- outPutNumber_int = randomNumber.nextInt(9999);
- }
-
- int outPutLine = 0;
- outPutLine = randomNumber.nextInt(100);
- String outPutNumber_str = String.valueOf(outPutNumber_int);
- BufferedImage img = new BufferedImage(paintData.getWidth(),
- paintData.getHeight(), BufferedImage.TYPE_INT_RGB);
- Graphics2D graphics2D = img.createGraphics();
- graphics2D.setBackground(paintData.getBackground());
- graphics2D.setColor(paintData.getDrawColor());
- graphics2D.clearRect(0, 0, paintData.getWidth(), paintData
- .getHeight());
- graphics2D.drawLine(outPutLine, outPutLine, paintData.getWidth()
- - outPutLine, paintData.getHeight() - outPutLine);
- graphics2D.drawString(outPutNumber_str, 19, 16);
- ImageIO.write(img, "jpeg", out);
- }
- }
简单聊一下,中的paint方法得到图片的流。这个方法必须这样定义:public void paint(OutputStream out, Object data).出图片的方法很多,这里出个最简单的做例子。
页面则更为简单,除了之前说的
上面2个例子没有写任何js,java bean也没有做过多的更改,个人认为a4j还是比较容易与jsf结合的。而建立在a4j之上的richi faces组件有着更好的页面效果和更丰富的功能。
</a4j:region></t:column>
分享到:
- 2007-03-09 16:57
- 浏览 9857
- 评论(6)
- 论坛回复 / 浏览 (6 / 10036)
- 查看更多
相关推荐
安装Ajax4JSF通常涉及以下几个步骤: 1. 下载Ajax4JSF的JAR文件。 2. 将JAR文件添加到项目的类路径中。 3. 在Web.xml中配置Ajax4JSF的监听器和过滤器。 4. 在JSF页面中导入Ajax4JSF的命名空间。 ### 3. Ajax4JSF 的...
在这个例子中,我们将深入探讨JSF 2.0如何实现Ajax功能,并通过详细的中文注释来辅助理解。** ### 1. JSF 2.0 的Ajax基础 Ajax(Asynchronous JavaScript and XML)允许在不刷新整个页面的情况下更新部分网页内容...
这个例子可能包含了以下几个关键步骤: 1. **创建JSF工程**:首先,你需要在Eclipse中新建一个Dynamic Web Project。确保选择JSF支持,并指定JSF的版本,比如JSF 2.x。此外,你可能还需要配置Apache Tomcat或类似的...
在JSF中创建一个简单的“Hello World”程序涉及到以下几个步骤: 1. **配置环境**:确保你已经安装了Java Development Kit (JDK) 和一个支持JSF的服务器,如Tomcat或GlassFish。接着,添加JSF库到项目的类路径中,...
在学习JSF时,了解和掌握以下几个关键点至关重要: 1. **Facelets** - JSF 2.0引入的新视图技术,取代了之前的JSP作为默认视图表示,使得页面结构更清晰,更易于维护。 2. **Managed Beans** - 用于存储和处理业务...
一个关于ssha最基础的集合的例子,还用到了json。这个小项目用到了struts,spring,hibernate,异步刷新(ajax),json等技术。如果你刚接触这几个框架,或是想尝试结合这几个框架,那这个项目对你来说很有用。
在这个例子中,`#{globalregionmb.allProvinceList}`、`#{globalregionmb.allSecondCityList}` 和 `#{globalregionmb.allThirdCityList}` 就是这些数据列表。 2. **JSF组件**: - 使用`h:selectOneMenu`来创建下拉...
在"Jsf2.0 Reference"中,我们能够深入理解JSF的核心概念和技术,这包括但不限于以下几个方面: 1. **JSF生命周期**:JSF组件有其独特的生命周期,包括六种阶段:恢复视图、应用请求值、处理验证、更新模型值、调用...
我们将探讨以下几个关键知识点: 1. **JSF 概述** JSF 是一种组件驱动的MVC(Model-View-Controller)框架,它简化了创建和维护Web应用的过程。JSF 提供了一组UI组件、事件处理机制以及数据绑定功能,让开发者可以...
然后,创建一个简单的JSF项目通常包括以下几个步骤: 1. 创建一个新的Web项目并配置JSF支持。 2. 创建JSF页面(`.xhtml` 文件),使用JSF组件编写用户界面。 3. 编写后端的Java类(通常称为 Managed Beans),这些...
**描述中提到的"jsf教程原蚂"** 暂未提供具体的描述,但通常一个JSF教程会包括以下几个关键部分: 1. **JSF基础**:介绍JSF的基本架构,包括组件库、生命周期、事件处理和渲染过程。 2. **组件使用**:讲解JSF中的...
- **书籍**:作为商品的一个具体例子,在系统中可以添加、删除、修改书籍信息。 - **购物车**:记录用户选择的商品列表。 - **订单**:当用户完成购买后,系统会生成订单记录。 用户可以在系统中进行的操作包括但不...
在**《JSF入门》简体中文版**这本书中,读者可以系统地学习JSF的基础知识,包括以下几个主要部分: 1. **JSF基础**:介绍JSF框架的基本架构和工作原理,包括生命周期和渲染过程。JSF通过请求处理周期管理用户交互,...
在JSF中实现树型菜单,你需要做以下几步: 1. **定义模型**:首先,你需要创建一个数据模型,表示树的结构。这通常是一个Java类,包含属性来表示节点的值和子节点列表。例如,你可以创建一个`TreeNode`类,其中包含...
在"JSF实例"中,我们主要关注的是如何使用JSF来实现登录功能,这通常涉及到以下几个关键知识点: 1. **JSF组件库**:JSF提供了多种内置组件,如`<h:inputText>`用于文本输入,`<h:commandButton>`用于提交表单等。...
创建自定义事件通常涉及以下几个步骤: 1. 定义事件类:继承自`javax.faces.event.FacesEvent`,并实现`isAppropriateListener`和`getComponent`方法。 2. 创建事件监听器接口:定义一个接口,包含处理事件的方法...
1. **项目结构**:解压后的richfaces-ui-3.2.2.GA文件夹主要包含以下几个部分: - `src`:源代码目录,包含了所有Java源文件。 - `build.xml`:Ant构建脚本,用于编译、打包和测试源码。 - `docs`:文档目录,...
通常,这样的内容可能包括以下几个方面: 1. **JSF架构**:JSF框架由一系列组件、渲染器、事件处理机制和生命周期组成。开发者可以通过定义自定义组件来扩展其功能。JSF的生命周期包括六到七个阶段,包括恢复视图、...
在给定的信息中,我们可以看到几个关键文件,它们共同构成了这个jQuery日历插件的组成部分。 1. **calendar.css**:这是一个CSS样式文件,用于定义日历控件的外观和布局。它可能包含各种CSS规则,如颜色、字体、...
- **工具开发步骤:**通常,开发自定义工具涉及以下几个步骤:定义工具的输入参数、定义工具的执行逻辑、返回结果给客户端等。 - **工具示例:**一个具体的例子是实现一个空间查询工具,该工具可以根据用户提供的...