基于JSF中动作控制器方法的返回值调用javascript?

时间:2013-04-02 07:47:52

标签: javascript jsf-2

我在back bean中编写了一个action方法,该方法由command按钮的action属性调用。成功执行后,它返回'null',否则返回'error'。我需要的是,我想根据action方法的返回值在javascript对话框中显示相应的消息。任何人都可以告诉我如何实现这一目标?

2 个答案:

答案 0 :(得分:0)

由于你使用的是JSF 2,你可以在这里使用一些<f:ajax/>魔法。在命令按钮中嵌入其中一个标记:

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

yourMethod应该将您提到的值更新为绑定到<h:inputHidden/> id="hiddenComponent"的字段,并通过ajax更新组件。然后,将调用displayMessage javascript函数(onevent为相关的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.

Flash是一个Map,允许参数在请求前一步生存,允许本地实现POST - Redirect - GET模式,而您几乎不需要付出任何努力。

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

<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/>(通过使用<f:ajax/>标记而不使用onevent javascript回调函数。关于重新渲染父级,你不能直接在JSF中重新渲染有条件渲染的组件,所以你最终会得到这样的东西:

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

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

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

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

答案 1 :(得分:-2)

您可以在辅助bean中使用RequestContext.getCurrentInstance().execute("myfunction()")方法。它允许您执行客户端javascript代码。不幸的是,这只在Primefaces中可用(afaik)。