当前位置: 首页 > 知识库问答 >
问题:

在ui内使用inputText:重复更新值的ArrayList不起作用[重复]

益清野
2023-03-14

指的是邮报的标题。,我正在尝试从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
}

在我的管理器中,我创建了用户POJO列表:

@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中的to表中,以便用户可以编辑和更改值。Facelet代码:

<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方法。
那么我如何更新电子邮件列表对象
我的POJO设计很差吗?或者使用ui:重复是个坏主意吗?
我怎样才能做到这一点?

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

共有1个答案

滑弘扬
2023-03-14

正如BalusC在这里报告的那样,字符串是不可变的。

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

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

使用大小数:

<ui:repeat varStatus="loop" value="#{user.numbers}">
    <td><h:inputText value="#{user.numbers[loop.index]}" converter="javax.faces.BigDecimal"/> </td>
</ui:repeat>
 类似资料:
  • 我是JSTL新手,由于某种原因,我无法让测试线工作。以下是我使用的简化代码: 当我使用 ${hasChild} 它在屏幕上打印真实,但在测试线上不会发出嗡嗡声,我不知道为什么。有人能帮忙吗?

  • Mojarra 2.1.6/玻璃鱼3.1.2 我有类似的东西 其中,项目是具有Long属性的对象 只要我将LongProperty设置为非空/非空,它就可以正常工作。 当我这样做时,空输入被忽略,旧值被恢复。 日期的结果类似。 如果我从ui:repeat中删除对var/status的引用,这没有什么区别。即使显式引用#{bean.items[0].longProperty}也会以同样的方式失败。

  • 我想要一个Java中不可更改的ArrayList。所以你不能删除或添加任何元素。所以所有的工作都是由构造器完成的。 到目前为止,我已经试着用下面的方法使列表最终确定 <代码>公共静态最终列表 这不起作用,因为您仍然可以在其中添加元素。 接下来,我在网上搜索并发现您可以像这样覆盖所有方法: 这对我来说似乎不是一个好的解决方案,因为我需要为这么简单的事情投入大量的工作。 有没有一种简单的方法可以制作一

  • 我有以下xhtml、验证器和managedBean: 电子邮件添加工作罚款,直到第一次验证失败。当发生这种情况时,所有inputText组件显示相同的值。例如,首先我添加“user1@gmail.com”,这可以。然后我加上“user2@gmail.com”,这个也行。然后我把“user1@gmail.com”改成“”,这会抛出一个验证异常,它会显示在屏幕上,一切仍然可以。但是后来我用“user3

  • 我试图通过datatable显示bean中包含的列表中的数据,并在用户键入时由代码执行操作。它最初显示ok,对列表的更改将反映在UI中。 我的问题是,输入到inputText中的值被忽略。尝试寻找解决方案,我尝试在值更改时检查列表,还尝试在没有ajax的情况下进行检查,以防出现问题(没有更改)。我尝试过使用会话和视图范围bean,但运气不佳。试着用POJO包线。 这里疯了。感觉我错过了一些明显的东