我真的有触摸时间处理jsf生命周期阶段。我试图通过传递支持bean来调用业务逻辑。我注意到根本没有调用更新模型阶段。让我解释一下代码。
MyPage.xhtml
<h:selectOneMenu value="#{myModel.sortBy}">
<f:selectItem itemValue="studId" itemLabel="Student Id" />
<f:selectItem itemValue="rollNo" itemLabel="Roll No" />
<f:param name="actionValue" value="sort" />
<a4j:ajax event="change" render=":stdGrp" listener="#{myModel.processAjaxBehavior}" execute="@form" />
</h:selectOneMenu>
<h:selectOneMenu value="#{myModel.sortOrder}">
<f:selectItem itemValue="asc" itemLabel="Ascending" />
<f:selectItem itemValue="desc" itemLabel="Descending" />
<f:param name="actionValue" value="sort" />
<a4j:ajax event="change" render=":stdGrp" listener="#{myModel.processAjaxBehavior}" execute="@form" />
</h:selectOneMenu>
我的支持豆是: MyModel.java
public class MyModel implements Serializable, AjaxBehaviorListener,PhaseListener{
private String sortBy = "studId";
private String sortOrder = "desc";
//Getters and setters
@Override
public void processAjaxBehavior(AjaxBehaviorEvent arg0) throws AbortProcessingException {
String eventId = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("actionValue");
if(StringUtils.isNotBlank(eventId)) {
FacesContext.getCurrentInstance().getExternalContext().getRequestMap().put(JsfView.EVENT_KEY, eventId);
}
else {
throw new ApplicationException("param tag expected with 'activeValue' along with ajax tag" ,null );
}
}
@Override
public void afterPhase(PhaseEvent arg0) {
System.out.println("END PHASE " + arg0.getPhaseId());
}
@Override
public void beforePhase(PhaseEvent arg0) {
System.out.println("START PHASE " + arg0.getPhaseId());
}
@Override
public PhaseId getPhaseId() {
return PhaseId.ANY_PHASE;
}
}
在webflow中有一些过渡状态来处理排序。 但问题是,当我选择下拉菜单时,页面中没有任何内容发生变化,我也没有注意到错误,我也使用了rich:message甚至。
但是从tomcat日志中我可以看到,第4阶段和第5阶段已经过了。
START PHASE RESTORE_VIEW 1
END PHASE RESTORE_VIEW 1
START PHASE APPLY_REQUEST_VALUES 2
END PHASE APPLY_REQUEST_VALUES 2
START PHASE PROCESS_VALIDATIONS 3
END PHASE PROCESS_VALIDATIONS 3
START PHASE RENDER_RESPONSE 6
END PHASE RENDER_RESPONSE 6
我不知道为什么会这样,感谢任何帮助。
答案 0 :(得分:1)
发生转换或验证错误时会发生这种情况。通常,最终用户会通过<h:message(s)>
显示的面部消息通过转换/验证错误通知。如果您的视图和/或操作以某种方式设计,使得这些消息没有任何显示的机会,那么它们通常会作为警告记录到服务器日志中。
很难说出你的情况究竟发生了什么,因为代码没有SSCCE风格,你没有明确提到你是否检查了服务器日志中的线索。我最好的猜测是,在您使用execute="@form"
的情况下,表单中的其他位置会出现验证错误。 execute="@form"
即提交,处理,转换和验证整个表单。如果其中一个输入的转换/验证失败,则会绕过更新模型值并调用应用程序阶段。
向视图添加<h:messages>
后,或者至少将<h:message>
附加到每个输入组件,并确保render="..."
涵盖了消息组件,那么你应该能够看到它们。
E.g。
<h:messages id="messages" />
<h:form>
...
<a4j:ajax ... render=":messages :stdGrp" />
...
</h:form>
或者,如果您实际上不想执行整个表单,只需要执行当前组件,那么您应该使用execute="@this"
代替。