0

我有一个正在使用的屏幕

<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:body>

    <h:form>
    <f:event listener="#{pageload.getPageLoad}" type="preRenderView" />
    <h:dataTable value="#{pageload.fieldConfig}" var="field" 
    columnClasses="lblFirstCol,lblSecondCol,lblThirdCol,lblFourthCol" id="table1" styleClass="tblSecond" >
        <h:column >
        <h:outputText value="#{field.label_name}" />
        </h:column>
        <h:column>              
            <h:inputText value="#{searchdevice.device.terminal_name}" />
        </h:column>

    </h:dataTable> 

    <h:commandButton value="Submit" action="#{searchdevice.searchButtonAction}"/>
    </h:form>
</h:body>

还有我的豆豆

@ManagedBean(name="pageload")
@RequestScoped
public class PageLoadBean {

private List<FieldConfigVO> fieldconfig;
      //getters and setters

      // method  to populate the ArrayList
      public void getPageLoad(){
                   //getting populated from Database
         fieldconfig = common.getFieldConfig("001");        
      }  
  }

另一个输入 bean

@ManagedBean(name="searchdevice")
@RequestScoped
 public class SearchDeviceBean {

private DeviceVO device;




public SearchDeviceBean() {
    device = new DeviceVO();
}

public DeviceVO getDevice() {
    return device;
}

public void setDevice(DeviceVO device) {
    this.device = device;
}

public String searchButtonAction(){
    System.out.println(device.getTerminal_name()+"****TERMINAL NAME******");
            FacesContext context = FacesContext.getCurrentInstance();
    if (context.getMessageList().size() > 0) {
        return(null);
    }else {

        return("success");
    }

}
     }

我的设备对象有 terminal_name 属性。我有一个命令按钮,它调用 SearchDeviceBean 中的方法,并在提交表单时,我输入的任何值都不会被填充

任何帮助表示赞赏

4

1 回答 1

0

您正在preRenderView事件中执行数据初始化逻辑。这是需要为回发准备模型的代码的错误位置。当 JSF 需要在表单提交期间更新模型值时,它会遇到一个完全空的fieldConfig,因此 JSF 无法在其中设置提交/转换/验证的值。在fieldConfig您的情况下,仅在稍后阶段(渲染响应阶段)准备,因此为时已晚。

您需要将其初始化@PostConstruct。它在 bean 的构造和注入依赖之后立即调用。<f:event>完全摆脱整体并在方法@PostConstruct上添加注释。getPageLoad()顺便说一句,我还会将该方法重命名为,init()或者loadFieldConfig()因为它根本不是 getter 方法,因此对于其他阅读/维护您的代码的人来说,这是一个非常令人困惑的名称。

也可以看看:

于 2013-09-16T13:43:30.630 回答