gpt4 book ai didi

jsf - 使用 ExternalContext.redirect() 将人脸消息添加到重定向页面

转载 作者:行者123 更新时间:2023-12-04 00:05:23 24 4
gpt4 key购买 nike

我正在使用 ExternalContext.redirect(String); 将用户重定向到另一个页面的方法:

FacesContext.getCurrentInstance().addMessage(new FacesMessage("Bla bla bla..."));
FacesContext.getCurrentInstance().getExternalContext().getFlash().setKeepMessages(true);
ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
ec.redirect(ec.getRequestContextPath() + "/scenario.xhtml");

正如 Matt Handy 在他的回答中提到的,我使用了 Flash.setKeepMessages(true); 但它似乎不适用于 ExternalContext.redirect。 (尽管当我通过从 bean 的操作方法返回页面名称进行重定向时它可以工作。)

现在如何添加 FacesMessage 以便它在重定向 (scenario.xhtml) 页面中可见?

最佳答案

这似乎是一个时间问题。在 preRenderView 期间调用此监听器方法。事件。根据ELFlash的源代码(Mojarra 的 Flash 实现由 ExternalContext#getFlash() 返回)事实证明,当您当前处于渲染响应阶段并且尚未为当前请求设置 flash cookie 时,它​​不会设置 flash cookie :

以下是来自 ELFlash 的相关行:

if (currentPhase.getOrdinal() < PhaseId.RENDER_RESPONSE.getOrdinal()) {
flashInfo = flashManager.getPreviousRequestFlashInfo();
} else {
flashInfo = flashManager.getNextRequestFlashInfo(this, true);
maybeWriteCookie(context, flashManager);
}
maybeWriteCookie只会在第二次需要通过 flash cookie 时设置 cookie(即,当重定向的页面又重定向到另一个页面时)。

这是一个不幸的极端案例。这个 ELFlash逻辑是有道理的,但这不是你真正想要的。基本上你需要在 INVOKE_APPLICATION 期间添加消息相代替。然而,没有像 postInvokeAction 这样的事件。 .使用新的 JSF 2.2 <f:viewAction>标记它应该是可能的,因为它确实在调用应用程序阶段运行。
<f:viewAction action="#{bean.onload}" />

只要您还没有使用 JSF 2.2,您就需要寻找替代方法。最简单的方法是创建自定义 ComponentSystemEvent .
@NamedEvent(shortName="postInvokeAction")
public class PostInvokeActionEvent extends ComponentSystemEvent {

public PostInvokeActionEvent(UIComponent component) {
super(component);
}

}

现在你需要一个钩子(Hook)来发布这个事件。最明智的地方是 PhaseListener 收听 INVOKE_APPLICATION 之后的阶段.
public class PostInvokeActionListener implements PhaseListener {

@Override
public PhaseId getPhaseId() {
return PhaseId.INVOKE_APPLICATION;
}

@Override
public void beforePhase(PhaseEvent event) {
// NOOP.
}

@Override
public void afterPhase(PhaseEvent event) {
FacesContext context = FacesContext.getCurrentInstance();
context.getApplication().publishEvent(context, PostInvokeActionEvent.class, context.getViewRoot());
}

}

如果您在 faces-config.xml中注册如下
<lifecycle>
<phase-listener>com.example.PostInvokeActionListener</phase-listener>
</lifecycle>

那么您将能够按如下方式使用新事件
<f:event type="postInvokeAction" listener="#{bean.onload}" />

更新 这在 JSF 实用程序库中也可用 OmniFaces ,所以你不需要自制一个和另一个。另见 InvokeActionEventListener showcase example .

关于jsf - 使用 ExternalContext.redirect() 将人脸消息添加到重定向页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10595760/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com