我在数据表中遇到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。没有成功。单击生成的链接时,页面会刷新。
此表格是根据我之前的请求生成的。第一页包含一些字段和操作按钮,当操作按钮单击时,操作类到达所需的数据被设置为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>
答案 0 :(得分:3)
如果#{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)构造函数或action(侦听器)方法中执行业务作业。