我在 backing bean 中编写了一个 action 方法,由命令按钮的 action 属性调用。成功执行时返回“null”,否则返回“error”。我需要的是,我想根据操作方法的返回值在 javascript 对话框中显示适当的消息。谁能告诉我如何实现这一目标?
2 回答
由于您使用的是 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,组件将被更新。然后,displayMessage
将onevent
调用 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 发生)。
您可以RequestContext.getCurrentInstance().execute("myfunction()")
在支持 bean 中使用该方法。它可以让你执行客户端的 javascript 代码。不幸的是,这仅在 Primefaces 中可用(afaik)。