动态创建inputtext

时间:2013-03-11 17:58:18

标签: jsf

我有下一个问题!

我想从我的支持bean动态创建inputtext,它们将位于动态创建的选项卡内部,这些选项卡将在执行时间内构建。

我设法使用相应的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 ???

1 个答案:

答案 0 :(得分:0)

到目前为止,我无法确定所提供信息的确切原因,但这种方法至少存在三个严重问题:

  1. UIComponent实例本质上是请求作用域。您永远不应该在更广泛的范围内将其声明为bean的属性,否则当在多个视图中引用相同的实例时,您将面临臭名昭着的“重复组件ID”错误。

  2. 使用binding属性引用视图范围的bean属性会完全破坏视图范围。每次请求都会重新创建bean。这个问题基本上与此处详细解释的理由相同:JSTL in JSF2 Facelets... makes sense?

  3. 以编程方式创建的UIInputUICommand组件必须通过id设置固定setId(),否则JSF将无法在rendered中找到它请求参数映射在表单提交的应用请求值阶段,并且本身无法分别处理提交的值和操作方法。

  4. 第三个问题很可能是您当前问题的确切原因,但第一个和第二个问题可能会产生一些影响。

    无论如何,请尝试重新考虑以这种方式以编程方式创建组件的决定。应尽可能避免这种情况。例如。为什么不使用<c:if>属性,或者查看JSTL {{1}}等构建时间标记?