1

jsf とフォーム要素を生成するバック Bean を使用してフォームを動的にレンダリングしようとしています。

バック Bean のコードは次のとおりです。

@ManagedBean(name = "reviewReportBean")
@SessionScoped
public class ReviewReportBean implements Serializable {
... ... ...
private HtmlPanelGrid dynamicPanelGrid;
... ... ...
public HtmlPanelGrid dynamicPanelGrid() {
Application application = FacesContext.getCurrentInstance().getApplication();
List childrenList = dynamicPanelGrid.getChildren();
childrenList.clear();
... ... ...
Session session = HibernateUtil.getSessionFactory().openSession();
    Transaction tx = null;
    try 
    {
    ... ... ...     
    HtmlOutputLabel label = (HtmlOutputLabel)application.createComponent(HtmlOutputLabel.COMPONENT_TYPE);
    label.setValue("Mpla Mpla Mpla");
    ... ... ...         
    childrenList.add(label);
    ... ... ...     
    String hq9 = "select ... WHERE it (:itid)";
    SQLQuery query9 = session.createSQLQuery(hq9);
    query9.setParameter("itid",imageTypeId);
    query9.addEntity(ReportFormFields.class);
    reportFormFields = query9.list();
    for(int i=0; i<reportFormFields.size(); i++){
        System.out.println("-------------------------");
        System.out.println(">> Field Id: " + reportFormFields.get(i).getRffFieldId());
        System.out.println(">> Field Name: " + reportFormFields.get(i).getRffFieldName());
        ... ... ...

        HtmlOutputLabel output = (HtmlOutputLabel)application.createComponent(HtmlOutputLabel.COMPONENT_TYPE);
        output.setValue(reportFormFields.get(i).getRffFieldLabel());
        childrenList.add(output);
        if(reportFormFields.get(i).getRffFieldType().equals("Option List")){
            HtmlSelectOneMenu combomenu = (HtmlSelectOneMenu)application.createComponent(HtmlSelectOneMenu.COMPONENT_TYPE);
            UISelectItems comboItems = new UISelectItems();
            String listOptions =reportFormFields.get(i).getRffFieldOptions();
            String array[] = listOptions.split("(?<!\\\\),");

            for(int j = 0;j<array.length;j++){
                System.out.println(">>> list option " + j + " is " + array[j]);
            }
            comboItems.setValue(array);
            combomenu.getChildren().add(comboItems);
            childrenList.add(combomenu);

            }else{
                HtmlInputText input = (HtmlInputText)application.createComponent(HtmlInputText.COMPONENT_TYPE);
                childrenList.add(input);
            }
            ... ... ...
        }
        ... ... ...
    }
    ... ... ...
    return dynamicPanelGrid;
    }
}

これは、バック Bean コードを使用して、ビュー (xhtml) でフォームを動的に生成しようとする方法です。

<h:panelGrid id="dynaPanelGrid7" 
binding="#{reviewReportBean.dynamicPanelGrid}" >
</h:panelGrid>

しかし、フォームはまったく生成されません。ただし、次のように呼び出すと(フォームを生成するためにメソッドを直接呼び出す):

<h:panelGrid id="dynaPanelGrid7" 
binding="#{reviewReportBean.dynamicPanelGrid()}" >
</h:panelGrid>

次のエラーが表示されます。

can't parse argument number reviewReportBean.dynamicPanelGrid(): /views/view.xhtml @199,63 binding="#{reviewReportBean.dynamicPanelGrid()}": Illegal Syntax for Set Operation

しかし、その後、次のように呼び出そうとすると:

<h:panelGrid id="dynaPanelGrid7" 
binding="#{reviewReportBean.dynamicPanelGrid}" >
</h:panelGrid>

フォームがレンダリングされます!!

だから私はオブジェクトdynamicPanelGridが移入されていると思います...

フォームが正しく機能するようにコードを変更する方法についてのアイデアはありますか?

4

1 に答える 1

0

dynamicPanelGridフィールド(プロパティ)の名前です。ゲッターとセッターは次のようになります。

@PostConstruct
public void init() {
    // init your dynamicPanelGrid
}

public HtmlPanelGrid getDynamicPanelGrid() {
    return dynamicPanelGrid;
}

public void setDynamicPanelGrid(HtmlPanelGrid dynamicPanelGrid) {
    this.dynamicPanelGrid = dynamicPanelGrid;
}

Java Beansについて読んでください。

バインディング属性は次のようになります。

binding="#{reviewReportBean.dynamicPanelGrid}"
于 2013-02-05T11:25:32.517 に答える