不处理ui:repeat中h:inputText的值

Eri*_*cia 8 jsf primefaces

我想处理这个表单(valueChangueListener在实际情况下无效).

这是后豆:

public class TestBean extends PrivateBaseBean implements Serializable {
private List<String> strings;

@PostConstruct
public void init() {
    strings = new ArrayList<String>();
    strings.add("");
    strings.add("");
    strings.add("");
}

public void saveAction(ActionEvent event) {

    StringBuilder textToShowInMessage = new StringBuilder();
    for (String string : strings) {
        textToShowInMessage.append(string);
        textToShowInMessage.append("; ");
    }
    FacesMessage msg = new FacesMessage(super.getBundle().getString(
            textToShowInMessage.toString()), "");

    FacesContext.getCurrentInstance().addMessage(null, msg);
}

getters... setters...
Run Code Online (Sandbox Code Playgroud)

一个观点:

....
<h:form>
<ui:repeat var="string" value="#{testBean.strings}">
    <h:inputText value="#{string}" />
    <br />
</ui:repeat>
<p:commandButton value="#{msg.save}"
actionListener="#{testBean.saveAction}" icon="ui-icon-disk"
        update="@form" />
</h:form>
...
Run Code Online (Sandbox Code Playgroud)

在后面的bean字符串列表中处理表单时,始终为空.

如何处理表单intput的内部迭代,没有任何值的changue监听器?

有一些截图: 调试代码

在浏览器中表单

action或actionListener on会出现同样的问题

sku*_*sel 12

您的问题与PrimeFaces <p:commandButton>的行为无关,而是与使用<ui:repeat>标记时产生的隐含问题的范围问题有关.

首先,让我们离开你的榜样.基本上,你有

<ui:repeat value="#{bean.strings}" var="s">
    <h:inputText value="#{s}"/>
</ui:repeat>
Run Code Online (Sandbox Code Playgroud)

有了支持List<String> strings.

罪魁祸首在这里:value="#{s}".导出的<ui:repeat>变量s仅在其循环中可见,并且不绑定到任何托管bean的属性,而是仅绑定到局部变量.换句话说,它不像人们所期望的那样s受到约束/相等,bean.strings[index]并且不知道,正如我们所看到的,它起源于何处.所以基本上,你处于单边关系之中:来自bean的值正确地打印在你的输入中,但反过来却没有发生.

解决方法

解决方法#1:包装类/模型对象

通过为您的类使用包装器对象可以克服这种情况.如果是字符串,它可能是一个'简单的可变字符串',如下所示:

public class MString {
    private String string;//getter+setter+constructor
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,迭代将按预期工作:

<ui:repeat value="#{bean.mstrings}" var="ms">
    <h:inputText value="#{ms.string}"/>
</ui:repeat>
Run Code Online (Sandbox Code Playgroud)

有了支持List<MString> mstrings.

请注意,如果你有你的模型类,User并且将在<ui:repeat>类中更改其属性本身将是一个有效的包装器,以便适​​当地设置属性.

解决方法#2:链式属性访问

另一种解决方法包括直接从<h:inputText>标记中访问集合的元素.这样,任何此类属性都将通过访问bean,然后集合,然后在所需索引处设置属性来设置.过长,但就是这样.至于如何问题,<ui:repeat>提供了一个导出的当前迭代状态变量,varStatus它将用于访问托管bean中的数组/集合.

在这种情况下,迭代也将按预期工作:

<ui:repeat value="#{bean.strings}" var="s" varStatus="status">
    <h:inputText value="#{bean.strings[status.index]}"/>
</ui:repeat>
Run Code Online (Sandbox Code Playgroud)

与普通的支持List<String> strings.