Java 如何保存动态创建的HtmlInputText组件的值

Java 如何保存动态创建的HtmlInputText组件的值,java,jsf,jsf-2,Java,Jsf,Jsf 2,这个问题实际上是此处所述问题的下一步: 因此,下一步是实际保存用户使用前面问题中生成的动态表单提交的值(通过编程创建的jsf表单,由简单的InputExt组成)。 以下是每个组件的代码: 模型: @Entity @Table(name = "imageviewer_crreviewerformdata") public class CRReviewerFormData implements Serializable { private static final long serialVers

这个问题实际上是此处所述问题的下一步:

因此,下一步是实际保存用户使用前面问题中生成的动态表单提交的值(通过编程创建的jsf表单,由简单的InputExt组成)。 以下是每个组件的代码:

模型:

@Entity
@Table(name = "imageviewer_crreviewerformdata")
public class CRReviewerFormData implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue
@Column(name = "FdId")
private Long fdId;

@Column(name = "Input1")
private String input1;

@Column(name = "Input2")
private String input2;

@Column(name = "Input3")
private String input3;

/* getters & setters*/
// ...
观点:

<p:commandButton value="View" action="#{reviewReportBean.updateDynamicPanelGrid()}"
                   oncomplete="dlg.show()" icon="ui-icon-image" >
    <f:param name="selectedImage" value="#{cRImageData.imName}" />
</p:commandButton>
...
<p:outputPanel id="outerContainerDynamicPanelGrid" autoUpdate="true">
    <h:panelGrid id="innerContainerDynamicPanelGrid"
                    binding="#{reviewReportBean.dynamicPanelGrid}">
    </h:panelGrid>
</p:outputPanel>
<p:commandButton id="viewSaveForm" value="Save" 
                    action='#{reviewReportBean.saveReport()}'>
</p:commandButton>
<p:commandButton id="viewEditForm" value="Edit" 
                    action='#{reviewReportBean.editReport()}'>
</p:commandButton>
...
如何将动态创建的
HtmlInputText
组件的值保存到bean属性

我在控制器(reviewReportBean)中实现了一个典型的Save()方法,如下所示:

public String saveReport() {
    String result = null;
    System.out.println(">>>> method to save form called!");

    Session session = HibernateUtil.getSessionFactory().openSession();

    CRReviewerFormData cRReviewerFormData = new CRReviewerFormData();
    cRReviewerFormData.setInput1(this.getInput1());
    cRReviewerFormData.setInput2(this.getInput2());
    cRReviewerFormData.setInput3(this.getInput3());

    Transaction tx = null;
    try 
    {
         tx = session.beginTransaction();
         session.save(cRReviewerFormData);
         tx.commit();
         result = SUCCESS;
    } 
    catch (Exception e) 
    {
         if (tx != null) 
         {
             tx.rollback();
             result = ERROR;
             e.printStackTrace();
         }
     } 
     finally 
     {
         session.close();
     }
     return result;
}
当我尝试使用“保存”按钮时,收到以下错误:

16:44:08,632 ERROR [ExceptionHandlerAjaxImpl:57] Component ID A3702:imageEditor:label1 has already been found in the view.  
java.lang.IllegalStateException: Component ID A3702:imageEditor:label1 has already been found in the view.  
at com.sun.faces.util.Util.checkIdUniqueness(Util.java:821)
at com.sun.faces.util.Util.checkIdUniqueness(Util.java:805)
at com.sun.faces.util.Util.checkIdUniqueness(Util.java:805)
at com.sun.faces.util.Util.checkIdUniqueness(Util.java:805)
at com.sun.faces.util.Util.checkIdUniqueness(Util.java:805)
at com.sun.faces.util.Util.checkIdUniqueness(Util.java:805)
at com.sun.faces.application.view.StateManagementStrategyImpl.saveView(StateManagementStrategyImpl.java:144)
再往下一点,我看到:

SEVERE: Servlet.service() for servlet ImageViewer Servlet threw exception
javax.portlet.faces.BridgeException: java.lang.IllegalStateException: CDATA tags may not nest
表单ID是否存在实际问题


我实现的保存方法是否足够,或者我是否必须设置其他内容?

导致与重复ID和cdata标记相关的例外的问题已通过设置解决:

FacesContext.getCurrentInstance().getViewRoot().setTransient(true);
在updateDynamicPanelGrid()方法中

FacesContext.getCurrentInstance().getViewRoot().setTransient(true);