在整个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基础之上的(好废话哇~),到此相信再看上面的图就有非常多人理解了。可是假设起初就拿出这幅图来看相信大部分人仅仅是扫一眼而已(起码笔者当时就是扫了一眼,后来才发现这个图画的真好)。学习是须要重复的过程,越嚼越有味。

JSF教程(10)——生命周期之Update Model Values Phase的更多相关文章

  1. JSF教程(8)——生命周期之Apply Request Values Phase

    当一个组件树在一个postbacks请求中被恢复之后其中每一个组件从request的參数中取得各自的值,这里使用的是processDecodes方法. 这个值会保存在本地的每一个组件中,在源代码中此过 ...

  2. Android Studio教程03-Activtiy生命周期的理解

    目录 1. Activity 1.1. 安卓中的Activity定义和特性: 1.2. 注册Activity 1. Intent filters:设置默认开启的activity 1.3. Activi ...

  3. 前端组件化Polymer入门教程(5)——生命周期

    以前我对生命周期这个概念还真不是很清楚,不过想想也简单,比如说人的生命周期,无非就是生老病死.而对于程序的生命周期就是说,它在每个阶段都会做不同的事,再比如说回调函数把,ajax返回的时候它才执行,那 ...

  4. Spring(3.2.3) - Beans(10): 生命周期

    Spring 容器可以管理 singleton 作用域 Bean 的生命周期,容器能够跟踪 Bean 实例的创建.销毁.管理 Bean 生命周期行为主要有两个时机: 注入 Bean 的依赖关系之后 即 ...

  5. Spring - IoC(10): 生命周期

    Spring 容器可以管理 singleton 作用域 Bean 的生命周期,容器能够跟踪 Bean 实例的创建.销毁.管理 Bean 生命周期行为主要有两个时机: 注入 Bean 的依赖关系之后 即 ...

  6. JSF教程(9)——生命周期之Process Validations Phase

    在这个过程其中JSF的实现者使用processValidators方法处理全部在tree中的组件中注冊的验证器.验证的过程就是通过每一个组件已有的规则对其已经保存的值进行校验,同一时候也对输入的值进行 ...

  7. JSF教程(11)——生命周期之Invoke Application Phase

    在这个阶段JSF实现将处理不论什么应用界别的事件,比如表单的提交或者链接点击后跳转到还有一个页面. 这时假设应用须要重定向不同 的web应用字眼或者产生一个资源其并不喊不论什么的JSF组件,那么就调用 ...

  8. JSF控件的immediate属性和页面生命周期

    JSF中的控件基本都有immediate属性,对于这个属性的使用总结如下,更详细内容可参考Oracle官方文档. 1,为了更好的理解immediate属性,先看一下JSF页面的生命周期: JSF页面的 ...

  9. JSF生命周期&Facelets的生命周期

    1.JSF生命周期 1)恢复视图(Restore View) 视图表示组成特定页面的所有组件.它被保存在 客户端(通常存储在隐藏字段中)或服务器中(通常在会话中).根据请求访问的视图ID(页面地址), ...

随机推荐

  1. 【策略】HDOJ-1205-吃糖果

    [题目链接:HDOJ-1205] 思路:直接看题毫无思路... 看了别人的思路,到现在还懵懵懂懂.   只要除了数目最多的糖果以外的其他所有糖果的数目之和加1(小心这里要用int64),大于等于数目最 ...

  2. link 参数

    -all-static do not do any dynamic linking at all -avoid-version do not add a version suffix if possi ...

  3. POJ 1519 Digital Roots

    题意:求数根. 解法:一个数的数根就是mod9的值,0换成9,只是没想到给的是一个大数……只好先把每位都加起来再mod9…… 代码: #include<stdio.h> #include& ...

  4. HDU 5365 Run

    题意:给n个整点,问用其中若干个做顶点能够成多少个正三角形或正四边形或正五边形或正六边形. 解法:出题人说 地球人都知道整点是不能构成正五边形和正三边形和正六边形的,所以只需暴力枚举四个点判断是否是正 ...

  5. HDU 5768 Lucky7 容斥原理+中国剩余定理(互质)

    分析: 因为满足任意一组pi和ai,即可使一个“幸运数”被“污染”,我们可以想到通过容斥来处理这个问题.当我们选定了一系列pi和ai后,题意转化为求[x,y]中被7整除余0,且被这一系列pi除余ai的 ...

  6. char[]数组与char *指针的区别

    char[]数组与char *指针的区别 问题描述 虽然很久之前有看过关于char指针和char数组的区别,但是当时没有系统的整理,到现在频繁遇到,在string,char[], char *中迷失了 ...

  7. 学习笔记——XSLT转换器的使用(Xalan和Saxon) .(转)

    转自:http://blog.csdn.net/crystalbruce/article/details/7401602 XSLT分为两类: 1:客户端转换:需要浏览器的支持. 2:服务器转换:需要使 ...

  8. sqlServer 取每组的前几条数据

    首先的建表语句: ) DROP TABLE [test] CREATE TABLE [test] ( [id] [, ) NOT NULL , [name] [nvarchar] () NULL , ...

  9. 安装centos 7 体验安装过程

    1. 下载centos7的iso文件,放入虚拟机的启动光盘中 2. 选择启动,然后可以看到安装的选项 3. 进行安装之后,会自动的进行一个检查 4. 选择安装的语言 5. 进入之后,可以看到所有需要安 ...

  10. 转-CMMI在中国之混乱-CMMI比ISO9000会更惨

    CMMI在中国之混乱-CMMI比ISO9000会更惨 自己接触CMM/CMMI已经有8年时间了,现在静心回顾一下,觉得CMMI在中国的命运会比ISO9000还悲惨. 一组现象或许让你我对此结论有更深入 ...