JSF简单Ajax示例

今天,我们将看到一些使用JSF的Ajax简单样本。

如果要查看有关JSF / Web应用程序的其他文章,请单击以下链接: 重定向后的JSF持久化对象和消息 , 使用JAAS和JSF进行用户登录验证 , JSF:Converter and Bean AutoComplete , JSF – Hello World,Auto Complete , 在WebApp上处理异常 , 用户身份验证(过滤器/ Servlet) , 创建WebServer 。

在本文的结尾,您将找到下载示例源代码的链接。 在本文( 使用JAAS和JSF进行用户登录验证 )中,我展示了如何安装JBoss 6,以防您从今天开始运行该项目。 您将需要在Eclipse中安装JBoss工具插件。

看一下下面的页面及其代码:

<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml' xmlns:ui='http://java.sun.com/jsf/facelets' xmlns:h='http://java.sun.com/jsf/html'xmlns:f='http://java.sun.com/jsf/core'>
<h:head>
</h:head>
<h:body><h:form>Your Name: <h:inputText id='inputname' label='${msgs.prompt}' value='#{user.name}'/><br /><h:commandButton action='#{user.sayHello}' value='Display my name here, now!'/><br /></h:form>
</h:body>
</html>

我们如何使用Ajax在同一屏幕上显示键入的名称? 小菜一碟,只需添加“ f:ajax”组件。 检查代码更新和结果:

<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml' xmlns:ui='http://java.sun.com/jsf/facelets' xmlns:h='http://java.sun.com/jsf/html'xmlns:f='http://java.sun.com/jsf/core'>
<h:head>
</h:head>
<h:body><h:form>Your Name: <h:inputText id='inputname' label='${msgs.prompt}' value='#{user.name}'/><br /><h:commandButton action='#{user.sayHello}' value='Display my name here, now!'><f:ajax render='myName' execute='inputname' /></h:commandButton><br /><br /><h:outputText id='myName' value='#{user.name}' /></h:form>
</h:body>
</html>

很容易吧? 我们只需要将“ execute”参数传递给ManagedBean的值即可; 使用“ render”参数,我们将告知JSF“刷新”哪个组件。

还要注意,键入的名称将出现在控制台中。

使用此代码,我们可以“刷新”所有类型的组件。 让我们看看另一个示例?

如果用户键入的名称少于4个字符,我们将显示一条错误消息。

检查我们的新消息和新代码:

<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml' xmlns:ui='http://java.sun.com/jsf/facelets' xmlns:h='http://java.sun.com/jsf/html'xmlns:f='http://java.sun.com/jsf/core'>
<h:head>
</h:head>
<h:body><h:form><h:messages id='myMessage' globalOnly='true' showDetail='true'/>Your Name: <h:inputText id='inputname' label='${msgs.prompt}' value='#{user.name}'/><br /><h:commandButton action='#{user.sayHello}' value='Display my name here, now!'><f:ajax render='myName myMessage' execute='inputname' /></h:commandButton><br /><br /><h:outputText id='myName' value='#{user.name}' /></h:form>
</h:body>
</html>
package demo;import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;/*** Created by JBoss Tools*/
@ManagedBean(name = 'user')
@RequestScoped
public class User {private String name;public String sayHello() {if (isNameIncorrect()) {FacesContext context = FacesContext.getCurrentInstance();context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, 'Too small', 'Can you write it a little bigger?'));}System.out.println(name);return null;}private boolean isNameIncorrect() {return ''.equals(name.trim()) || name.length() < 3;}public String getName() {return name;}public void setName(String name) {this.name = name;}
}

请注意,我们具有“ h:messages”组件,其ID在“ f:ajax”组件中使用。 当您使用“ h:message for =” YYY ”组件时,此代码也适用。

如果我们现在使用组合框怎么办? 让我们显示一个组合框,当我们使用少于6个字符的名称时,将包含4个项目;如果键入的名称超过6个字符,则将显示一个包含4个以上项目的列表。

package demo;import java.util.ArrayList;
import java.util.List;import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.component.UISelectItems;
import javax.faces.component.html.HtmlSelectOneMenu;
import javax.faces.context.FacesContext;
import javax.faces.event.AjaxBehaviorEvent;/*** Created by JBoss Tools*/
@ManagedBean(name = 'user')
@RequestScoped
public class User {private String name;private List<String> cars;private String selectedCar;private HtmlSelectOneMenu htmlSelectCars;private static final String SELECT_A_CAR = 'Select One Car';public User() {cars = new ArrayList<String>();}public String sayHello() {if (isNameInCorrect()) {FacesContext context = FacesContext.getCurrentInstance();context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, 'Too small', 'Can you write it a little bigger?'));}System.out.println(name);return null;}private boolean isNameInCorrect() {return name == null || ''.equals(name.trim()) || name.length() < 3;}public String getName() {return name;}public void setName(String name) {this.name = name;}public void editMyCarsList(AjaxBehaviorEvent event) {if (htmlSelectCars == null) {htmlSelectCars = new HtmlSelectOneMenu();}htmlSelectCars.getChildren().clear();UISelectItems items = new UISelectItems();items.setValue(getCars());htmlSelectCars.getChildren().add(items);}public List<String> getCars() {cars.clear();cars.add(SELECT_A_CAR);if (!isNameInCorrect() && name.length() >= 6) {cars.add('Ferrari');cars.add('Porch');cars.add('Beetle');cars.add('Opala');cars.add('Passat');cars.add('Vectra');cars.add('Chevet');cars.add('Corvet');} else {cars.add('Ferrari');cars.add('Porch');cars.add('Beetle');cars.add('Opala');}return cars;}public void setCars(List<String> cars) {this.cars = cars;}public String getSelectedCar() {return selectedCar;}public void setSelectedCar(String selectedCar) {this.selectedCar = selectedCar;}public HtmlSelectOneMenu getHtmlSelectCars() {editMyCarsList(null);return htmlSelectCars;}public void setHtmlSelectCars(HtmlSelectOneMenu htmlSelectCars) {this.htmlSelectCars = htmlSelectCars;}
}

现在看一下我们的页面:

<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml' xmlns:ui='http://java.sun.com/jsf/facelets' xmlns:h='http://java.sun.com/jsf/html'xmlns:f='http://java.sun.com/jsf/core'>
<h:head>
</h:head>
<h:body><h:form><h:messages id='myMessage' globalOnly='true' showDetail='true' />Your Name: <h:inputText id='inputname' label='${msgs.prompt}' value='#{user.name}' /><br /><h:commandButton action='#{user.sayHello}' value='Display my name here, now!'><f:ajax render='myName myCars myMessage' execute='inputname' listener='#{user.editMyCarsList}' /></h:commandButton><br /><br /><h:outputText id='myName' value='#{user.name}' /><br /><br />Choose your car: <h:selectOneMenu id='myCars' binding='#{user.htmlSelectCars}' value='#{user.selectedCar}' /><br /><br /></h:form>
</h:body>
</html>

请注意,我们的组合框项目大小会根据键入的名称进行更新。 在本文的结尾,我将详细讨论为什么我对HtmlSelectOneMenu使用binding属性而不是返回List <String>。

作为最后一个示例,让我们创建一个组合框,该组合框将根据Car组合框中的选定值出现和消失。

看看我们的ManagedBean:

package demo;import java.util.ArrayList;
import java.util.List;import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.component.UISelectItems;
import javax.faces.component.html.HtmlSelectOneMenu;
import javax.faces.context.FacesContext;
import javax.faces.event.AjaxBehaviorEvent;/*** Created by JBoss Tools*/
@ManagedBean(name = 'user')
@RequestScoped
public class User {private String name;private List<String> cars;private List<String> colors;private String selectedCar;private String selectedColor;private HtmlSelectOneMenu htmlSelectCars;private static final String SELECT_A_CAR = 'Select One Car';public User() {cars = new ArrayList<String>();colors = new ArrayList<String>();colors.add('Red');colors.add('Blue');colors.add('Orange');colors.add('Pink --> O.o');}public String sayHello() {if (isNameInCorrect()) {FacesContext context = FacesContext.getCurrentInstance();context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, 'Too small', 'Can you write it a little bigger?'));}System.out.println(name);return null;}private boolean isNameInCorrect() {return name == null || ''.equals(name.trim()) || name.length() < 3;}public String getName() {return name;}public void setName(String name) {this.name = name;}public void editMyCarsList(AjaxBehaviorEvent event) {if (htmlSelectCars == null) {htmlSelectCars = new HtmlSelectOneMenu();}htmlSelectCars.getChildren().clear();UISelectItems items = new UISelectItems();items.setValue(getCars());htmlSelectCars.getChildren().add(items);}public List<String> getCars() {cars.clear();cars.add(SELECT_A_CAR);if (!isNameInCorrect() && name.length() >= 6) {cars.add('Ferrari');cars.add('Porch');cars.add('Beetle');cars.add('Opala');cars.add('Passat');cars.add('Vectra');cars.add('Chevet');cars.add('Corvet');} else {cars.add('Ferrari');cars.add('Porch');cars.add('Beetle');cars.add('Opala');}return cars;}public void setCars(List<String> cars) {this.cars = cars;}public String getSelectedCar() {return selectedCar;}public void setSelectedCar(String selectedCar) {this.selectedCar = selectedCar;}public List<String> getColors() {return colors;}public void setColors(List<String> colors) {this.colors = colors;}public boolean isColorsAlloweToDisplay() {if (isNameInCorrect()) {return false;}if (selectedCar == null || selectedCar.trim().equals('') || selectedCar.equals(SELECT_A_CAR)) {return false;}return true;}public String getSelectedColor() {return selectedColor;}public void setSelectedColor(String selectedColor) {this.selectedColor = selectedColor;}public HtmlSelectOneMenu getHtmlSelectCars() {editMyCarsList(null);return htmlSelectCars;}public void setHtmlSelectCars(HtmlSelectOneMenu htmlSelectCars) {this.htmlSelectCars = htmlSelectCars;}
}

我们的ManagedBean进行了轻微更新,我们只是添加了一个List,该List的方法返回了将填充组合框的颜色列表。 我们还添加了一个方法,该方法将返回布尔值-如果允许显示组合框,则返回true。

检查我们的新页面:

<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>
<html xmlns='http://www.w3.org/1999/xhtml' xmlns:ui='http://java.sun.com/jsf/facelets' xmlns:h='http://java.sun.com/jsf/html'xmlns:f='http://java.sun.com/jsf/core'>
<h:head>
</h:head>
<h:body><h:form><h:messages id='myMessage' globalOnly='true' showDetail='true' />Your Name: <h:inputText id='inputname' label='${msgs.prompt}' value='#{user.name}' /><br /><h:commandButton action='#{user.sayHello}' value='Display my name here, now!'><f:ajax render='myName myCars myMessage myColors' execute='inputname' listener='#{user.editMyCarsList}' /></h:commandButton><br /><br /><h:outputText id='myName' value='#{user.name}' /><br /><br />Choose your car:<h:selectOneMenu id='myCars' binding='#{user.htmlSelectCars}' value='#{user.selectedCar}'><f:ajax render='myColors' execute='inputname myCars'/></h:selectOneMenu><br /><br /><h:panelGroup id='myColors'><h:selectOneMenu value='#{user.selectedColor}' rendered='#{user.colorsAlloweToDisplay}'><f:selectItems value='#{user.colors}' /></h:selectOneMenu></h:panelGroup></h:form></h:body>
</html>

我将讨论帖子中使用的代码:

  • HtmlSelectOneMenu –我使用组件而不是列表,因为JSF在用户屏幕(DOM树)中呈现组件的效果不是很好。 如果您的组合框有4行,并且使用ajax将更多行添加到列表中,那么JSF / Ajax将无法识别新添加的行; 您将只能使用旧值。 您可以尝试将代码与List <String>一起使用,而不是使用HtmlSelectOneMenu来查看结果; 我花了大约3到4个小时来通过互联网上的大量搜索来了解这一点。
  • “ h:panelGroup”组件内的HtmlSelectOneMenu –我这样做是因为每次您要呈现未呈现的组件时,都需要更新其容器。 如果我们的selectOne位于汽车selectOne的同一窗体内,则需要呈现所有窗体。

单击此处下载此文章的代码 。

希望这篇文章对您有所帮助。

如果您有任何疑问/疑问/建议,请将其发布。

参考: uaiHebert博客上来自JCG合作伙伴 Hebert Coelho的JSF Simple Ajax Samples 。


翻译自: https://www.javacodegeeks.com/2012/07/jsf-simple-ajax-samples.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/371703.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常用的好用的window工具

1. FastStone Capture截图录屏软件 百度软件中心&#xff1a;http://rj.baidu.com/soft/detail/13504.html?ald 注册企业版&#xff1a; 用户名&#xff1a;c1ikm 注册码&#xff1a;AXMQX-RMMMJ-DBHHF-WIHTV 中文输入乱码解决方法&#xff1a; 2. Notepad文本编辑器&#xff…

表分区

http://www.cnblogs.com/leestar54/p/6225821.html转载于:https://www.cnblogs.com/jouny/p/6262850.html

java飞鸽传书_feige 飞鸽传书源代码java 实现不错的联系网络编程的资料飞鸽传书的GUI(java实现) - 下载 - 搜珍网...

我的飞鸽传书/FileFilter.java我的飞鸽传书/FileNameExtensionFilter.java我的飞鸽传书/飞鸽传书/classes/feige/About.class我的飞鸽传书/飞鸽传书/classes/feige/ConnectOthers$ReadMessageThread.class我的飞鸽传书/飞鸽传书/classes/feige/ConnectOthers.class我的飞鸽传书…

JAXB和根元素

XmlRootElement是人们习惯于与JAXB&#xff08;JSR-222&#xff09;一起使用的注释。 目的是将根元素与类唯一关联。 由于JAXB类映射到复杂类型&#xff0c;因此一个类有可能对应于多个根元素。 在这种情况下&#xff0c;无法使用XmlRootElement &#xff0c;人们开始感到有些困…

python socket模块实现udp通信_Python基于socket模块实现UDP通信功能示例

Python基于socket模块实现UDP通信功能示例本文实例讲述了Python基于socket模块实现UDP通信功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a;一 代码1、接收端import socket#使用IPV4协议&#xff0c;使用UDP协议传输数据ssocket.socket(socket.AF_INET, socket.SOC…

Hibernate缓存基础知识

最近&#xff0c;我尝试了休眠缓存。 在这篇文章中&#xff0c;我想分享我的经验&#xff0c;并指出Hibernate Second Level Cache的一些细节。 在此过程中&#xff0c;我将指导您阅读一些有助于实现缓存的文章。 让我们从地面开始。 在休眠状态下缓存 缓存功能旨在减少必要的…

TP3.2之WHERE组合条件处理

1、条件都是int类型&#xff1a; $User->where(type1 AND status1)->select(); 2、条件包含字符串类型&#xff1a; 使用3.1以上版本的话&#xff0c;使用字符串条件的时候&#xff0c;建议配合预处理机制&#xff0c;确保更加安全&#xff0c; $Model->where("i…

linux-ssh远程后台执行脚本-放置后台执行问题(转)

写了一个监控负载的小脚本&#xff08;死循环&#xff0c;测试结束后再kill对应进程&#xff09;&#xff0c;因需要监控多台服务器&#xff0c;所以在一台服务器上使用ssh统一执行脚本遇到问题&#xff1a;使用ssh root172.16.146.20 /usr/local/luly/loadavg.sh 2 2 &执行…

python2.7输入函数_Python2.7的用户输入函数有问题,无法让这些输入与程序一起工作...

我对python世界还是个新手&#xff0c;虽然我已经用php做了很多工作。。。这是我的案子。。。在我正在用python2.7为我的小程序编写一些代码。在在那个程序中&#xff0c;我需要2个用户输入&#xff0c;它们都是数字。在第一个数字不得大于11&#xff0c;也不得小于0。在第二个…

创建Java动态代理

Java动态代理机制提供了一种有趣的方式来创建代理实例。 不过&#xff0c;创建动态代理的步骤有些繁琐&#xff0c;请考虑将代理用于审核服务实例的方法调用所花费的时间– public interface InventoryService {public Inventory create(Inventory inventory);public List<I…

html5有哪些新特性、移除了那些元素?如何处理HTML5新标签的浏览器兼容问题?如何区分 HTML 和 HTML5?...

新特性&#xff1a; 1. 拖拽释放(Drag and drop) API 2. 语义化更好的内容标签&#xff08;header,nav,footer,aside,article,section&#xff09; 3. 音频、视频API(audio,video) 4. 画布(Canvas) API 5. 地理(Geolocation) API 6. 本地离线存储 localStorage 长期存储数据&am…

Substring with Concatenation of All Words 题解

题意 You are given a string, s, and a list of words, words, that are all of the same length. Find all starting indices of substring(s) in s that is a concatenation of each word in words exactly once and without any intervening characters. For example, give…

java udp丢包_linux 系统 UDP 丢包问题分析思路

最近工作中遇到某个服务器应用程序 UDP 丢包&#xff0c;在排查过程中查阅了很多资料&#xff0c;总结出来这篇文章&#xff0c;供更多人参考。在开始之前&#xff0c;我们先用一张图解释 linux 系统接收网络报文的过程。● 首先网络报文通过物理网线发送到网卡● 网络驱动程…

【SQL】分组数据,过滤分组-group by , having

学习笔记&#xff0c;原文来自http://blog.csdn.net/robinjwong/article/details/24845125 创建分组 - GROUP BY 分组是在SELECT语句的GROUP BY子句中建立的。它的作用是通过一定的规则将一个数据集划分成若干个小的区域&#xff0c;然后针对若干个小区域进行数据处理。SELECT子…

使用EasyMock或Mockito

我大部分时间都在使用EasyMock &#xff0c;但是最近我和一些非常愿意使用Mockito的人一起工作。 我不打算在同一项目中使用两个框架来实现相同的目的&#xff0c;因此我采用了Mockito 。 因此&#xff0c;在过去的几个月中&#xff0c;我一直在使用Mockito &#xff0c;这是我…

CentOS下iptables 配置详解

如果你的IPTABLES基础知识还不了解,建议先去看看. 开始配置 我们来配置一个filter表的防火墙. (1)查看本机关于IPTABLES的设置情况 [roottp ~]# iptables -L -nChain INPUT (policy ACCEPT)target prot opt source destination Chain FORWARD (policy…

java lambda 多个参数_Java Lambda行为参数化

Java Lambda行为参数化我们可以将lambda表达式作为参数传递给方法。例子以下代码创建了一个名为Calculator的函数接口。在Calculator中有一个称为calculate的方法&#xff0c;它接受两个int参数并返回一个int值。在Main类中有一个引擎方法&#xff0c;它接受函数接口Calculator…

具有关联映射的Hibernate Composite ID

最近&#xff0c;我们面临着带有复合id字段的休眠关联映射的棘手情况。 我们需要与一对一和多对一建立双向关联。我们的拖曳表是“ REPORT”和“ REPORT_SUMMARY”&#xff0c;它们之间具有从REPORT到REPORT_SUMMARY的一对多关系&#xff0c;而从REPORT_SUMMARY到REPORT表。 RE…

ZooKeeper应用场景

ZooKeeper是一个高可用的分布式数据管理与系统协调框架。基于对Paxos算法的实现&#xff0c;使该框架保证了分布式环境中数据的强一致性&#xff0c;也正是基于这样的特性&#xff0c;使得ZooKeeper解决很多分布式问题。网上对ZK的应用场景也有不少介绍&#xff0c;本文将结合作…