0

我在 backing bean 中编写了一个 action 方法,由命令按钮的 action 属性调用。成功执行时返回“null”,否则返回“error”。我需要的是,我想根据操作方法的返回值在 javascript 对话框中显示适当的消息。谁能告诉我如何实现这一目标?

4

2 回答 2

0

由于您使用的是 JSF 2,因此您可以<f:ajax/>在这里使用一些魔法。在您的命令按钮内嵌套此标签之一:

<h:commandButton id="yourCmdButton" action="#{yourBean.yourMethod}">
    <f:ajax render="hiddenComponent" onevent="displayMessage">
</h:commandButton>

yourMethod应该将您提到的值更新为绑定到<h:inputHidden/>with的字段,id="hiddenComponent"并且通过 ajax,组件将被更新。然后,displayMessageonevent调用 javascript 函数(为关联的 jax 请求定义一个回调 javascript 函数),您必须在此处获取该组件的值并在必要时显示一条消息。

另一方面,您可以使用所谓的Flash Scope,但它本身并不是一个范围。可以通过将其注入 bean 以不同的方式访问它:

@ManagedProperty("#{flash}")
private Flash flash;

//The setter is required
public void setFlash(Flash newFLash) {
    flash = newFlash;
}

或直接获取:

Flash jsfFlash = FacesContext.getCurrentInstance().getExternalContext().getFlash();
jsfFlash.put("errorMsg", "error");
//Or jsfFlash.put("errorMsg", null) if there's no error.

FlashMap允许参数在请求之前一步存活,允许本地实现 POST - Redirect - GET 模式,而您几乎不需要任何努力。

在页面上,您可以直接访问 flash 并在 flash 不包含错误属性时呈现消息:

<h:panelGroup rendered="#{flash.errorMsg != null}">
    <p>
        Well... it seems an error occured...
    </p>
</h:panelGroup>

请记住,如果您的 Flash 密钥字符串出于某种原因包含句点,则必须改用此命名法:

<h:panelGroup rendered="#{flash['error.message'] != null}">

只需记住重新渲染<h:panelGroup/>该组件的父级(通过使用不带javascript 回调函数的<f:ajax/>标记)。onevent关于重新渲染父组件,您不能直接在 JSF 中重新渲染有条件渲染的组件,因此您最终会得到如下内容:

<h:panelGroup id="messageParentGroup">
    <h:panelGroup rendered="#{flash.errorMsg}">
        ...

<h:commandButton ...>
    <f:ajax render="messageParentGroup"/>
</h:commandButton>

此外,还要考虑组件的上下文。您可能必须为该组件定义完整路径,而不是相对路径。

作为旁注,您为什么不使用 JSF 的验证?通过使用验证器方法或与<h:messages/>组件一起使用完全实现的验证器会更好,并且您可以避免表单值的污染(因为验证器会启动并阻止其他阶段中的 SetValues 发生)。

于 2013-04-02T14:44:17.700 回答
-2

您可以RequestContext.getCurrentInstance().execute("myfunction()")在支持 bean 中使用该方法。它可以让你执行客户端的 javascript 代码。不幸的是,这仅在 Primefaces 中可用(afaik)。

于 2013-04-02T07:51:23.247 回答