如果el表达式为真,如何从jsf facelet重定向?

时间:2012-05-04 08:44:17

标签: jsf java-ee-6 el

我有一个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。

问候。

2 个答案:

答案 0 :(得分:1)

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

要获得搜索结果,首先需要通过搜索表单调用操作方法,对吧?只需在那里进行重定向工作。您可以通过在操作结果的查询字符串中指定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";
    }
}

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

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

    if (results.size() == 1) {
        FacesContext.getCurrentInstance().getExternalContext().redirect("details.jsf?id=" + results.get(0).getTechnicalId());
    }
}

答案 1 :(得分:0)

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

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

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

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

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

然后当您触发搜索时,您更新输入计数并且您可以检查不完整 如果count的值为1,那么你可以单击commandButton。

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

    if($("#count").val()==1){
        $("#redirectButton").click();
    }