在阅读了 BalusC 的评论后,我再次更新了这篇文章。
我创建了一个小型演示应用程序并查看各个阶段以及转换和验证发生的时间。
查看:
<h:form>
<h:inputText value="#{demoBean.field}">
<f:converter converterId="demoConverter"/>
<f:validator validatorId="demoValidator"/>
</h:inputText>
<h:commandButton value="Submit" action="#{demoBean.demoAxn()}"/>
</h:form>
托管 bean:
@ManagedBean
@SessionScoped
public class DemoBean implements Serializable {
private String field;
public DemoBean() {
System.out.println(Thread.currentThread().getStackTrace()[1]);
}
public String getField() {
System.out.println(Thread.currentThread().getStackTrace()[1]);
return field;
}
public void setField(String field) {
System.out.println(Thread.currentThread().getStackTrace()[1]);
this.field = field;
}
public String demoAxn() {
System.out.println(Thread.currentThread().getStackTrace()[1]);
return null;
}
}
转换器:
@FacesConverter(value="demoConverter")
public class DemoConverter implements Converter {
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
System.out.println(Thread.currentThread().getStackTrace()[1]);
return value;
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
System.out.println(Thread.currentThread().getStackTrace()[1]);
return (String) value;
}
}
验证器:
@FacesValidator(value="demoValidator")
public class DemoValidator implements Validator {
@Override
public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
System.out.println(Thread.currentThread().getStackTrace()[1]);
}
}
相位监听器:
public class DemoPhaseListener implements PhaseListener {
@Override
public void afterPhase(PhaseEvent event) {
System.out.println(Thread.currentThread().getStackTrace()[1]);
System.out.println("PhaseId: " + event.getPhaseId() + " ===============================\n\n");
}
@Override
public void beforePhase(PhaseEvent event) {
System.out.println("\n\nPhaseId: " + event.getPhaseId() + " ===============================");
System.out.println(Thread.currentThread().getStackTrace()[1]);
}
@Override
public PhaseId getPhaseId() {
return PhaseId.ANY_PHASE;
}
}
注册了阶段监听器:
<lifecycle>
<phase-listener>pkg.DemoPhaseListener</phase-listener>
</lifecycle>
当点击“提交”按钮时,使用该设置,输出为:
信息:PhaseId:RESTORE_VIEW 1 ===============================
信息:pkg.DemoPhaseListener.beforePhase(DemoPhaseListener.java:17)
信息:pkg.DemoPhaseListener.afterPhase(DemoPhaseListener.java:10)
信息:PhaseId:RESTORE_VIEW 1 ===============================
信息:PhaseId:APPLY_REQUEST_VALUES 2 ===============================
信息:pkg.DemoPhaseListener.beforePhase(DemoPhaseListener.java:17)
信息:pkg.DemoPhaseListener.afterPhase(DemoPhaseListener.java:10)
信息:PhaseId:APPLY_REQUEST_VALUES 2 ===============================
信息:PhaseId:PROCESS_VALIDATIONS 3 ================================
信息:pkg.DemoPhaseListener.beforePhase(DemoPhaseListener.java:17)
信息:pkg.DemoConverter.getAsObject(DemoConverter.java:13)
信息:pkg.DemoValidator.validate(DemoValidator.java:14)
信息:pkg.DemoBean.getField(DemoBean.java:17)
信息:pkg.DemoPhaseListener.afterPhase(DemoPhaseListener.java:10)
信息:PhaseId:PROCESS_VALIDATIONS 3 ================================
信息:PhaseId:UPDATE_MODEL_VALUES 4 ===============================
信息:pkg.DemoPhaseListener.beforePhase(DemoPhaseListener.java:17)
信息:pkg.DemoBean.setField(DemoBean.java:22)
信息:pkg.DemoPhaseListener.afterPhase(DemoPhaseListener.java:10)
信息:PhaseId:UPDATE_MODEL_VALUES 4 ===============================
信息:PhaseId:INVOKE_APPLICATION 5 ================================
信息:pkg.DemoPhaseListener.beforePhase(DemoPhaseListener.java:17)
信息:pkg.DemoBean.demoAxn(DemoBean.java:27)
信息:pkg.DemoPhaseListener.afterPhase(DemoPhaseListener.java:10)
信息:PhaseId:INVOKE_APPLICATION 5 ================================
信息:PhaseId:RENDER_RESPONSE 6 ================================
信息:pkg.DemoPhaseListener.beforePhase(DemoPhaseListener.java:17)
信息:pkg.DemoBean.getField(DemoBean.java:17)
信息:pkg.DemoConverter.getAsString(DemoConverter.java:20)
信息:pkg.DemoPhaseListener.afterPhase(DemoPhaseListener.java:10)
信息:PhaseId:RENDER_RESPONSE 6 ================================
但是当做出如下改变以在转换器中抛出 NPE 时:
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
System.out.println(Thread.currentThread().getStackTrace()[1]);
throw new NullPointerException();
}
输出是:
信息:PhaseId:RESTORE_VIEW 1 ===============================
信息:pkg.DemoPhaseListener.beforePhase(DemoPhaseListener.java:17)
信息:pkg.DemoPhaseListener.afterPhase(DemoPhaseListener.java:10)
信息:PhaseId:RESTORE_VIEW 1 ===============================
信息:PhaseId:APPLY_REQUEST_VALUES 2 ===============================
信息:pkg.DemoPhaseListener.beforePhase(DemoPhaseListener.java:17)
信息:pkg.DemoPhaseListener.afterPhase(DemoPhaseListener.java:10)
信息:PhaseId:APPLY_REQUEST_VALUES 2 ===============================
信息:PhaseId:PROCESS_VALIDATIONS 3 ================================
信息:pkg.DemoPhaseListener.beforePhase(DemoPhaseListener.java:17)
信息:pkg.DemoConverter.getAsObject(DemoConverter.java:13)
信息:pkg.DemoPhaseListener.afterPhase(DemoPhaseListener.java:10)
信息:PhaseId:PROCESS_VALIDATIONS 3 ================================
信息:pkg.DemoBean.getField(DemoBean.java:17)
但堆栈跟踪显示在结果视图中。