JSF 2.数据表中的动态行生成和绑定字段

时间:2015-03-24 20:21:08

标签: jsf jsf-2 primefaces datatable commandbutton

我是Jsf的新手,我正在尝试在Jsf应用程序中创建以下功能。

  • 使用 - '从日期'显示一行 - '到目前为止' '添加按钮' '删除按钮'
  • 点击“添加”按钮后,应在其旁边添加一行,其中包含2个日期选择器字段和2个按钮。
  • 单击“删除”应删除相应的行。
  • 从日期,到日期 - 这两个字段是来自主要面孔的日期选择器。验证日期字段,使“发件人日期”不在“结束日期”之后。表单中还有其他字段,验证应该在表单提交时进行,而不是在单击“添加/删除”按钮时进行。

以下是我目前开发的代码。请原谅任何错误,因为它仍然是WIP,但我完全愿意接受任何改进代码的建议。

<h:dataTable value="#{personInfo.profileForm.serviceDateList}" var="serviceDateObj" id="servideTblId">
<h:column>
    <p:calendar id="#{serviceDateObj}" binding="#{bindingVar}" value="#{serviceDateObj.fromDate}" size="10" pattern="yyyy-MM-dd" readonlyInput="true" navigator="true" yearRange="1900:2050" required="true" requiredMessage="#{msg['msg.veteran.service.start.required']}"  valueChangeListener="#{personInfo.addDirtyFields}">
        <f:attribute name="fieldName" value="Active Duty Service Start Date"/>
    </p:calendar>
</h:column>
<h:column>
    <h:outputText value="to"/>
</h:column>
<h:column>
    <p:calendar value="#{serviceDateObj.toDate}" size="10" pattern="yyyy-MM-dd" readonlyInput="true" navigator="true" yearRange="1900:2050" required="true" requiredMessage="#{msg['msg.veteran.service.end.required']}"  valueChangeListener="#{personInfo.addDirtyFields}">
        <f:validator validatorId="toDateInPastValidator" />
        <f:attribute name="errMsgNameToField" value="Active Duty Service End Date" />
        <f:attribute name="errMsgNameFromField" value="Active Duty Service Start Date" />
        <f:attribute name="fromDate" value="#{bindingVar}"/>
        <f:attribute name="fieldName" value="Active Duty Service End Date"/>
    </p:calendar>
</h:column>
<h:column>
    <h:commandButton  value="Add" rendered="#{personInfo.profileForm.serviceDateList.size() lt 5}">
        <f:ajax event="click" render="servideTblId" listener="#{personInfo.profileForm.addServiceDate}"/>                               
    </h:commandButton>
</h:column>
<h:column>
    <h:commandButton value="Remove " rendered="#{personInfo.profileForm.serviceDateList.size() ne 1}">
        <f:ajax event="click" render="servideTblId" listener="#{personInfo.profileForm.removeServiceDt(serviceDateObj)}"/>
    </h:commandButton>
</h:column>                     

public void addServiceDate(AjaxBehaviorEvent event){
++serviceDtCount;
ServiceDate sDate = new ServiceDate(null, null, serviceDtCount);
serviceDateList.add(sDate);
}

public void removeServiceDt(ServiceDate sDate){
--serviceDtCount;
if(sDate != null){
    serviceDateList.remove(sDate);
}       
}

public class ServiceDate implements Serializable{

private static final long serialVersionUID = 6963595158386578748L;

private Date fromDate;
private Date toDate;
private int id;

ServiceDate(){
    super();
}

ServiceDate(Date fromDate, Date toDate, int count){
    this.fromDate = fromDate;
    this.toDate = toDate;
    this.id=count;
}

public Date getFromDate() {
    return fromDate;
}
public void setFromDate(Date fromDate) {
    this.fromDate = fromDate;
}
public Date getToDate() {
    return toDate;
}
public void setToDate(Date toDate) {
    this.toDate = toDate;
}
public int getId() {
    return id;
}

public void setId(int id) {
    this.id = id;
}

}

以下是我遇到的问题。

  1. 单击“添加/删除”会添加新的行和列,但该值不会存储在模型中,并且在添加或删除行时,会从所有字段中删除输入的值。
  2. 关于如何动态绑定从日期到日期验证器,我无能为力,这样我就可以在验证器中获取输入的日期值,以便验证。
  3. 非常感谢任何帮助。

0 个答案:

没有答案