动态创建inputtext



我有下一个问题!

我想从我的后台bean动态地创建inputtext,它们将在a选项卡中动态创建,这将在执行时构建。

我设法使用相应的input类动态地添加组件。

但是我没有设法将值标签添加到组件,这是一种将值绑定到managedBean本身的valueExpresion语言。

我找到了一些代码,我可以像这样总结。

  @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. UIComponent实例本质上是请求作用域。你永远不应该在更大的范围内将其声明为bean的属性,否则当同一个实例在多个视图中被引用时,你将面临臭名昭著的"重复组件ID"错误。

  2. 使用binding属性引用一个视图作用域的bean属性完全破坏了视图作用域。每个请求都重新创建bean。这个问题本质上与这里详细解释的原因相同:JSF2 Facelets中的JSTL…有道理吗?

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

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

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

相关内容

  • 没有找到相关文章

最新更新