【问题标题】:navigation when bean returns objectsbean返回对象时的导航
【发布时间】:2012-07-27 02:52:26
【问题描述】:

关于更改视图中的信息(而不是转到不同的 .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>

【问题讨论】:

    标签: jsf jsf-2


    【解决方案1】:

    首先,确保您的托管 bean 具有 ViewScope,因此当您在同一个视图中时,每个请求只会影响表单值。其次,您可以将 ajax 行为添加到您的 &lt;h:commandButton&gt; 并使用新值呈现 &lt;h:datatable&gt;。第三,永远不要将业务逻辑放在属性 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>
    

    关于此事的更多信息:

    【讨论】:

    • 谢谢路易吉。我进行了更改,但得到:格式错误的 xml 无法获取属性 removechild 对象的值为 null 或未定义。有什么想法吗?
    • 这是一个非常奇怪的错误。尝试通过注释部分代码来检测 xhtml 的哪个部分给您此错误,然后取消注释(可能错误不在我发布的代码片段中)。当您检测到真正的错误时,请更新您的问题并发表评论,以便为您提供更好的指导。
    • 从网上我看到它与 f:ajax 语句有关。我删除了它,异常消失了。顺便说一句,我在 Eclipse 中查看页面,而不是 IE9。
    • 尝试像这样更改您的 ajax:&lt;f:ajax render=":dtMyDataTable" /&gt;
    • 不,我得到: 包含未知 id ':dtMyDataTable' - 在组件 j_idt11 的上下文中无法找到它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多