首页 > 代码库 > JSF教程(10)——生命周期之Update Model Values Phase
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基础之上的(好废话哇~),到此相信再看上面的图就有很多人理解了。但是如果起初就拿出这幅图来看相信大部分人只是扫一眼而已(起码笔者当时就是扫了一眼,后来才发现这个图画的真好)。学习是需要反复的过程,越嚼越有味。