我可以动态添加JSF组件吗?我需要一个带有按钮的表单,该按钮应向表单添加一个<h:inputText>

我知道以某种方式在JavaScript中应该可行。有人知道如何在JSF中执行此操作吗?我认为主要问题是如何通过q​​4312079q获取或设置新输入的值。

#1 楼

使用诸如<h:dataTable><ui:repeat>之类的迭代组件来显示动态调整大小的实体List。使bean @ViewScoped确保在同一视图上的回发中记住该列表,而不是一遍又一遍地重新创建。使用<h:dataTable>的启动示例(使用<ui:repeat>时,只需将<h:dataTable>替换为<ui:repeat>,将<h:column>替换为例如<li><div>):

<h:form>
    <h:dataTable value="#{bean.items}" var="item">
        <h:column><h:inputText value="#{item.value}" /></h:column>
        <h:column><h:commandButton value="remove" action="#{bean.remove(item)}" /></h:column>
    </h:dataTable>
    <h:commandButton value="add" action="#{bean.add}" />
    <h:commandButton value="save" action="#{bean.save}" />
</h:form>


被管理的bean:

@Named
@ViewScoped
public class Bean {

    private List<Item> items;

    @PostConstruct
    public void init() {
        items = new ArrayList<>();
    }

    public void add() {
        items.add(new Item());
    }

    public void remove(Item item) {
        items.remove(item);
    }

    public void save() {
        System.out.println("items: " + items);
    }

    public List<Item> getItems() {
        return items;
    }

}


型号:

public class Item {

    private String value;

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String toString() {
        return String.format("Item[value=%s]", value);
    }

}


另请参见:


推荐的JSF 2.0 CRUD框架
如何创建动态JSF表单字段
如何实现
如何选择正确的bean作用域?


评论


谢谢,我在想着同样的事情,只是想知道这是否是最好的方法= D

–ErVeY
2010年8月5日14:05

真正。唯一的选择是以编程方式创建组件,如new HtmlInputText()等等,但这只会在托管bean中导致讨厌和不透明的代码。

– BalusC
2010年8月5日14:11



嗨,@ BalusC,是否将字段“名称”添加到Item类?我需要将项目保存到数据库中,我也必须从数据库中读取它们。

–merveotesi
2011-12-26 12:00



谢谢,真的很有帮助。

–普利特曼尼
13年2月1日在15:19

我就是这样做的。但是,当我在添加的输入中输入新值并点击Submit时,后备bean上的列表不会更新。有什么事吗我的物品是List ,可以吗?它不能更改列表中的字符串吗?

–JSeven
2014年4月29日在20:47



#2 楼

就像这样

将表单标签绑定到bean属性


<form binding="#{myBean.myform}">...</form>



@ManagedBean("myBean")
public class Bean{
   property HtmlForm myform;
}


事件发生时,创建输入组件的新实例

HtmlInputText input=new HtmlInputText();


并附加到您的表单上

myform.getChildren().add(input);


评论


请不要自己创建新的组件实例。首选方式是:FacesContext.getCurrentInstance()。getApplication()。createComponent(HtmlInputText.COMPONENT_TYPE);

–dforce
17 Mar 16 '17在7:41



#3 楼

使用h:dataTable动态添加元素...拥有要为dataTable提供值的任何类型的列表...

h:dataTable中...您可以在<h:column>内包含要创建的元素标签

将用于生成要动态创建的元素。

评论


欢迎参加Stack Overflow!到目前为止,这个答案似乎并没有增加任何实质性的内容。 Stack Overflow不是一个每个人都按协议重复的讨论论坛,而是一个问答网站,每个人都对协议表示赞成或不同意。如果您获得15点声望,则可以投反对票。

– BalusC
2013年1月24日11:12