2

我有一个显示搜索过程摘要的 jsf facelet。现在我想重定向到一个详细信息页面,如果搜索引擎只找到一个元素。我不想在我的 bean 中实现这个重定向,因为我想从我的 java 代码中获得关于这个重定向的“知识”。

所以我想写这样的东西:

<ui:redirect if="#{searchResult.count eq 1}" target="details.jsf">
   <f:param name="id" value="#{searchResult.firstResult.technicalId}" />
</ui:redirect>

有什么解决方案或想法吗?

我知道,JSF 2.2 中有页面操作,但我使用的是 JEE6,并且有可用的 JSF 2.0。顺便提一句。我目前正在使用 MyFaces、Primefaces 和 Richfaces。

问候。

4

2 回答 2

1

您应该在控制器中完成这项工作,而不是在视图中。

要得到搜索结果,首先需要通过搜索表单调用action方法,对吧?就在那里做重定向工作。faces-redirect=true您可以通过在操作结果的查询字符串中指定 来告诉 JSF 发送重定向。

public String search() {
    results = service.find(query);

    if (results.size() == 1) {
        return "details?faces-redirect=true&id=" + results.get(0).getTechnicalId();
    }
    else {
        return "results";
    }
}

或者,如果它是由 处理的 GET 请求<f:event type="preRenderView">,则执行以下操作:

public void onPreRenderViewListener() {
    results = service.find(query);

    if (results.size() == 1) {
        FacesContext.getCurrentInstance().getExternalContext().redirect("details.jsf?id=" + results.get(0).getTechnicalId());
    }
}
于 2012-05-04T13:14:54.900 回答
0

我想说最干净的方法是在 bean 中生成动作。无论如何,我建议您模拟一次点击,以防您的搜索计数使用 javascript 等于 1。

您需要一个隐藏的包含计数的输入:

<h:inputHidden id="count" value="#{searchResult.count}" />

和一个隐藏按钮来触发重定向:

<h:commandButton id="redirectButton" action="details.jsf" style="display: none;" />

然后当您触发搜索时,您更新输入计数和 oncomplete 您可以检查计数的值是否为 1,然后您可以单击命令按钮。

如果您使用 Jquery,它将类似于

    if($("#count").val()==1){
        $("#redirectButton").click();
    }
于 2012-05-04T11:13:56.590 回答