JSF的事件模型和生命周期
- 格式:ppt
- 大小:217.00 KB
- 文档页数:16
1.JSF的工作方式JSF应用是通过处理由页面中组件触发的事件来工作的。
这些事件是由用户的动作引起的。
比如,当用户单击一个按钮时,按钮会触发一个事件,通过编写监听这个事件的监听器,JSF开发人员可以决定当特定事件发生时JSF应用应该做什么。
也就是说,JSF应用是事件驱动的。
图1说明了JSF应用的处理过程。
图1 JSF应用是事件驱动的当一个事件发生时(比如,用户单击了一个按钮),事件通知通过HTTP发往服务器。
服务器端使用叫作FacesServlet的特殊servlet处理该通知。
Web容器里的每个JSF应用都有它自己的FacesServlet。
在后台,每个JSF请求都触发3件事情,如图2 JSF的工作方式。
图2 JSF的工作方式为了处理JSF请求,它们必须交由FacesServlet处理,指定这种重定向是通过部署描述符中的servlet和servlet-mapping标记来实现的。
1.<!-- Faces Servlet -->2.<servlet>3.<servlet-name>Faces Servlet</servlet-name>4.<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>5.<load-on-startup>1</load-on-startup>6.</servlet>7.<!-- Faces Servlet Mapping -->8.<servlet-mapping>9.<servlet-name>Faces Servlet</servlet-name>10.<url-pattern>/faces/*</url-pattern>11.</servlet-mapping>这表示所有请求的URL中都必须包含/faces/这个字符串模式,servlet-mapping元素下的url-pattern元素指定了这一点。
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对象中,以备后⾯的处理过程所⽤。
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參考實作將這三個階段之外的其它階段之複雜性隱藏起來了,您不需要知道這幾個階段的處理細節。
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事件模型由3个部分组成:1.事件源:JSF页面上所有UI组件都可以作为事件源。
2.事件对象:当用户对UI组件执行动作时,JSF会为之创建对应的事件对象。
3.事件监听器:JSF的事件监听器比较灵活,既可直接使用受管Bean 的某个方法来处理用户事件,也可以使用专门的事件监听器对象。
Public class EventQs{ Array private Frame f = new Frame(“测试事件”);private Button ok = new Button(“确定”);private TextField tf =new TextField(30);public void init(){Ok.addActionListener(new OkListener());f.add(tf);f.add(ok,BorderLayour.SOUTH);f.pack();f.setVisible(true);}class OkListener implements ActionListener{Public void actionPerformed(ActionEvent e) {System.out.println(“用户单击了OK按钮”)tf.setText(“Hello World”);}}pubblic static void main(String [] args){new EventQs.init();}}JPA的常用的三个组件的简介:1.实体。
实体其实就是一个普通的POJO,只是为它增加了orm.xml映射文件和Annotation,通过使用这种orm.xml映射文件或Annotation即可建立实体和数据表之间的对应关系。
2.EntityManager。
使用EntityManager来对实体进行操作时,JPA规范可将这种操作转换为对底层数据库的操作。
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值).请你用相同的思维去考虑输入框。
如果值改变,那么就会被执行,最好的场景就是:国际化中选择语言,然后把最新的语言元素,广播到整个站点。
第1章Javaserver Faces 2.0重要新功能以及相关改进简介(系列之一)关键字: 新功能JSF 2.0的最终规范也已经发布了有近一个月了,在近期试用了一些新功能和特性,带来了很多漂亮的特性和愉快的体验。
试用之余,迫不及待的希望与众多开发工程师们分享JSF 2.0带来的这些改变,或者说给我们开发带来的便利以及思想上的变革。
自从JSF 2.0立项起,就一直关注他,除了他承诺的那些技术和思想上的先进性,更多的原因是由于他为适应Web 2.0开发应用而提出的简化开发流程,提供灵活便捷的组件开发模式;或者可以说是由于他承诺在提高开发人员效率方面的努力。
在从Mojarra项目获取beta版实现并试用后,我非常兴奋,JSF 2.0的专家组很好的完成了他们的承诺,并有很多超出预期的惊喜。
不废话了,现在就从开发者的角度列出我认为全新引入的最重要的两个特性:1、 Facelets界面组件模型在JSF 2.0中引入了全新的界面表现模型Facelets,可以方便的实现自有组件定制和页面模版化。
既强化了JSF提出以来的组件式开发思想,又简化了自有组件的开发。
从Tapestry吸收来的模版方式不仅可以让开发工程师像搭积木一样组合一个页面,更可以搭好架子后只在相关页面中只修改需要改变的部分。
Facelets还有一大好处,就是将所有java代码从页面标签中移出,让分工更明细了,分工合作本来就是人类发展的一大基石,在这儿也体现了。
采用全新界面模型后还带来了些辅助功能和好处,其一就是性能的大幅度提升,由于Facelets采用W3C的xhtml规范,是一个严格的xml规范,组件树渲染不再需要如jsp一样编译成class文件后再运行,可以直接渲染,而大大提升了渲染速度,整体性能比jsp应该会提升不少。
另外为了支持自有组件开发,JSF 2.0加入了一个resources约定,将自己创建的组件放于此目录下,省掉了xml配置文件中的说明。