欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

jsf之组件的immedate属性,context.renderResponse

程序员文章站 2024-03-13 16:22:15
...
在实际开发中有时会遇到这样一种情况:
页面上有三个组件一个组件是名字的输入框,该输入框的是必填项,一个是国家的下拉框,一个是城市的下拉框,要实现更改国家下拉框的数值会自动修改城市下拉框的数值。并且名字输入框是必须填写的。
我们知道名字的校验过程发生在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;
}
}
相关标签: jsf

上一篇: state

下一篇: STATE