jsf之组件的immedate属性,context.renderResponse
程序员文章站
2024-03-13 16:22:15
...
在实际开发中有时会遇到这样一种情况:
页面上有三个组件一个组件是名字的输入框,该输入框的是必填项,一个是国家的下拉框,一个是城市的下拉框,要实现更改国家下拉框的数值会自动修改城市下拉框的数值。并且名字输入框是必须填写的。
我们知道名字的校验过程发生在jsf生命周期中 “过程验证”和“更新模型属性”两个阶段之间。因此如果我们不填写名字的输入框,直接点击国家列表中的数值,那么城市列表尽管已经出现但是页面中会出现“名称不能为空”的错误提示。这个时候我们就要改变国家类表的组件的immedate的属性为true,并且在该组件的valueChangeListener事件处理最后写生contex.renderResponse 这个样子,这个组件的校验会在jsf阶段之 过程验证之前,请求应用数值阶段时候调用,并且调用listeners之后不再调用其他别的阶段,直接相应用户,如此一来不填写名称输入框,直接点击国家列表 刷新页面之后就不会再出现名验证的错误信息,下面是实例:
1,页面registForm.xhtml
2,受管bean RegisterAction.java
页面上有三个组件一个组件是名字的输入框,该输入框的是必填项,一个是国家的下拉框,一个是城市的下拉框,要实现更改国家下拉框的数值会自动修改城市下拉框的数值。并且名字输入框是必须填写的。
我们知道名字的校验过程发生在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;
}
}