在 h:selectOneMenu 更改时自动填充多个 h:inputText

Autofill several h:inputText on h:selectOneMenu change

我有一个 h:selectOneMenu,其中包含来自 TreeMap 的信息,而 TreeMap 的信息来自数据库。 TreeMap 包含多个用户的主键和值(名字和姓氏,以及一个整数)。

在 h:selectOneMenu 下面,我有几个 h:inputText。这是代码:

<h:form>
    <table border="1">
        <thead><tr><th colspan="99">User</th></tr></thead>
        <tbody>
            <tr>
                <td><h:outputLabel value="ID:"/></td>
                <td>
                    <h:selectOneMenu id="usrid" value="#{webUser.id}">
                        <f:selectItem itemValue="#{null}" itemLabel="Select One" />
                        <f:selectItems value="#{webUser.availableUsers}" />
                    </h:selectOneMenu>
                </td>
                <td><h:message for="usrid"/></td>
            </tr>
            <tr>
                <td><h:outputLabel value="First Name:"/></td>
                <td><h:inputText id="name" value="#{webUser.name}" required="true" maxlength="20"/></td>
                <td><h:message for="name"/></td>
            </tr>
            <tr>
                <td><h:outputLabel value="Last Name:"/></td>
                <td><h:inputText id="lastName" value="#{webUser.lastName}" required="true" maxlength="20"/></td>
                <td><h:message for="lastName"/></td>
            </tr>
            <tr>
                <td><h:outputLabel value="Balance:"/></td>
                <td><h:inputText id="balance" value="#{webUser.balance}" required="true" onkeypress="if (event.which &lt; 48 || event.which &gt; 57) return false;"/></td>
                <td><h:message for="balance"/></td>
            </tr>
        </tbody>
    </table>
    <h:commandButton value="Submit" action="#{webUser.edit()}"/>
</h:form>

我需要的想法是用h:selectOneMenu中选择的项目的信息填充inputTexts。例如,如果我选择 ID(001), firstname(John), lastname(Doe), balance(100),我想看到这个人的信息显示在它的每个通讯员 h:inputText 中,所以我可以编辑这些值中的一个或多个,然后按“提交”按钮,这会完成对数据库的整个更新。

这是 .java 中管理编辑和更新的部分:

private UsersFacade uf;

private String id;
private String name;
private String lastName;
private int balance;

private TreeMap<String, String> availableUsers;

//...

public void edit() {
    try {
        Users newUser = new Users(id, name, lastName, balance);
        uf.Edit(newUser);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

我该如何解决这个问题?我是否需要在 h:selectOneMenu 中使用某种 ajax 指令?我必须在下面的层上做一些代码吗?

或者有什么办法可以看出,如果inputTexts为空白,就不会发送新的信息进行更新,所以已经保存的信息不会变成空白信息?

我会用 ajax:

<h:form>
        <h:selectOneMenu>
            <f:selectItem itemLabel="Test" itemValue="test" value="#{bean.test}" />
            <f:selectItem itemLabel="Test2" itemValue="test2" value="#{bean.test2}" />
            ...

            <f:ajax event="change" listener="#{bean.change}" uptade="@form" />
        </h:selectOneMenu>

        <h:inputText value="#{bean.test}" />
        <h:inputText value="#{bean.test2}" />
        ...

    </h:form>

这对我来说很好用。您必须对其进行编辑以使其适合您的应用程序。