• JSF教程(10)——生命周期之Update Model Values Phase


    在整个JSF生命周期中经历了取值、验证的阶段终于从request中拿到合理的值,以下就是在本阶段给相应的服务端对象(ManageBean)赋值了。JSF实现仅仅是去更新和input组件中value属性相应的bean的属性的值,也就是说假设在界面上没有讲ManageBean的属性“绑定”到Input类的组件中那么这个Bean的属性是不会更新的。这里须要留意的是假设本地的数据不能转化为相应Bean的属性类型,那么生命周期将直接定位到Render Response步骤,这时候页面将会显示错误信息(这非常好理解,想要往一个Bean中传递值那么起码这个Bean中应该有set方法,可是假设set方法中的參数与传递过来的參数不一致肯定就会报错了),以上过程和验证时产生的错误的情况相似。


    以下的各个情况和前面两个步骤中的处理基本一致,仅仅只是以下的情况是发生在Update Model阶段的。

    假设不论什么updateModels方法或者监听器调用renderResponse方法在当前FacesContext实例,JSF实现者将跳转至Render Response阶段。

    和上面两者步骤一致,又一次定位到外部资源或者产生一个不包括JSF组件的响应都将调用FacesContext.responseComplete方法。

    假设不论什么事件增加到队列中在这个阶段,JSF实现者会将他们传送到相关的监听器。

    和上面两个阶段相似,假设当前的请求是局部请求,那么局部的context会依据FacesContext中的内容又一次恢复,而且局部的处理方法会被调用。

    这里看一段UIInput的代码,前面几篇博文中提到个各个阶段中的处理过程,是由PartialViewContextImpl类中的process*方法运行的,可是到头来真正做底层工作的仅仅能是底层的人民。这里要说的就是当中的一个组件类。以Update Model阶段作为样例,前面一切就绪最后要更新了就要底层的方法去更新Model的值了(决策者负责决策,干活的永远是小兵),代码例如以下

    public void updateModel(FacesContext context) {
    
            if (context == null) {
                throw new NullPointerException();
            }
    
            if (!isValid() || !isLocalValueSet()) {
                return;
            }
            ValueExpression ve = getValueExpression("value");
            if (ve != null) {
                Throwable caught = null;
                FacesMessage message = null;
                try {
                    ve.setValue(context.getELContext(), getLocalValue());
                    setValue(null);
                    setLocalValueSet(false);
                } catch (ELException e) {
                    caught = e;
                    String messageStr = e.getMessage();
                    Throwable result = e.getCause();
                    while (null != result &&
                         result.getClass().isAssignableFrom(ELException.class)) {
                        messageStr = result.getMessage();
                        result = result.getCause();
                    }
                    if (null == messageStr) {
                        message =
                             MessageFactory.getMessage(context, UPDATE_MESSAGE_ID,
                                  MessageFactory.getLabel(
                                       context, this));
                    } else {
                        message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                                   messageStr,
                                                   messageStr);
                    }
                    setValid(false);
                } catch (Exception e) {
                    caught = e;
                    message =
                         MessageFactory.getMessage(context, UPDATE_MESSAGE_ID,
                              MessageFactory.getLabel(
                                   context, this));
                    setValid(false);
                }
                if (caught != null) {
                    assert(message != null);
                    // PENDING(edburns): verify this is in the spec.
                    @SuppressWarnings({"ThrowableInstanceNeverThrown"})
                    UpdateModelException toQueue =
                          new UpdateModelException(message, caught);
                    ExceptionQueuedEventContext eventContext =
                          new ExceptionQueuedEventContext(context,
                                                    toQueue,
                                                    this,
                                                    PhaseId.UPDATE_MODEL_VALUES);
                    context.getApplication().publishEvent(context,
                                                          ExceptionQueuedEvent.class,
                                                          eventContext);
                    
                }
                
            }
        }

    最后的最后还是落到了el-ri-1.0.jar这个包中,再往下走就是jsp-api-2.1.jar这个包了,由此能够证明JSF是在JSP基础之上的(好废话哇~),到此相信再看上面的图就有非常多人理解了。可是假设起初就拿出这幅图来看相信大部分人仅仅是扫一眼而已(起码笔者当时就是扫了一眼,后来才发现这个图画的真好)。学习是须要重复的过程,越嚼越有味。

  • 相关阅读:
    opencv行列式按行(列)展开
    线性方程组
    opencvVideoCapture视频和摄像头读写
    浅谈测试的成就感
    关于软件测试职业规划的讨论 .
    多进程,多线程,就是这么回事儿
    测试计划的制定
    写给测试新手 .
    测试最需要的是淡定
    用一个比喻说明项目里各个成员的角色
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3776650.html
Copyright © 2020-2023  润新知