【问题标题】:Using inputText inside ui:repeat to update ArrayList of values is not working [duplicate]在 ui:repeat 中使用 inputText 更新值的 ArrayList 不起作用 [重复]
【发布时间】:2013-10-16 05:04:59
【问题描述】:

关于 Post 的标题,我正在尝试从 h:inputText 中的 ui:repeat 更新 ArrayList 的值,但这是行不通的。
请查看以下模型以进一步了解:

我有一个 POJO 类如下:

public class User implements Serializable{
    private String name;
    private List<String> emails;

    public User(String name, List<String> emails) {
        super();
        this.name = name;
        this.emails = emails;
    }
    //Setters Getters
}

在我的经理中,我创建了用户 POJOS 列表:

@ManagedBean
@ViewScoped
public class UserManager implements Serializable {
    private List<User> userList;
    public UserManager() {
        userList = new ArrayList<User>();
        ArrayList<String> emails= new ArrayList<String>();

        emails.add("user1.1@mail.com");
        emails.add("user1.2@mail.com");
        userList.add(new User("User1", (List<String>) emails.clone()));

        emails.clear();
        emails.add("user2.1@mail.com");
        emails.add("user2.2@mail.com");
        userList.add(new User("User2", (List<String>) emails.clone()));
    }
    public void action(){
    for(User u : userList){
        System.out.println(u);
    }
}
    //Setters Getters
}

现在在我的 Facelet 中,我使用 ui:repeat 将数据加载到表中的 h:inputText,以便用户可以编辑和更改值。 小面代码:

<h:form id="userForm">
    <table border="1">
        <ui:repeat var="user" value="#{userManager.userList}">
            <tr>
                <td><h:inputText value="#{user.name}"/> </td>

                <ui:repeat var="email" value="#{user.emails}">
                    <td><h:inputText value="#{email}"/> </td>
                </ui:repeat>
            </tr>
        </ui:repeat>
    </table>

    <h:commandButton value="Save" action="#{userManager.action}">
        <f:ajax execute="@form @this"/>
    </h:commandButton>
</h:form>

当我编辑#{user.name} 时,上述方法工作正常,但不适用于#{email}
我可以假设它适用于#{user.name},因为name 具有setter 和getter 方法。
那么如何更新emails 列表对象。
我的 POJO 设计很差吗?还是使用ui:repeat 是个坏主意?
我怎样才能做到这一点?

注意:我当前的 Mojarra 版本是 2.1

【问题讨论】:

  • 您是看不到邮件列表还是什么?

标签: jsf jsf-2


【解决方案1】:

正如 BalusC 报告的那样,here String 是不可变的。

使用varStatus属性通过索引直接访问列表成员。

<ui:repeat varStatus="loop" value="#{user.emails}">
    <td><h:inputText value="#{user.emails[loop.index]}"/> </td>
</ui:repeat>

使用 BigDecimal:

<ui:repeat varStatus="loop" value="#{user.numbers}">
    <td><h:inputText value="#{user.numbers[loop.index]}" converter="javax.faces.BigDecimal"/> </td>
</ui:repeat>

【讨论】:

  • 它适用于 ArrayList 中的任何类型吗?
  • 如果您的输入值绑定到 String 以外的其他值,您将需要一个转换器。
  • 好的,谢谢你的回答,最后一个疑问。如果我有 BigDecimal 类型列表怎么办?
  • 刚刚更新了我的答案以展示如何使用 BigDecimal 转换器
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 2013-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-29
  • 1970-01-01
相关资源
最近更新 更多