如何在 JSF 中动态添加 <h:inputtext>? [复制]

Posted

技术标签:

【中文标题】如何在 JSF 中动态添加 <h:inputtext>? [复制]【英文标题】:How to add <h:inputtext> dynamically in JSF? [duplicate] 【发布时间】:2011-04-11 01:23:45 【问题描述】:

我的应用程序我想为 ex 添加更多动态:我的应用程序要求输入城市并提供一个但用户想要添加更多城市,我需要更动态地为他提供,那么如何在 JSF 中做到这一点?

【问题讨论】:

【参考方案1】:

使用表 (h:dataTable)。

总体思路:您有一个字符串列表(每个都代表城市名称)。开始时您的列表中只有 1 个项目 - 1 个空字符串。

如果您想再添加一个城市,请执行一些操作(例如按“添加更多城市”按钮),此操作会在列表中再添加一个空字符串,并且您的表格应该重新呈现(通过 ajax 或整体页面重新加载)。

之后,您将在页面上获得 2 个输入字段,每个字段都绑定到自己的字符串值。然后用户输入城市名称,按下“处理”按钮,它会调用一些操作,您可以在其中处理已经包含 2 个 非空 字符串的列表。

<h:dataTable value="#dataTableBean.cities" var="city">
    <h:column>
    <f:facet name="header" >
        <h:outputText value="City name"/>
    </f:facet>    
    <h:inputText value="#city"/>
    </h:column>
</h:dataTable>

<h:commandButton value="Add one more city" action="#dataTableBean.enlargeList"/>
<h:commandButton value="Submit" action="#dataTableBean.processList"/>

在 bean 中:

private List<String> cities = new LinkedList<String>();

//getter and setter
...

public String enlargeList () 
    cities.add ("");
    return "refreshTable"; //the easiest way - just reload the page

【讨论】:

这很可能是拥有动态结构的最简洁方式。 需要注意的是 bean 需要在此处限定为视图 (JSF2) 或会话 (JSF1)。 我采用了这种方法,但是当我提交在新输入中输入的值时,不会发送到支持 bean。有什么问题? 这确实行不通。 String class is immutable。改为通过索引更好地访问值,或者仅使用完全值得的 javabean 作为实体。【参考方案2】:

如果是关于有限数量的城市,除非需要,否则您可以使用渲染属性隐藏字段。

【讨论】:

City只是一个例子,基本问题是我想动态添加组件怎么做?【参考方案3】:

您可以使用组件并将其与支持 bean 中的 htmlPanelGrid 绑定。然后您可以根据需要动态添加组件。这里我添加了 outputText。

页面代码:

<ice:panelGrid binding="#backingBean.gridComponent"/>

支持豆:

private HtmlPanelGrid gridComponent;

public void someFunction()

HtmlOutputText outPutText = new HtmlOutputText();
outPutText.setValue("Some Text");

gridComponent.getChildren().add(outPutText);

// 设置/获取

【讨论】:

以上是关于如何在 JSF 中动态添加 <h:inputtext>? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 JSF 的表中动态添加一行?

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

如何在 jsf 中动态添加 h:inputText 而不会丢失之前动态添加的 h:inputText 值? [复制]

如何在 Ajax 请求期间在 JSF2 中动态添加组件

将新组件动态添加到 JSF 组件树时重复 id

JSF 2.0 动态删除组件