【发布时间】:2011-04-11 01:23:45
【问题描述】:
我的应用程序我想为 ex 添加更多动态:我的应用程序要求输入城市并提供一个但用户想要添加更多城市,我需要更动态地为他提供,那么如何在 JSF 中做到这一点?
【问题讨论】:
我的应用程序我想为 ex 添加更多动态:我的应用程序要求输入城市并提供一个但用户想要添加更多城市,我需要更动态地为他提供,那么如何在 JSF 中做到这一点?
【问题讨论】:
使用表 (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
}
【讨论】:
String class is immutable。改为通过索引更好地访问值,或者仅使用完全值得的 javabean 作为实体。
如果是关于有限数量的城市,除非需要,否则您可以使用渲染属性隐藏字段。
【讨论】:
您可以使用组件并将其与支持 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);
}
// 设置/获取
【讨论】: