0

次の質問があります!

バッキングBeanから動的に入力テキストを作成したいのですが、これらは実行時に作成される動的に作成されたタブの内部にあります。

input対応するクラスを使用して、コンポーネントを動的に追加することができます。

valueExpresionしかし、値をそれ自体にバインドする言語であるコンポーネントに値タグを追加することはできませんmanagedBean

このようにサマー化できるコードを見つけました。

  @ManagedBean
  @ViewScoped
  public MyManagedBean(){

private TabView tabsi;
    HtmlOutputLabel hol = new HtmlOutputLabel();
        InputText txt2 = new InputText();
private String value;

/* getter and setters */

    public void MyManagedBean{
    tabsi = new TabView();
            Tab tab1 = new Tab();
            tab1.setTitle("Tab1");
            Tab tab2 = new Tab();
            tab2.setTitle("Tab2");
            tabsi.getChildren().add(tab1);
            tabsi.getChildren().add(tab2);

            hol.setValue("label");
            hol.setStyleClass("label");
            txt2.setValueExpression("value",
                    TestController.getExpression("#{myManagedBean.value}"));
            txt2.setValue(value);
            tab1.getChildren().add(hol);
            tab1.getChildren().add(txt2);
    }

    public static ValueExpression getExpression(String expression) {
            FacesContext fc = FacesContext.getCurrentInstance();
            ELContext ctx = fc.getELContext();
            ExpressionFactory factory = fc.getApplication().getExpressionFactory();
            return factory.createValueExpression(ctx, expression, Object.class);
        }

public void test1() {
        System.out.println(value);
    }
    }

コンポーネントを正常にビルドできましたが、バインドしてを設定できませんValueExpression。ボタンからtest1関数を呼び出すと、次のように出力されます。null

どうすれば値をManagedBean???にバインドできますか?

4

1 に答える 1

0

これまでに提供された情報で正確な原因を特定することはできませんが、このアプローチには少なくとも 3 つの深刻な問題があります。

  1. UIComponentインスタンスは本質的にリクエストスコープです。より広いスコープで Bean のプロパティとして宣言しないでください。そうしないと、まったく同じインスタンスが複数のビューで参照されているときに、悪名高い「コンポーネント ID の重複」エラーに直面することになります。

  2. ビュー スコープの Bean プロパティを参照する属性を使用bindingすると、ビュー スコープが完全に壊れます。Bean はリクエストごとに再作成されます。この問題には、ここで詳細に説明されているのと本質的に同じ根拠があります: JSF2 Facelets の JSTL... 理にかなっていますか?

  3. プログラムで作成されたUIInputコンポーネントには、を介しUICommandて固定セットが必要です。そうしないと、JSF は、フォーム送信のリクエスト値の適用フェーズ中にリクエスト パラメータ マップでそれを見つけることができず、本質的に、送信された値とアクション メソッドを処理できません。それぞれ。idsetId()

3 番目の問題が現在の問題の正確な原因である可能性が最も高いですが、1 番目と 2 番目の問題が何らかの影響を与えている可能性があります。

これに関係なく、この方法でプログラムによってコンポーネントを作成するという決定を再考してみてください。これはできるだけ避けるべきです。renderedたとえば、属性を使用したり、 JSTL のようなビルド時間タグを表示したりしないのはなぜ<c:if>ですか?

于 2013-03-13T13:01:55.780 に答える