【问题标题】:Create inputtext dynamically动态创建输入文本
【发布时间】:2013-02-27 00:41:28
【问题描述】:

我有下一个问题!

我想从我的支持 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???

【问题讨论】:

  • 你调用 TestController.getExpression("#{myManagedBean.value}"));在 MyManagedBean 的构造函数中。你不能从正在建设的东西中得到任何东西。它总是返回 null。
  • 在构造函数中,我建立了绑定的值!所以在我触发 actionListener 之前它不会被调用,在我的例子中是我按下的按钮。

标签: jsf


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 谢谢,第三个选项是获胜的。是的,你是对的,我需要考虑加载此类元素的范围,我想我会查看更多关于在构建时创建组件的信息!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 2017-02-28
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多