action
和actionListener
之间的区别是什么?我应该何时使用action
与actionListener
?
答案 0 :(得分:553)
答案 1 :(得分:45)
正如BalusC指出的那样,actionListener
默认情况下会吞下异常,但在JSF 2.0中还有更多内容。也就是说,它不只是吞下和记录,而是实际发布异常。
通过以下呼叫发生这种情况:
context.getApplication().publishEvent(context, ExceptionQueuedEvent.class,
new ExceptionQueuedEventContext(context, exception, source, phaseId)
);
此事件的默认侦听器是ExceptionHandler
,其中Mojarra设置为com.sun.faces.context.ExceptionHandlerImpl
。这个实现基本上会重新抛出任何异常,除非它涉及记录的AbortProcessingException。 ActionListeners包装客户端代码在此类AbortProcessingException中抛出的异常,该异常解释了为什么始终记录这些异常。
但是,可以在faces-config.xml中使用自定义实现替换此ExceptionHandler
:
<exception-handlerfactory>
com.foo.myExceptionHandler
</exception-handlerfactory>
单个bean也可以监听这些事件,而不是全局监听。以下是对此概念的证明:
@ManagedBean
@RequestScoped
public class MyBean {
public void actionMethod(ActionEvent event) {
FacesContext.getCurrentInstance().getApplication().subscribeToEvent(ExceptionQueuedEvent.class, new SystemEventListener() {
@Override
public void processEvent(SystemEvent event) throws AbortProcessingException {
ExceptionQueuedEventContext content = (ExceptionQueuedEventContext)event.getSource();
throw new RuntimeException(content.getException());
}
@Override
public boolean isListenerForSource(Object source) {
return true;
}
});
throw new RuntimeException("test");
}
}
(请注意,这不是人们通常应该如何编写侦听器的代码,这仅用于演示目的!)
从这样的Facelet中调用它:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:body>
<h:form>
<h:commandButton value="test" actionListener="#{myBean.actionMethod}"/>
</h:form>
</h:body>
</html>
将导致显示错误页面。
答案 2 :(得分:39)
在调用Action之前,首先触发ActionListener,并选择修改响应,并确定下一页的位置。
如果同一页面上有多个按钮,它们应该转到相同的位置,但做的事情略有不同,则可以对每个按钮使用相同的Action,但使用不同的ActionListener来处理稍微不同的功能。
以下是描述关系的链接:
答案 3 :(得分:0)
TL; DR :
ActionListener
(可以有多个)按照它们在action
之前的注册顺序执行
长答案:
企业action
通常会调用EJB服务,并且在必要时还会设置最终结果和/或导航到其他视图
如果不是您正在做的事情,那么actionListener
更合适,即,当用户与组件交互时,例如h:commandButton
或h:link
,可以通过传递名称来处理它们。 UI组件的actionListener
属性中的托管bean方法,或实现一个ActionListener
接口并将实现类名传递给UI组件的actionListener
属性。