gpt4 book ai didi

JSF:带有自定义事件的

转载 作者:行者123 更新时间:2023-12-02 19:22:23 25 4
gpt4 key购买 nike

我不知道是否可以使用 f:event 来使用自定义事件。 Ed Burns 的书建议将 @NamedEvent 注释添加到 Event 类并使用:

<f:event type="com.foo.bar.myEvent" listener="#{listener} />

但该事件似乎从未被实例化。

从我的角度来看,这是有道理的,因为组件不知道有关事件的任何信息,例如何时发布,因此这可能仅对自定义组件作者有用。

另一方面,标准组件应该能够发布来自例如事件的事件。 PostAddToViewEvent。无论如何,自定义事件似乎永远不会由标准组件发布。

我错过了什么吗?有没有一种方便的方法来将自定义事件与标准组件一起使用?

这就是我想做的:

<h:inputText id="input">
<f:event type="foo.bar.MyCustomEvent" />
</h:inputText>
public class MyCustomEvent extends javax.faces.event.PostAddToViewEvent {
}

最佳答案

是的,你可以为此你必须重写 jsf 渲染或组件类中的某些方法

public class MyComponent extends HtmlInputText       or   public class MyRenderer extends TextRenderer

@Override
public void decode(FacesContext context, UIComponent component) {
super.decode(context, component);

String sourceName = context.getExternalContext().getRequestParameterMap().get("javax.faces.source");
if(sourceName != null && sourceName.equals(component.getClientId())){
component.queueEvent(new MyEvent(component));
}
}

但是在 MyEvent 类中你必须重写一些方法

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

它将定义此事件将在哪个面处理(默认情况下它是 ANY_PHASE 且事件在其注册的同一阶段触发)

@Override
public boolean isAppropriateListener(FacesListener listener) {
return false;
}

如果你有适当的监听器,它必须返回 true如果您有适当的 MyEvent 监听器,那么 JSF 将在触发事件时调用该监听器的 processAction(ActionEvent event) 方法,否则它将调用组件类中的广播方法,该方法必须由开发人员重写

@Override
public void broadcast(FacesEvent event) throws AbortProcessingException {
super.broadcast(event);

if(event instanceof MyEvent){
try {
processMyEvent(event);
} catch (Exception e) {
// TODO: handle exception
}
}
}

即使您可以使用组件queueEvent(FacesEvent event)方法自己注册任何事件,如果getPhaseId()方法是,它也会注册事件并通过MyEvent类中的getPhaseId()方法获取将触发的阶段不被开发者覆盖,那么它将在其注册的同一阶段触发

关于JSF:带有自定义事件的 <f:event>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7413546/

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