一.jsf(java server faces)的运行原理(工做方式)html
1.jsf应用是事件驱动的,当一个事件发生时(好比用户单击一个按钮),事件通知经过HTTP发往服务器,服务器端使用叫作FacesServlet的特殊servlet处理该通知,web容器里每个jsf应用都有它本身的FacesServlet;java
在后台,每个jsf请求都触发了3件事情:web
1)FacesServlet建立FacesContext(该对象中包含Web容器传给FacesServlet的service方法的ServletContext,ServletRequest,ServletRespons对象,在处理过程当中主要就是修改这个FacesContext)服务器
2)FacesServlet把控制权交给Lifecyclejsp
3)Lifecycle分6个阶段处理FacesContext(也即jsf生命周期过程)函数
二.jsf生命周期过程工具
1. 重建视图: 创建组件树,若是是首次渲染,则组件树被重置合适的状态;若是不是首次渲染,则组件树被建立跳到响应阶段(JSF的组件树结构和DOM是同样的,只不事后者是client前者是server)。性能
2. 应用请求值: 树中的每一个组件都能从请求参数中提取到新的值,并把值存储本地,以后处理全部与组件相关的事件进入队列,若是某个组件的immediate属性设置为true,那么验证,转换,以及与组件关联的事件在这个阶段被处理.ui
3. 处理验证: 组件值转换成与之相对应的数据类型。若是转换失败,这一阶段将继续完成全部剩余的转换器,验证和运行所需的检查,但在完成后,跳转到生命周期的Render Response阶段。若是验证成功,则检查组件上的required 的属性。若是该属性是必须的而且组件中输入了值,那么与之相关的验证程序运行。若是required的属性是必须但又没有输入值,这一阶段完成(全部剩余验证程序还会继续执行),而后生命周期跳跃到Render Response阶段。若是required 属性标识为false,无论组件中有没有输入值,验证过程都不会运行。spa
4. 更新模型: 验证组件的本地值移动到模型中,同时本地副本被丢弃。
5. 调用应用程序: 执行应用级逻辑(如事件处理程序)。
6. 呈现响应: 呈现树中的组件。后续请求和Restore View阶段保存状态信息。
2、Facelets
Facelets是一种轻量级的页面声明语言,用于使用HTML样式构建JSF(JavaServer Faces)视图。
它包括如下功能:
优势
JSF(JavaServer Faces)技术支持各类标签库,以将组件添加到网页。 为了支持JavaServer Faces标签库机制,Facelets使用XML命名空间声明。
下表显示了Facelets支持的标签库。
标签库 | URI | 前缀 | 示例 | 内容 |
---|---|---|---|---|
JSF Facelets标签库 | http://xmlns.jcp.org/jsf/facelets | ui: |
ui:component ,ui:insert |
模板标签 |
JSF HTML标签库 | http://xmlns.jcp.org/jsf/html | h: |
h:head ,h:body |
全部UI组件对象的JavaServer Faces组件标记 |
JSF核心标签库 | http://xmlns.jcp.org/jsf/core | f: |
f:actionListener , f:attribute |
JSF标签独立于任何特定渲染工具包的自定义操做 |
传递元素标签库 | http://xmlns.jcp.org/jsf | jsf: |
jsf:id |
支持HTML5友好标记的标签 |
传递属性标签库 | http://xmlns.jcp.org/jsf/passthrough | p: |
p:type |
支持HTML5友好标记的标签 |
复合组件标签库 | http://xmlns.jcp.org/jsf/composite | cc: |
cc:interface |
支持复合组件的标签 |
JSTL核心标签库 | http://xmlns.jcp.org/jsp/jstl/core | c: |
c:forEach , c:catch |
JSTL 1.2核心标签 |
JSTL函数标签库 | http://xmlns.jcp.org/jsp/jstl/functions | fn: |
fn:toUpperCase , fn:toLowerCase |
JSTL 1.2函数标签 |
JSF规范定义了JavaServer Faces应用程序的生命周期。如下步骤为基于 Facelets 的应用程序的过程描述。
生命周期是在客户端使用Facelets
建立的网页发出新请求时启动。 JSF建立一个新的组件树或javax.faces.component.UIViewRoot
并放入FacesContex
。
若是可用的UIViewRoot
应用于Facelets
, 视图能够填充组件进行渲染。
新建的视图做为对客户端的响应而被渲染。
在渲染时,存储此视图的状态用于下一个请求。 存储输入组件和表单数据的状态。
客户端能够与视图交互,并从JSF应用程序请求另外一个视图。 此时,保存的视图从存储状态恢复。
恢复视图再次经过JSF生命周期,若是没有验证问题,而且没有触发任何操做,最终将生成新视图或从新呈现当前视图。
若是请求相同的视图,则再次呈现存储的视图。
若是要求新视图,则继续执行【步骤2】。
将新视图做为对客户端的响应。