update_model_values阶段未在jsf中执行

时间:2013-11-18 20:21:52

标签: jsf-2

我真的有触摸时间处理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

我不知道为什么会这样,感谢任何帮助。

1 个答案:

答案 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"代替。

另见: