0

关于更改视图中的信息(而不是转到不同的 .xhtml 页面)的初学者问题。我的 .xhtml 显示一个数据表(显示人员列表),但我希望用户能够通过在输入文本中输入某人姓名的开头然后单击命令按钮来缩小显示的信息量。commandbutton 和 datatable 都执行相同的 bean 方法,但如果 inputtext 有数据,则 sql 使用 Like(这使用 jdbc)。我的表单如下,问题是我得到一个“无法找到与 from-view-id 匹配的导航案例”,因为我的托管 bean 返回一个对象列表,而不是“成功”或“失败”。此外,整个表格似乎效率低下。这似乎是一个相当常见的场景 - 调用返回对象而不是导航指令的托管 bean 的方法。如何摆脱错误消息?有一个更好的方法吗?

这是代码:

<h:head>
    <h:outputStylesheet library="css" name="table-style.css"  />
</h:head>

<h:body>

    <h1>MavenWeb</h1>

    <h:form>
        <h:panelGrid columns="3">
            Select a customer:

            <h:inputText id="listName" value="#{customer.listName}" 
                size="20" >
            </h:inputText>
            <h:commandButton value="Submit"
                                         action="#customer.getCustomerList()}" />

        </h:panelGrid>



    <h:dataTable value="#{customer.getCustomerList()}" var="c"
            styleClass="order-table"
            headerClass="order-table-header"
            rowClasses="order-table-odd-row,order-table-even-row"
        >

        <h:column>
            <f:facet name="header">
                Customer ID
            </f:facet>
                #{c.customerID}
        </h:column>

        <h:column>
            <f:facet name="header">
                Name
            </f:facet>
                #{c.name}
        </h:column>

        <h:column>
            <f:facet name="header">
                Address
            </f:facet>
                #{c.address}
        </h:column>

        <h:column>
            <f:facet name="header">
                Created Date
            </f:facet>
                #{c.created_date}
        </h:column>

    </h:dataTable>
</h:form>
</h:body>
4

1 回答 1

1

首先,确保您的托管 bean 具有 ViewScope,因此当您在同一个视图中时,每个请求只会影响表单值。其次,您可以将 ajax 行为添加到您的并使用新值<h:commandButton>呈现。<h:datatable>第三,永远不要将业务逻辑放在属性 getter 中,因为 JSF 框架可以对这些 getter 进行 2 次或更多调用(取决于您的设计)。

使用这些规则,您可以像这样重新编写代码:

@ViewScoped
@ManagedBean
public class Customer {
    private String listName;
    private List<CustomerDTO> customerList;

    public Customer() {
        listName = "";
        customerList = null; //maybe you can initialize your list here
    }

    //getters and setters...

    //look that this method returns a void (no need to return a navigation rule)
    public void fillCustomerList() {
        //your method/way to fill the customerList goes here...
        //I'll just put a code example
        customerList = new ArrayList<CustomerDTO>();
        customerList.add(new CustomerDTO(1, "Luiggi Mendoza", "Lima", new Date());
        customerList.add(new CustomerDTO(2, "StackOverflow", "Web", new Date());
    }

}

您页面的代码片段

<h:form>
    <h:panelGrid columns="3">
        Select a customer:
        <h:inputText id="listName" value="#{customer.listName}" size="20" />
        <h:commandButton value="Submit" action="#customer.fillCustomerList}">
            <f:ajax execute="@this" render="dtMyDataTable" />
        </h:commandButton>
    </h:panelGrid>

    <h:dataTable id="dtMyDataTable" value="#{customer.customerList}" var="c"
        styleClass="order-table"
        headerClass="order-table-header"
        rowClasses="order-table-odd-row,order-table-even-row">
        <h:column>
            <f:facet name="header">
                Customer ID
            </f:facet>
            #{c.customerID}
        </h:column>
        <h:column>
            <f:facet name="header">
                Name
            </f:facet>
            #{c.name}
        </h:column>
        <h:column>
            <f:facet name="header">
                Address
            </f:facet>
            #{c.address}
        </h:column>
        <h:column>
            <f:facet name="header">
                Created Date
            </f:facet>
            #{c.created_date}
        </h:column>
     </h:dataTable>
</h:form>

关于此事的更多信息:

于 2012-07-27T03:18:13.637 回答