2

我在数据表中遇到 JSF commandLink 问题。我无法让它工作。

我的 bean 在请求范围内,我的操作类也在请求范围内。这是我的数据表:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
<HTML xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets">
<f:view contentType="text/html">
    <ui:include src="../blocks/head.xhtml"/>

    <body>
    <ui:include src="../blocks/header.xhtml"/>

    <div class="content_table" align="center">

        <h:dataTable headerClass="data_table_header"
                     cellpadding="10"
                     rowClasses="dataTableRow1,dataTableRow2"
                     value="#{searchBean.searchResult.corpusInfos}"
                     var="corpusInfo">

            <h:column>
                <f:facet name="header">
                    #{msg['application.corpusInfoTable.corpusPart']}
                </f:facet>
                #{corpusInfo.corpusPart}
            </h:column>

            <h:column>
                <f:facet name="header">
                    #{msg['application.corpusInfoTable.totalWords']}
                </f:facet>
                #{corpusInfo.allWordsCount}
            </h:column>

            <h:column>
                <f:facet name="header">
                    #{msg['application.corpusInfoTable.request']}
                </f:facet>

                <h:form id="idSimpleSearchForm">
                    <h:commandLink id="idSimpleSearchFromTable" action="#{searchAction.processSearch}"
                                   value="#{corpusInfo.searchTerm}">
                        <f:setPropertyActionListener value="50" target="#{searchBean.lineLength}"/>
                        <f:setPropertyActionListener value="simpleSearch" target="#{searchBean.searchType}"/>
                        <f:ajax execute="@form"/>
                    </h:commandLink>
                </h:form>

            </h:column>

            <h:column>
                <f:facet name="header">
                    #{msg['application.corpusInfoTable.usageNumber']}
                </f:facet>
                #{corpusInfo.usageCount}
            </h:column>

            <h:column>
                <f:facet name="header">
                    #{msg['application.corpusInfoTable.analyzedSourcesCount']}
                </f:facet>
                #{corpusInfo.analyzedSourcesCount}
            </h:column>

        </h:dataTable>

    </div>

    <ui:include src="../blocks/footer.xhtml"/>
    </body>
</f:view>
</HTML>

我试图将操作类和 bean 的范围更改为会话或视图。没有成功。当我单击生成的链接时,页面会刷新。

该表是根据我之前的请求生成的。第一个页面包含一些字段和操作按钮,当点击操作按钮时,到达操作类所需的数据设置为 bean 类并传递到该数据表所在的以下 xhtml 页面。我以正确的顺序查看表中的所有值,除了操作链接之外一切正常。

关于如何解决这个问题的任何想法?

编辑:

我把数据表所在的所有页面都放在了里面。也许其他标签有问题?也许他们改变了看法?这个页面的导航写在 faces-config.xml 文件中,如下所示:

<navigation-rule>
    <navigation-case>
        <from-action>#{searchAction.processSearch}</from-action>
        <from-outcome>success_simple_search</from-outcome>
        <to-view-id>/views/concordance/concordance.xhtml</to-view-id>
    </navigation-case>

    <navigation-case>
        <from-action>#{searchAction.processSearch}</from-action>
        <from-outcome>failure</from-outcome>
        <to-view-id>/views/error/unexpectedError.xhtml</to-view-id>
    </navigation-case>
</navigation-rule>
4

1 回答 1

3

如果#{searchBean.searchResult.corpusInfos}在处理表单提交期间返回的列表与显示带有表单的页面期间不同,则可能会发生这种情况。

您需要将 放在#{searchBean}视图范围内以确保列表保留在视图中。

@ManagedBean
@ViewScoped
public class SearchBean {}

您需要确保您没有在 and 的 getter 方法中执行任何业务#{searchBean.searchResult}逻辑#{searchBean.searchResult.corpusInfos}。所以他们应该看起来像这样

public SearchResult getSearchResult() {
    return searchResult;
}

public List<CorpusInfo> getCorpusInfos() {
    return corpusInfos;
}

如果您需要根据初始请求或操作预加载/预填充它们,则需要在 (post) 构造函数或 action(listener) 方法中执行业务工作。

也可以看看

于 2012-05-04T19:21:02.573 回答