valueChangeListener不是从<h:selectoneradio>调用的,它位于<h:panelgrid> </h:panelgrid> </h:selectoneradio>的一侧

时间:2012-02-07 17:32:07

标签: jsf-2

我遇到h问题:selectOneRadio的valueChangeListener =“#{user.loadYesNo}” (我在Tomcat-7上使用Mojarra 2-0-8)。 如果我删除了包含'h:selectOneRadio'的panelGrid,那么值更改版本就会被触发。

查看:

<!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><title> Starting JSF</title></h:head>
<h:body>
<h:form>
<h:panelGrid column="2">
    <h:outputLabel>User Name</h:outputLabel>
    <h:inputText id="loginName" value="#{user.userName}"></h:inputText>
    <h:outputLabel>Password</h:outputLabel>
    <h:inputSecret id="loginPassword" value="#{user.password}"></h:inputSecret>
</h:panelGrid>
<h:commandButton value="Submit" action ="#{user.validateLogin}">
    <f:ajax execute="@form" render="yesNoRadioGrid message"></f:ajax>
</h:commandButton>
<h:panelGrid>
    <h:outputText id ="message" value="#{user.message}"></h:outputText>
</h:panelGrid>
<h:panelGrid  id="yesNoRadioGrid">
<h:panelGrid columns="2" rendered="#{user.yesNoRadioGridFlag}">
    <h:outputText id ="otherLbl" value="Select Yes or No"></h:outputText>
    <h:selectOneRadio id="yesNoRadio" value ="#{user.yesNoRadio}" valueChangeListener="#{user.loadYesNo}">
        <f:selectItem itemValue="1"  itemLabel="YES"></f:selectItem>
        <f:selectItem itemValue="0" itemLabel="NO"></f:selectItem>
        <f:ajax event="change" execute="@form" render="userDetailsGrid "></f:ajax>
    </h:selectOneRadio>
</h:panelGrid>
</h:panelGrid>      
<h:message for ="yesNoRadio"> </h:message>
<h:panelGrid  id="userDetailsGrid">
<h:panelGrid columns="2" rendered="#{user.userDetailsGridFlag}">
    <h:outputLabel>Name :</h:outputLabel>
    <h:inputText id="customerName" value="#{user.customerName}"></h:inputText>
    <h:outputLabel>Salary: </h:outputLabel>
    <h:inputText id="customerSalary" value="#{user.customerSalary}"></h:inputText>
</h:panelGrid>
</h:panelGrid>      
</h:form>
</h:body>
</html>   

Model + Controller混合:

    package com.jsf.test;
import javax.faces.bean.*;
import javax.faces.event.ValueChangeEvent;
@ManagedBean
public class User {

private String userName;
private String password;

private String message; 
private String  customerName;
private String  customerSalary;

private Integer yesNoRadio;

private Boolean yesNoRadioGridFlag;
private Boolean userDetailsGridFlag;

public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}

public String getCustomerName() {
return customerName;
}
public void setCustomerName(String customerName) {
this.customerName = customerName;
}
public String getCustomerSalary() {
return customerSalary;
}
public void setCustomerSalary(String customerSalary) {
this.customerSalary = customerSalary;
}

public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getYesNoRadio() {
return yesNoRadio;
}
public void setYesNoRadio(Integer yesNoRadio) {
this.yesNoRadio = yesNoRadio;
}
public Boolean getUserDetailsGridFlag() {
return userDetailsGridFlag;
}
public void setUserDetailsGridFlag(Boolean userDetailsGridFlag) {
this.userDetailsGridFlag = userDetailsGridFlag;
}
public Boolean getYesNoRadioGridFlag() {
return yesNoRadioGridFlag;
}
public void setYesNoRadioGridFlag(Boolean yesNoRadioGridFlag) {
this.yesNoRadioGridFlag = yesNoRadioGridFlag;
}

public String validateLogin() {
if (userName.equals("xyz") && password.equals("xyz")) {
    message = "Login Success";
    yesNoRadioGridFlag = true;
} else {
    yesNoRadioGridFlag = false;
    message = "Login Failure";  
}
    return message; 
}
public void loadYesNo(ValueChangeEvent evt){
Integer yesNoValue = (Integer)evt.getNewValue();
setYesNoRadio(yesNoValue);
userDetailsGridFlag = true;

}


}

1 个答案:

答案 0 :(得分:4)

您需要将bean放在视图范围内,以便为后续请求保留rendered属性的基础条件。

@ManagedBean
@ViewScoped
public class User {
    // ...
}

对于具体问题,

无关,只要您希望在服务器端值更改事件上设置挂钩,就可以使用valueChangeListener,这样您就可以 您手中的旧值和新值。例如,记录事件。它不打算根据更改执行业务操作。为此,您应该使用listener的{​​{1}}属性。

所以,替换

<f:ajax>

<h:selectOneRadio id="yesNoRadio" value ="#{user.yesNoRadio}" valueChangeListener="#{user.loadYesNo}">
    <f:selectItem itemValue="1"  itemLabel="YES"></f:selectItem>
    <f:selectItem itemValue="0" itemLabel="NO"></f:selectItem>
    <f:ajax event="change" execute="@form" render="userDetailsGrid "></f:ajax>
</h:selectOneRadio>

并从方法中删除<h:selectOneRadio id="yesNoRadio" value ="#{user.yesNoRadio}"> <f:selectItem itemValue="1" itemLabel="YES"></f:selectItem> <f:selectItem itemValue="0" itemLabel="NO"></f:selectItem> <f:ajax execute="@form" listener="#{user.loadYesNo}" render="userDetailsGrid"></f:ajax> </h:selectOneRadio> 属性。