JSF的事件模型和生命周期
- 格式:ppt
- 大小:130.50 KB
- 文档页数:16
JSF 技术内幕当扫瞄器首先衔接到http://localhost:8080/faces/ind.xhtml时,JSF实现初始化JSF代码并读取index.xhtml页面。
这个页面包含诸如h:inputText等JSF标签。
每个标签都有一个相关的标签处理程序类。
当读取该页面时,执行相应的标签处理程序。
JSF标签处理程序彼此配合来构建一棵组件树。
组件树是一种数据结构,其中包含JSF页面上全部用户界面元素的Java对象。
例如UIInput对象分离对应于JSF文件中的h:inputText和h:inputSecret字段。
接着展现HTML页面。
除JSF标签外的全部文本挺直显示。
h:fo、h:inputText、h:inputSecret 和h:commandButton标签则被转换为HTML。
其中每个标签都调用相关的组件。
每个组件有一个展现器以生成HTML输出,反映组件状态。
例如,与h:inputText标签对应的组件展现器生成以下输出: input type="text" name="ue ID" value="current value"/ 这个进程称为编码。
UIInput对象的展现器要求JSF实现查找表达式的唯一ID和当前值。
默认状况下,由JSF实现指定ID字符串。
ID看上去是随机的。
编码页被发送到扫瞄器,扫瞄器按通常的方式显示它。
当在扫瞄器中显示页面后,用户填写表单字段并单击登录按钮。
扫瞄器将表单数据发回到Web服务器,格式化为一个POST哀求。
这是一种特别格式,并被定义为HTML协议的一部份。
POST哀求包含表单的URL (/faces/index.xhtml)以及表单数据。
注重:POST哀求的URL与展现表单的哀求的URL一样。
在提交表单后,将导航到新页面(因为这个缘由,扫瞄器中显示的URL通常比所显示JSF页面的URL晚一步)。
JSF框架简介与实例JSF 体系结构:JSF 的主要优势之⼀就是它既是 Java Web 应⽤程序的⽤户界⾯标准⼜是严格遵循模型-视图-控制器 (MVC) 设计模式的框架。
⽤户界⾯代码(视图)与应⽤程序数据和逻辑(模型)的清晰分离使 JSF 应⽤程序更易于管理。
为了准备提供页⾯对应⽤程序数据访问的 JSF 上下⽂和防⽌对页⾯未授权或不正确的访问,所有与应⽤程序的⽤户交互均由⼀个前端FacesServlet(控制器)来处理。
JSF ⽣命周期:FacesServlet 充当⽤户和 JSF 应⽤程序之间的纽带。
它在明确限定的 JSF ⽣命周期(规定了⽤户请求之间的整个事件流)的范围内⼯作。
1.当JSF页⾯上的⼀个事件发⽣时(⽐如:⽤户单击了⼀个按钮),事件通知通过HTTP发往服务器。
服务器端使⽤FacesServet这个特殊的Servlet处理该通知。
2. FacesServlet⼀接收到⽤户的请求就创建⼀个FacesContext对象(JSF上下⽂,它存放了应⽤程序的所有数据)。
在处理过程中,主要修改的就是这个FaceContext对象。
3.接着就是处理过程,处理器是⼀个叫作Lifecycle的对象。
FacesServet把控制权转交给Lifecycle对象。
该对象分6个阶段来处理FacesContext对象以⽣成响应,最后将响应发回客户端。
Lifecycle对象处理JSP请求所需要的⼀系列动作称为请求处理⽣命周期。
过程状态图如下:由于请求处理⽣命周期⾥的应⽤请求值、处理验证、更新模型值和调⽤应⽤程序等阶段都可以在当前的请求对应的FacesContext实例中添加事件,因此,JSF实现必须在这些阶段后处理这些事件。
阶段说明恢复视图为选定的视图找到或创建组件树。
⼀旦⽤户单击JSP页⾯上的链接或按钮,就会启动此阶段。
JSF应⽤⾥的JSP页⾯被表⽰成⼀个组件树。
JSF实现会进⼀步将这些组件链接到事件处理程序和验证程序,并将视图保存在FacesContext对象中,以备后⾯的处理过程所⽤。
JavaScript的事件循环知识点JavaScript事件循环(Event Loop)是理解JavaScript异步编程的关键概念之一。
了解事件循环的工作原理,对于深入理解JavaScript的运行机制至关重要。
本文将介绍JavaScript事件循环的基本概念以及相关知识点。
1. 单线程模型JavaScript是一种单线程的脚本语言,意味着它在同一时刻只能执行一个任务。
这与其他多线程语言有很大的不同,因为多线程语言可以同时处理多个任务,提高程序的并发性和性能。
2. 任务队列JavaScript将任务分为两种类型:同步任务和异步任务。
同步任务按照顺序依次执行,而异步任务则会被放入任务队列中等待执行。
3. 事件循环机制JavaScript的事件循环机制基于任务队列。
当执行一个脚本时,会创建一个主线程来执行其中的同步任务。
同时,主线程会检查任务队列是否有可执行的异步任务。
如果存在异步任务,主线程会将这些任务推入执行栈中,以供执行。
4. 宏任务与微任务在任务队列中,有两种类型的任务:宏任务(macro task)和微任务(micro task)。
宏任务包括整体代码块、setTimeout、setInterval等,而微任务则包括Promise、MutationObserver等。
5. Event Loop的执行顺序当主线程执行完当前的宏任务后,会检查微任务队列中是否有任务。
如果有,会将微任务队列中的所有任务依次执行完毕。
然后再继续执行下一个宏任务。
这种执行顺序被称为"先微任务,后宏任务"。
6. 定时器setTimeout和setInterval是常用的定时器函数。
它们被放入宏任务队列,并在指定的时间后被推入执行栈中执行。
7. 异常处理在事件循环中,如果一个任务发生异常,异常信息会被推到任务队列的末尾,等待下一次事件循环执行时被捕获和处理。
8. 阻塞问题由于JavaScript是单线程的,如果某个任务执行时间过长,会导致后续的任务无法及时执行。
JSF的每個元件基本上都是可替換的,像是轉換器(Converter)、驗證器(Validator)、元件(Component)、繪製器(Renderer)等等,每個元件都可以替換讓JSF在使用時更有彈性,但相對的所付出的就是元件組合時的複雜性,為此,最基本的,如果您打算自訂一些 JSF元件,那麼您對於JSF處理請求的每個階段必須要有所瞭解。
下圖是JSF處理請求時的每個階段與簡單說明,起始狀態即使用者端發出請求時,終止狀態則相當於繪製器發出回應時:扣除事件處理,JSF總共必須經過六個階段:回復畫面(Restore View)對於選擇的頁面如果是初次瀏覽則建立新的元件樹。
如果是會話階段,會從使用者端或伺服器端的資料找尋資料以回復每個元件的狀態並重建元件樹,如果不包括請求參數,則直接跳過接下來的階段直接繪製回應。
∙套用申請值(Apply Request Values)每個元件嘗試從到來的請求中找尋自己的參數並更新元件值,在這邊會觸發ActionEvent,這個事件會被排入佇列中,然後在喚起應用程式階段之後才會真正由事件處理者進行處理。
然而對於設定immeduate為true的命令(Commamnd)元件來說,會立即處理事件並跳過之後的階段直接繪製回應,而對於設定immediate為true的輸入(Input)元件,會馬上進行轉換驗證並處理值變事件,之後跳過接下來的階段,直接繪製回應。
∙執行驗證(Process Validations)進行轉換與驗證處理,如果驗證錯誤,則會跳過之後的階段,直接繪製回應,結果是重新呼叫同一頁繪製結果。
∙更新模型值(Update Model Values)更新每一個與元件綁定的backing bean或模型物件。
∙喚起應用程式(Invoke Application)處理動作事件,並進行後端應用程式邏輯。
∙繪製回應(Render Response)使用繪製器繪製頁面。
如果您只是要「使用」JSF,則您最基本的只需要知道「執行驗證」、「更新模型值」、與「喚起應用程式」這三個階段及中間的事件觸發,JSF參考實作將這三個階段之外的其它階段之複雜性隱藏起來了,您不需要知道這幾個階段的處理細節。
一、项目背景作为下一代、高性能的军用飞行器,JSF (联合攻击机,定型后称为F-35 )项目是美国军方历史上最大的军火采购项目,总价值大约$7500 ~10000 亿美元。
五角大楼打算在波音和洛克希德·马丁之间选择,1996 年五角大楼分别拨给波音和洛克希德·马丁公司一笔投资,要求研制下一代中档战斗机,并希望在两个竞争者之间做最后的选择。
2001 年11 月 2 日揭晓,由以洛克希德·马丁公司为首的联盟中标。
二、项目介绍JSF 将是现有战机F-16 、F-18 等战机的替代型号,属于下一代、多角色的先进的军用战斗机,可用于美国空军、海军和海军陆战队,英国国防部以及世界上其它美国的盟友。
一批5000 架的庞大的机队将由世界上最好的飞机制造商的联合体来设计和制造。
对这个机队的使用和维护服务将一直延续到21 世纪中叶。
美国国防部对JSF 的要求是“一个型号,三种版本”,即要适合空军、海军和海军陆战队使用:常规型号(空军)航母型号(海军)短道起飞(海军陆战队)由于这三种用途的JSF 型号将建立在同一个飞机主体上。
一个公共的数字化平台将是极其关键的,它要能够在所有的变形数据中集合和充分利用系统的共性数据,以降低成本和节省设计制造时间。
此外,使用一个公共的数字化平台也能够让JSF 的团队建立一个客户化的系统,去满足那些打算选用JSF 的各个国家和地区的不同的要求。
JSF 机型的采购使用情况,美国以及英国军方已经决定采购约3000 架,美国的盟友(包括北约、加、澳、沙特、日、韩、新、马、泰、印尼、巴、台湾等)决定或有意向采购2000 ~3000 架。
JSF 项目由洛克西德·马丁、诺瑟若普·格鲁门及英国宇航公司共同承担,并联合近30 个国家约30 家供应商共同生产制造。
总体情况是:主要的承包商(“ Team JSF” ):洛克西德·马丁、诺瑟若普·格鲁门及英国宇航公司;第二级转包商:罗尔思·罗依斯、普惠、霍尼韦尔;第二级转包商:大约24 个国家的供应商;初期的客户:美国空军、海军和海军陆战队以及英国军方;其余客户:28 到30 个国家的政府或军方。
javaEE:JavaPlatform Enterprise Edition,即Java平台企业版。
JSF:全称JavaServer FacesJPA:JPA是Java社区推出的进行应用数据持久化的规范。
EJB:全称是企业版的JavaBean,是基于Java的服务器端的组件框架技术,从EJB3.0版本后开始加入注解。
托管Bean一般由属性和方法组成。
实体管理器的Flush方法可以立即提交JPA的修改到数据库。
Action事件应返回的数据类型String(字符串)。
JSF框架所使用的标签不需要配置直接在页面上调动。
Data Table的Var 属性的含义:该属性指定一个变量名,该<h:data table…/>元素内部即可通过该变量访问当前正在迭代输出的数据行。
JSF的6个生命周期及其生命周期事件:(1)恢复视图阶段;(2)应用请求值阶段;(3)处理输入校验阶段;(4)更新模型的值阶段;(5)调用应用阶段;(6)生成响应阶段;JSF的事件模型,并用具体事件来说明:事件源,JSF页面上所有UI组件都可作为事件源。
事件对象,当用户对UI组件执行动作时,JSF会为之创建对应的事件对象。
事件监听器,JSF的事件监听器比较灵活,既可直接使用托管Bean的某个方法来处理用户事件,也可使用专门的事件监听器对象。
JSF内置支持4种事件对象:Action事件:当用户单击某个<h:commandButton.../>,<h:commandLink.../>生成的组件时,JSF将会触发Action事件。
值改变事件:数据模型事件:生命周期事件:EntityManager是如何执行数据库存储过程的?Query query = em.createNativeQuery(“{call select_all_news(?)}”);List result = query.setParameter(1, “%Java%”).getResultList();JQuery的语法、语句、构造:把addressid大于2的Address实体全部删除:delete from Address awhere a.addressid >2JPQLde 批量删除:int result = em.createQuery(“delete from Address a” + “where a.addressid >?1”):JSF的开发配置:(填空JSF页面、标签、托管Bean、配置托管Bean、结合Flight页面登录)<managed-bean-name>login</managed-bean-name><managed-bean-class>com.Login</managed-bean-class><managed-bean-scope>request </managed-bean-scope><h:inputtext value=”#{}”<h:inputtext value=”#{login.pass}”<h:inputtext action=”#{login.logined}”public class Login{private string name;private string pass;private UserDAO dao;private List<User> alluser;private User users;public Login(){dao = new UserDAO();alluser= dao.findAll();}public string logined(){alluser = dao.findname(name);if(alluser.getsize()>>1){for(i>0;i<alluser.getsize();i++)users = alluser.get(0);if(users.getpass().equals(pass))return successelsereturn failure;}}编写实体DAO、拓展DAO完成增加会员的办法。
JSF规范(八)本文是基于JSF规范的翻译而来,并省掉一些无关紧要的章节。
如有不当之处请大家指正。
作者:youfly email:seedcloned-pub@转载请注明出处: /youfly11Lifecycle Management在第二章“Request Processing Lifecycle,” 里,描述了“请求处理生命周期”里每个阶段所要具备的功能。
在本章描述了JSF实现用来管理、执行生命周期的标准API。
这些类及接口都是javax.faces.lifecycle包的一部分。
页面的作者,组件编写者及应用开发者通常都不需要关心生命周期的管理API—它们主要是被工具提供商及JSF实现者所关注。
11.1 Lifecycle对于当前web应用接收到的每一个指向JSF的请求,JSF实现都必须得到一个当前web应用的Lifecycle实现,并且调用它上面的execute()和render()方法来执行请求处理生命周期。
Lifecycle实例调用相应的处理逻辑来实现“请求处理生命周期”每个阶段要求的功能,各阶段的功能请参见2.2 “Standard Request Processing Lifecycle Phases”。
public void execute(FacesContext context) throws FacesException;public void render(FacesContext context) throws FacesException;execute()方法执行各个阶段直到Render Response,但不包括Render Response阶段。
render()方法执行Render Response阶段。
这个分开职责的方式使在基于portlet环境的JSF处理变得容易。
在每一个阶段处理完毕,注册的PhaseListener实例将被触发。
每个阶段一般都处理如下:■ 从注册的PhaseListener实例集合里,选出一个关联到当前阶段PhaseListener。
一、Web应用程序开发阶段1.利用Servlet阶段,使用request和response对象接收和反馈客户端的请求。
它是开发Web应用程序的基石,在Web应用程序中,Servlet是一个基本的Web组件,开发Web应用的许多技术,如JSP及一些Web层的框架都是建立在其基础之上。
Servlet 的缺点是在Java代码中兼有业务和逻辑,不利于程序设计和界面开发。
2.JSP技术阶段,JSP是在标记语言中以<%@…%>的形式嵌入Java代码,使得页面会话可以调用后台Bean来处理事件,但是仍然没有将表示层和业务层分割开来,往往是互相嵌套,这就要求美工人员要懂技术,技术人员要懂美工,不利于程序的维护。
随后JSP引入了标签库,来分离业务逻辑,经过SUN公司的标准化之后,就形成了JSTL(Java Standard TabLibrary)。
JSTL对于页面显示以及显示逻辑的弱耦合已经实现,方便了Web的开发。
但随着Web应用程序规模的不断扩大,如今现有的JSTL技术已越来越无法满足开发者的需求,复杂的业务流程和页面之间的交互都需要程序员自己编写代码实现,加大了开发难度。
3.框架开发阶段,所谓框架就是可重用的,半完成的应用程序,可以用来产生专门的定制程序。
为了适应新的开发环境,一个中间件厂商开发出了像Struts、Spring、Hibernate以及后来出现的JSF等框架。
这些框架为Web应用程序开发提供了模板,开发人员只要配置好相应的参数就可以完成对Web应用程序的开发。
更重要的是,这些框架在不长的时间内相互融合,现在的Web应用程序开发都用到了一种或多种框架。
基于JCP制定的Web应用框架标准而开发的JSF框架技术,采用了模型—视图—控制器(MVC)的设计模式,凭借良好定义的请求处理生命周期和丰富的组件层次结构,大大提高了基于Java的Web用户界面开发的简易性。
MVC框架模型如图1所示。
JSF技术提供了一个表现和行为彻底隔离的能力,使得先前只有在客户端UI体系(DOM)下完成的细粒度隔离移到了服务器端,客户端只需解释标准的HTML语法,从而达到了完全瘦客户端的目标。
jsf生命周期JSF是基于事件驱动的,首先介绍JSF的事件侦听。
介绍中我仅仅给大家提供简单的场景。
不过我需要首先申明,思考这些事件的时候,你最好先用C/S架构下的模式考虑她的运作模式,再用web下js调度动作的方式去认识执行过程。
1)动作事件:Action Event:普通动作响应actionEvent是最普通的事件,任何command组件(button,link等,请参见UICommand)通过注册actionListener均可出发此事件侦听响应,简单说,用户有意义的操作,即可触发。
2)即时事件:Immediate Event:立即处理,不验证/转换/更新模型值(即bean不会保存属性)即时事件,立即触发,在JSF生命周期中,让恢复试图之后,获取请求值,立即触发。
验证、转化、更新模型值被略过,当然更多的情况下,你需要一个为被注册的UI组件binding到后台bean中,别忘了,你使用即时事件的初衷是什么??就是我只想让程序关注此组件,并排斥其他组件或者级联组件的操作。
场景:单一表单中,使用“检测用户名是否存在”。
立即时间,常用来做bean层面即时服务,以执行action为主要目的。
3)值改变事件:Value Change Event:选择UI值改变后,级联调度.如果国际化中选择语言.值改变事件,如果一个输入(UIInput)、选择(UISelects)组件的值发生改变,将会执行的侦听。
所谓的值改变,就是表单中local值和submit 值发生偏移,local值就是页面渲染时上一个生命周期中传递的值,简单说就是表单中原来展示的值(server端生成的组件值,在周期中编码进去)。
submit值,就是面向用户或者操作者主动输入的客户端值。
比如:表单展示时,server端为一个下拉菜单赋值为1(local值),如果用户选择了2(submit值).请你用相同的思维去考虑输入框。
如果值改变,那么就会被执行,最好的场景就是:国际化中选择语言,然后把最新的语言元素,广播到整个站点。