bean返回对象时的导航

时间:2012-07-27 02:52:27

标签: jsf jsf-2

有关更改视图中信息的初学者问题(而不是转到不同的.xhtml页面)。我的.xhtml显示一个数据表(显示人员列表),但我希望用户能够通过在某个人名称的开头输入一个inputtext然后单击命令按钮来缩小显示的信息量。 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>

1 个答案:

答案 0 :(得分:1)

首先,确保您的托管bean具有ViewScope,因此当您处于同一视图时,只有每个请求都会影响表单值。其次,您可以向<h:commandButton>添加ajax行为,并使用新值呈现<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>

关于此事的更多信息: