3

h:inputText投稿のタイトルを参照すると、 ArrayList の値を内部から更新しようとしていますがui:repeat、機能していません。
さらに理解を深めるために、次のモックアップを参照してください。

次のような 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いるため、ユーザーは値を編集および変更できます。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}。セッターメソッドとゲッターメソッドがあるため
、機能していると推測できます。では、リスト オブジェクト を更新するにはどうすればよいでしょうか。 私の POJO 設計は貧弱ですか? または使用するのは悪い考えですか? どうすればこれを達成できますか?#{user.name}name
emails
ui:repeat

注: 現在の Mojarra のバージョンは 2.1 です。

4

1 に答える 1

5

ここ で報告されている BalusCStringは不変です。

属性を使用しvarStatusて、インデックスによってリスト メンバーに直接アクセスします。

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

BigDecimals の場合:

<ui:repeat varStatus="loop" value="#{user.numbers}">
    <td><h:inputText value="#{user.numbers[loop.index]}" converter="javax.faces.BigDecimal"/> </td>
</ui:repeat>
于 2013-10-16T06:49:40.957 に答える