日期:2014-05-16 浏览次数:20372 次
当浏览器首先连接到http://localhost:8080/faces/index.xhtml时,JSF实现初始化JSF代码并读取index.xhtml页面。这个页面包含诸如h:inputText等JSF标签。每个标签都有一个相关的标签处理程序类。当读取该页面时,执行相应的标签处理程序。JSF标签处理程序彼此协作来构建一棵组件树。
组件树是一种数据结构,其中包含JSF页面上所有用户界面元素的Java对象。例如UIInput对象分别对应于JSF文件中的h:inputText和h:inputSecret字段。
接着呈现HTML页面。除JSF标签外的所有文本直接显示。h:form、h:inputText、h:inputSecret和h:commandButton标签则被转换为HTML。其中每个标签都调用相关的组件。每个组件有一个呈现器以生成HTML输出,反映组件状态。例如,与h:inputText标签对应的组件呈现器生成以下输出:
<input type="text" name="unique ID" value="current value"/>
这个进程称为编码。UIInput对象的呈现器要求JSF实现查找user.name表达式的唯一ID和当前值。默认情况下,由JSF实现指定ID字符串。ID看上去是随机的。
编码页被发送到浏览器,浏览器按通常的方式显示它。
当在浏览器中显示页面后,用户填写表单字段并单击登录按钮。浏览器将表单数据发回到Web服务器,格式化为一个POST请求。这是一种特殊格式,并被定义为HTML协议的一部份。POST请求包含表单的URL(/faces/index.xhtml)以及表单数据。
注意:POST请求的URL与呈现表单的请求的URL一样。在提交表单后,将导航到新页面(由于这个原因,浏览器中显示的URL通常比所显示JSF页面的URL晚一步)。
表单数据是ID/值对形式的字符串,使用“&”连接多个键。作为正常请求处理的一部份,表单数据位于所有组件都可以访问的Hash表中。
接下来,JSF实现为每个组件提供了一个检查Hash表的机会,这个过程称为解码。每个组件自行决定如何解释表单数据。
登录表单有三个组件对象:两个UIInput对象(与表单的文本字段对应)和一个UICommand对象(与提交按钮对应)。
然后重复以上步骤。
JSF实现的两个最重要的处理步骤:编码和解码。但是,处理顺序(也称为生命周期)则较为复杂。如果一切正常,那么用户则不必担心生命周期的复杂性。然而,当发生错误时,就必须了解JSF实现做了什么。
JSF规范定义了六个不同的阶段:
这里讲述生命周期最常见的流程:
注意:在Ajax应用中,Ajax请求将输入组件添加到execute列表中,将输出组件添加到render列表中。对execute列表中的组件来说,会执行除“呈现响应”外的所有阶段。确切地讲,在“更新模型值”阶段,会更新模型bean。与此相反,对于render列表中的组件来说,仅执行生命周期的“呈现响应”阶段,结果被发回到Ajax请求。