在 JSF 2.0 中动态创建输入字段并将其链接到支持 bean

Posted

技术标签:

【中文标题】在 JSF 2.0 中动态创建输入字段并将其链接到支持 bean【英文标题】:Creating input fields dynamically in JSF 2.0 and linking it to a backing bean 【发布时间】:2013-09-08 19:21:10 【问题描述】:

我的要求是这样的。在 JSF(2.0) 页面中,我有一个名为 Address 的部分。我添加了一个按钮,上面写着“添加地址”。当用户单击按钮时,应动态生成新的地址字段(输入文本)(Line1、Line2、City 等)。当我点击提交时,所有的值(地址 1,地址 2 ...地址 N)都应该进入一个数组列表。

所以我需要

    点击按钮动态生成 UI 组件 将这些 UI 组件链接到支持 bean(最好是列表) 数据表不应用于上述情况

在网上很难找到合适的 JSF 文档,所以如果有人能帮助我,那就太好了

更新:noone 发布的答案效果很好,但我想要更健壮的东西,比如从 Java 控制器创建动态 UI 组件(Java bean,使用 htmlPanelGrid 组件)。我已经能够使用 htmlPanelGrid 动态创建组件,但是我找不到将这些生成的组件绑定到 bean 中的地址列表(存储所有地址详细信息的那个)的方法

【问题讨论】:

这个问题太笼统了。首先,您应该自己尝试一些东西,然后询问您是否有问题。顺便说一句,您有几十个 JSF 在线教程和操作方法,从这个站点开始。 我尝试了很多东西,之所以没有放在这里是因为,我想看看不同人的不同做法 我已经更新了问题,请看一下 我还是觉得你应该自己试一试。顺便说一句,JSF 提供了在大多数情况下避免组件绑定的工具。最好将数据存储在自己的数据结构中,而不是绑定的 jsf 组件中。这样,如果您想更改视图层的框架,它会更容易(解耦)​​;-) 您不想使用数据表的具体原因是什么?是因为他们生成了一张表吗?然后使用<ui:repeat>。我真的没有明白为什么在 Java 端以编程方式创建组件会“更健壮”,而不是仅仅在视图端构建/声明它们。 【参考方案1】:

我假设你有一个Address 的地址类。还有一个AddressBean 和一个List 来保留地址。

代码可能如下所示(对于我能想到的最基本的场景):

<h:form id="addressForm">
    <h:commandButton value="Add Address" action="#addressBean.addAddress()" immediate="true" execute="@this">
        <f:ajax render="addressForm" />
    </h:commandButton>
    <c:forEach items="#addressBean.addressList" var="address">
        <h:inputText value="#address.street" /><br />
    </c:forEach>
    <h:commandButton value="Save" action="#addressBean.persistAddresses" />
</h:form>

@ManagedBean
@ViewScoped
public class AddressBean 
    private List<Address> addressList = new ArrayList<Address>(); // getter+setter

    public void addAddress() 
        addressList.add(new Address());
    

    public void persistAddresses() 
        // store the addressList filled with addresses
    


public class Address 
    private String address; // getter+setter

&lt;c:forEach&gt; 取自 JSTL。它可能适用于&lt;ui:repeat&gt;,但根据您的实际情况,它可能不会。

【讨论】:

binding 来管理 ManagedBean 上的组件您在寻找什么? 是的,我可以通过托管 Bean 生成组件(使用 panelgrid 绑定,但如何绑定值?) 如果使用早于 2.1.18 的 Mojarra 版本,此构造将失败。在这种情况下,只需使用&lt;ui:repeat&gt;&lt;c:forEach&gt; 在这里没有增加任何优势。另见***.com/questions/3342984/… 哦,&lt;c:forEach&gt; 也根本没有 value 属性。

以上是关于在 JSF 2.0 中动态创建输入字段并将其链接到支持 bean的主要内容,如果未能解决你的问题,请参考以下文章

JSF 2.0 动态删除组件

如何在 JSF 中动态添加字段?

JSF 2.0将动态表单保存到数据库[重复]

使用 JBoss 4.x 实现 JSF 2.0

JSF 动态绑定命令按钮

在 JSF 中动态添加文本字段 [重复]