在实际开发中有时会遇到这样一种情况:
页面上有三个组件一个组件是名字的输入框,该输入框的是必填项,一个是国家的下拉框,一个是城市的下拉框,要实现更改国家下拉框的数值会自动修改城市下拉框的数值。并且名字输入框是必须填写的。
我们知道名字的校验过程发生在jsf生命周期中 “过程验证”和“更新模型属性”两个阶段之间。因此如果我们不填写名字的输入框,直接点击国家列表中的数值,那么城市列表尽管已经出现但是页面中会出现“名称不能为空”的错误提示。这个时候我们就要改变国家类表的组件的immedate的属性为true,并且在该组件的valueChangeListener事件处理最后写生contex.renderResponse 这个样子,这个组件的校验会在jsf阶段之 过程验证之前,请求应用数值阶段时候调用,并且调用listeners之后不再调用其他别的阶段,直接相应用户,如此一来不填写名称输入框,直接点击国家列表 刷新页面之后就不会再出现名验证的错误信息,下面是实例:
1,页面registForm.xhtml
<?xml version="1.0" encoding="UTF-8"?>
<!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" xml:lang="en" lang="en">
<h:head>
<title>registForm</title>
</h:head>
<h:body>
<h:form>
<h:inputText id="name" value="#{registForm.name}" required="true">
</h:inputText>
<h:message for="name"></h:message>
<!-- immedate属性是跳过四个jsf阶段的重要属性 -->
<h:selectOneMenu id="select" valueChangeListener="#{registForm.myEvent}" onchange="submit();"
value="#{registForm.selectedContent}" immediate="true">
<f:selectItems value="#{registForm.countryItems}"></f:selectItems>
</h:selectOneMenu><br/>
<h:selectOneMenu id="selectCity"
value="#{registForm.selectCity}">
<f:selectItems value="#{registForm.cityItems}"></f:selectItems>
</h:selectOneMenu><br/>
<h:outputText id="result" value="#{registForm.result}"></h:outputText>
</h:form>
</h:body>
</html>
2,受管bean RegisterAction.java
package com.jsf.bean;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.faces.context.FacesContext;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
public class RegisterAction {
private String name;
//改变下拉框后,输出框中的内容id
private String result;
//下拉框国家的id
private String selectedContent = null;
//国家列表
private ArrayList countryItems = null;
//下拉框城市的id
private String selectCity = null;
//城市下拉框中的列表
private List cityItems = null;
//定义三个城市的类表
private static List china = new ArrayList();
private static List america = new ArrayList();
private static List japan = new ArrayList();
static{
china.add(new SelectItem("北京","北京",null));
china.add(new SelectItem("上海","上海",null));
china.add(new SelectItem("广州","广州",null));
china.add(new SelectItem("深圳","深圳",null));
america.add(new SelectItem("纽约","纽约",null));
america.add(new SelectItem("华盛顿","华盛顿",null));
america.add(new SelectItem("旧金山","旧金山",null));
america.add(new SelectItem("加州","加州",null));
japan.add(new SelectItem("东京","东京",null));
japan.add(new SelectItem("神户","神户",null));
japan.add(new SelectItem("广岛","广岛",null));
japan.add(new SelectItem("长崎","长崎",null));
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSelectCity() {
return selectCity;
}
public void setSelectCity(String selectCity) {
this.selectCity = selectCity;
}
public String getSelectedContent() {
return selectedContent;
}
public List getCityItems() {
return cityItems;
}
public void setCityItems(List cityItems) {
this.cityItems = cityItems;
}
public void setSelectedContent(String selectedContent) { //保持下拉框的状态不改变
this.selectedContent = selectedContent;
}
public String getResult() {
return result;
}
public void setResult(String result) {
this.result = result;
}
//国家下拉类表中的值改变之后的action事件
public void myEvent(ValueChangeEvent e) { //下拉框改变时触发的事件
System.out.println("you change the value fo ");
FacesContext context = FacesContext.getCurrentInstance();
String clientId = e.getComponent().getId();
if (clientId.equals("select")) {
setResult(e.getNewValue().toString());
if(e.getNewValue().toString().equals("中国")){
setCityItems(china);
}
if(e.getNewValue().toString().equals("美国")){
setCityItems(america);
}
if(e.getNewValue().toString().equals("日本")){
setCityItems(japan);
}
}
//下面的这句将会掉过jsf六个阶段中的“过程验证”,“更新模型的数值”
//“调用应用程序”,"呈现相应"的阶段。
//而必填项名称的验证则会在提交动作激发后的六个jsf生命周期中验证
context.renderResponse();
}
//在创建bean之后,呈现视图之前给国家列表中的内容赋值
public Collection getCountryItems() { //给下拉框赋值
SelectItem aa= new SelectItem();
if (countryItems == null) {
countryItems = new ArrayList();
countryItems.add(new SelectItem("中国", "中国", null));
countryItems.add(new SelectItem("美国", "美国", null));
countryItems.add(new SelectItem("日本", "日本", null));
}
return countryItems;
}
public void setCountryItems(ArrayList<SelectItem> countryItems) {
this.countryItems = countryItems;
}
}
分享到:
相关推荐
在Java企业级应用开发中,`javax.enterprise.context.jar`是一个非常关键的库,它包含了用于管理组件生命周期的Contexts and Dependency Injection (CDI) API。CDI是Java EE平台的一个重要部分,它提供了依赖注入...
org.springframework.web.context.support.ServletContextPropertyPlaceholderConfigurer.class org.springframework.web.context.support.ServletContextResource.class org.springframework.web.context.support....
jsf-facelets.jar 1.1.15.B1
在本教程中,我们将深入探讨JSF的核心概念、基本组件以及如何在实际项目中应用JSF。 1. **JSF框架概述** JSF框架的核心目标是简化Java Web开发,通过提供声明式编程模型来减少代码量。它将UI组件、业务逻辑和数据...
在JavaServer Faces (JSF) 开发环境中,IntelliJ IDEA (IDEA) 是一个流行的集成开发环境。...理解并熟练运用javax.faces.jar和javax-inject.jar中的组件和服务,对于提升JSF应用的开发效率和质量至关重要。
5. **AJAX支持**:内建的AJAX功能使得用户界面更动态,可以通过JSF组件触发异步更新。 6. **Composite Components**:允许开发者创建可重用的UI组件,提高了代码复用和组件化开发的能力。 `jsf-api-2.0.3.jar` 包含...
- **后台生成**:在JSF Managed Bean中,可以使用Java代码动态创建UIComponent实例,并设置其属性,然后添加到组件树中。 - **EL表达式**:使用Expression Language (EL)动态生成JSF标签,例如通过循环结构创建一...
JavaScript全栈框架(JSF,JavaServer Faces)是Oracle公司推出的用于构建Web应用程序的一种技术,它简化了前端和后端的交互,提供了丰富的组件库和事件处理机制。JSF是基于MVC(Model-View-Controller)设计模式的...
3. **数据绑定和验证**:JSF支持将组件的值与后台bean的属性直接绑定,简化了数据的获取和更新。同时,提供了内置的验证机制,可以自定义验证规则,确保输入数据的有效性。 4. **事件处理**:JSF中的组件可以触发和...
在JSF中,开发者可以使用预定义的UI组件来构建页面,这些组件可以与后端的数据模型进行交互,简化了前端与后端的集成。 这个"JSF 学习资料和jar 包.zip"压缩文件包含了JSF开发所需的关键资源,主要是8个jar包和学习...
unofficial-primefaces, PrimeFaces JSF组件的非官方镜像 PrimeFaces非官方产品。 PrimeFaces JSF组件的非官方镜像为什么?新Maintanance策略没有从 PrimeFaces 3.5开始的免费版本。这个工作计划旨在提供免费可用的...
本教程向 Java 程序员介绍如何使用 JSF 组件来构建具有高度交互性的部署在 Apache Geronimo 上的 Java EE 应用程序。本教程假定读者使用 Eclipse 集成开发环境(IDE)作为开发平台。
1. **组件层次结构**:JSF组件树是应用程序的核心,每个组件都有属性、事件和行为。组件可以嵌套,形成复杂的UI结构。 2. **UIComponent接口**:所有JSF组件都实现了UIComponent接口,提供基本的属性和方法,如id、...
**JSF分页组件2详解** JavaServer Faces (JSF) 是Java平台上的一个用于构建Web应用程序的MVC(Model-View-Controller)框架。在处理大量数据时,分页功能是必不可少的,它能够帮助用户更有效地浏览和管理信息。在...
JavaServer Faces(JSF)是一种基于Java的服务器端用户界面组件框架,旨在简化基于Java EE的Web应用程序的开发。JSF的主要特点在于将用户界面组件与后端逻辑分离,从而允许开发人员专注于各自的技术栈而不互相干扰。...
JavaScript Server Faces(JSF)是Java平台上的一种用于构建Web应用程序的框架,它简化了用户界面组件的开发和管理。JSF的核心理念是将界面组件、业务逻辑和数据模型分离,提供了一种声明式的方式来处理用户交互。这...
- Managed Bean是JSF中的核心组件,它们是Java类,可以包含业务逻辑和属性。在上述例子中,`UserBean`有一个`name`属性,以及对应的getter和setter方法。 以上就是JSF入门配置的基本步骤。了解并实践这些配置对于...
除了上述特定功能的标签外,JSF还为所有标签提供了一系列通用属性,这些属性有助于更好地控制标签的行为。 - **id**: 为组件指定一个唯一的标识符,可用于其他组件的引用。 - **binding**: 绑定到UIComponent。 - *...