0

この質問は、実際にはここに記載されている質問の次のステップです。

動的に作成された HtmlInputText コンポーネントの値を Bean プロパティにバインドする方法は?

したがって、次のステップは、前の質問で生成された動的フォーム (単純な入力テキストで構成される、プログラムで作成された jsf フォーム) を使用して、ユーザーが送信した値を実際に保存することです。各コンポーネントのコードは次のとおりです。

モデル:

@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>
...

コントローラー:

@ManagedBean(name = "reviewReportBean")
@ViewScoped
public class ReviewReportBean implements Serializable { 
    private static final long serialVersionUID = 1L;
    private String imageOfInterest;
    private HtmlPanelGrid dynamicPanelGrid;
    private CRReviewerFormData cRReviewerFromData;
    // ...
    @PostConstruct
    public void init(){     
        dynamicPanelGrid = new HtmlPanelGrid();
        FacesContext facesContext = FacesContext.getCurrentInstance();
        ConfigOptionsBean configOptionsBean = (ConfigOptionsBean) facesContext.getApplication().getVariableResolver().resolveVariable(facesContext, "configOptionsBean");

        cRReviewerFromData = new CRReviewerFormData();
    }

    @SuppressWarnings("unused")
    public void updateDynamicPanelGrid() {

        RequestContext requestContext = RequestContext.getCurrentInstance();
        Application application = FacesContext.getCurrentInstance().getApplication();
        dynamicPanelGrid.getChildren().clear();

        Row row1 = (Row) application.createComponent(Row.COMPONENT_TYPE);
        row1.setRendered(true);
        Row row2 = (Row) application.createComponent(Row.COMPONENT_TYPE);
        row2.setRendered(true);     
        Row row3 = (Row) application.createComponent(Row.COMPONENT_TYPE);
        row3.setRendered(true);

        HtmlOutputLabel label1 = (HtmlOutputLabel)application.createComponent(HtmlOutputLabel.COMPONENT_TYPE);      
        label1.setValue("I am the first label");
        label1.setStyle("font-weight:bold;color:black");
        label1.setId("label1");     
        HtmlOutputLabel label2 = (HtmlOutputLabel)application.createComponent(HtmlOutputLabel.COMPONENT_TYPE);      
        label2.setValue("I am the second label");
        label2.setStyle("font-weight:bold;color:red");
        label2.setId("label2");     
        HtmlOutputLabel label3 = (HtmlOutputLabel)application.createComponent(HtmlOutputLabel.COMPONENT_TYPE);      
        label3.setValue("I am the third label");
        label3.setStyle("font-weight:bold;color:red");
        label3.setId("label3");

        HtmlInputText input1 = (HtmlInputText)application.createComponent(HtmlInputText.COMPONENT_TYPE);
        input1.setId("input1"); 
        input1.setValueExpression("value", FacesContext.getCurrentInstance().getApplication().getExpressionFactory()
            .createValueExpression(FacesContext.getCurrentInstance()
                    .getELContext(), "#{reviewReportBean.input1}" , String.class));

        HtmlInputText input2 = (HtmlInputText)application.createComponent(HtmlInputText.COMPONENT_TYPE);        
        input2.setId("input2");
        input2.setValueExpression("value", FacesContext.getCurrentInstance().getApplication().getExpressionFactory()
            .createValueExpression(FacesContext.getCurrentInstance()
                    .getELContext(), "#{reviewReportBean.input2}" , String.class));

        HtmlInputText input3 = (HtmlInputText)application.createComponent(HtmlInputText.COMPONENT_TYPE);
        input3.setId("input3");
        input3.setValueBinding(arg0, arg1);
        input3.setValueExpression("value", FacesContext.getCurrentInstance().getApplication().getExpressionFactory()
            .createValueExpression(FacesContext.getCurrentInstance()
                    .getELContext(), "#{reviewReportBean.input3}" , String.class));

        dynamicPanelGrid.setColumns(2);

        dynamicPanelGrid.getChildren().add(label1);
        dynamicPanelGrid.getChildren().add(input1);     
        dynamicPanelGrid.getChildren().add(label2);
        dynamicPanelGrid.getChildren().add(input2);     
        dynamicPanelGrid.getChildren().add(label3);
        dynamicPanelGrid.getChildren().add(input3);
        requestContext.update(":viewDatagridForm:innerContainerDynamicPanelGrid");
    }
    // ...
}

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に実際の問題はありますか?

私が実装した Save メソッドの実装は十分ですか、それとも他に何か設定する必要がありますか?

4

1 に答える 1

0

ID と cdata タグの重複に関連する例外を引き起こす問題は、次のように設定することで解決されました。

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

updateDynamicPanelGrid() メソッドで

于 2013-04-03T15:01:54.857 に答える