2014-10-29 60 views
1

我創建了一個動態表單,用戶可以通過單擊命令按鈕添加多個日曆輸入字段。我的問題是,View和Been之間的連接被中斷。提交表單將返回之前在Bean中創建的日期,而不是用戶提交的日期。如何解決它?動態JSF表單:輸入字段和Bean之間的鏈接不起作用

編輯:更改日期和事後擴展表單而不保存之前導致失去更改的日期(s)。即使使用由@wittakarn提供的包裝對象的解決方案。

編輯:ajax片段似乎是問題,當我拿掉它的工作。

DynamicFormBean:

import java.io.Serializable; 
import java.util.Date; 
import java.util.LinkedList; 
import java.util.List; 
import java.util.logging.Logger; 

import javax.annotation.PostConstruct; 
import javax.faces.bean.ManagedBean; 
import javax.faces.bean.ViewScoped; 

@ManagedBean 
@ViewScoped 
public class DynamicformBean implements Serializable { 

    private static final Logger LOGGER = Logger.getLogger(DynamicformBean.class.getName()); 
    private List<Date> values; 

    @PostConstruct 
    public void init() { 
     values = new LinkedList<>(); 
     values.add(new Date()); 
    } 

    public void submit() { 
     // save values in database 
     LOGGER.info(values.toString()); 
    } 

    public void extend() { 
     values.add(new Date()); 
    } 

    public void setValues(List<Date> values) { 
     this.values = values; 
    } 

    public List<Date> getValues() { 
     return values; 
    } 

} 

筆者認爲:dynamicform.xhtml

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<f:view xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:p="http://primefaces.org/ui"> 

<h:body> 
    <h:form><h2>Dynamicform example</h2> 
    <ui:repeat value="#{dynamicformBean.values}" var="value"> 
     <p:outputLabel for="mask" value="Mask:" /> 
     <p:calendar id="mask" value="#{value}" pattern="dd.MM.yyyy" mask="true"> 
     <f:convertDateTime pattern="dd.MM.yyyy" timeZone="CET" /> 
     </p:calendar> 
     <br /> 
    </ui:repeat> 

    <h:commandButton value="Extend"> 
     <f:ajax listener="#{dynamicformBean.extend}" process="@form" render="@form" /> 
    </h:commandButton> 
    <h:commandButton action="#{dynamicformBean.submit}" value="Save" /> 

    </h:form> 
</h:body> 

</f:view> 

日誌只是打印當前日期元素。

回答

0

我無法詳細說明爲什麼View和Been之間的連接中斷,但是當我將對象日期包裝到Data類中時,如下面的代碼。問題沒有了。

XHTML

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE html> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <f:view xmlns="http://www.w3.org/1999/xhtml" 
      xmlns:h="http://java.sun.com/jsf/html" 
      xmlns:f="http://java.sun.com/jsf/core" 
      xmlns:ui="http://java.sun.com/jsf/facelets" 
      xmlns:p="http://primefaces.org/ui"> 
     <h:head><title>Dynamicform example</title></h:head> 
     <h:body> 
      <h:form> 
       <h2>Dynamicform example</h2> 
       <ui:repeat value="#{dynamicformBean.values}" var="value">      
         <p:outputLabel for="mask" value="Mask:" /> 
         <p:calendar id="mask" 
            value="#{value.date}" 
            pattern="dd.MM.yyyy" mask="true"> 
          <f:convertDateTime pattern="dd.MM.yyyy" timeZone="CET" /> 
         </p:calendar> 
         <br/> 
       </ui:repeat> 
       <h:commandButton value="Extend"> 
        <f:ajax render="@form" 
          listener="#{dynamicformBean.extend}"/> 
       </h:commandButton> 
       <h:commandButton action="#{dynamicformBean.submit}" value="Save"/> 
      </h:form> 
     </h:body> 

    </f:view> 
</html> 

managedbean

@ManagedBean(name = "dynamicformBean") 
@ViewScoped 
public class DynamicformBean implements Serializable { 

    private static final Logger LOGGER = Logger.getLogger(DynamicformBean.class.getName()); 
    private List<Data> values; 

    @PostConstruct 
    public void init() { 
     values = new LinkedList<Data>(); 
     values.add(new Data()); 
    } 

    public void submit() { 
     // save values in database 
     for (Data data : values) { 
      LOGGER.info(data.getDate().toString()); 
     } 
    } 

    public List<Data> getValues() { 
     return values; 
    } 

    public void setValues(List<Data> values) { 
     this.values = values; 
    } 

    public void extend(AjaxBehaviorEvent event) { 
     LOGGER.info("extend"); 
     values.add(new Data()); 
    } 

} 

數據對象

import java.io.Serializable; 
import java.util.Date; 

public class Data implements Serializable { 
    private Date date; 

    public Data(){ 
     date = new Date(); 
    } 

    public Date getDate() { 
     return date; 
    } 

    public void setDate(Date date) { 
     this.date = date; 
    } 
} 

但是,你應該使用JSF標準標籤H:頭。 PrimeFaces使用它來包含Ajax工程所必需的Java腳本和CSS代碼以及花哨的look'n'feel。

+0

謝謝,這對保存起作用。但是,通過更改日期並延長表格 - 之前不保存 - 更改後的值將丟失。 我排除了保持模板/ css /頭的東西,有一個最小的工作示例。 – 2014-10-30 07:23:05

+0

我解決了你提出的包裝對象的問題。我有一些使用primefaces命令按鈕和即時選項導致的問題。以下片段解決了以下問題:「 \t \t \t \t ' – 2014-10-30 12:16:44

+0

@mbeat很高興能爲您提供幫助。 – wittakarn 2014-10-30 14:14:26

相關問題