有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

datatable中的java JSF 2.0 commandLink

我对数据表中的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>

我尝试将action类和bean的作用域更改为session或view。没有成功。当我单击生成的链接时,页面将刷新

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

有没有办法解决这个问题

编辑:

我把数据表所在的所有页面都放进去了。也许其他标签有问题?也许他们改变了看法?此页面的导航是在faces配置中编写的。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>

共 (1) 个答案

  1. # 1 楼答案

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

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

    @ManagedBean
    @ViewScoped
    public class SearchBean {}
    

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

    public SearchResult getSearchResult() {
        return searchResult;
    }
    

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

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

    另见