已阅读5页,还剩105页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
深入浅出JSF框架 BOS分析设计部葛朋旭 序言 JSF作为JavaEE的标准Web框架发展历程1 0 1 1 1 2 2 0IBM Oracle 开源社区有多种实现版本AOM WAF的底层核心就是JSF框架JSF的标准规范JSF的框架原理JSF生命周期分析JSF的高级特性JSF的RIA技术整合JSF的新版本趋势 提纲 JSF标准规范框架设计原理生命周期跟踪高级特性分析RIA技术整合新版本趋势 JSF流行曲 ApplicationDevelopmentTechnologiesOne TierTwo TierMulti TierToday sApplicationDevelopmentFrameworksTapestry Struts Webwork Hibernate TopLink ADFUIX Spring WhatisJSF JavaServerFaces JSF isauserinterface UI frameworkforJavaWebapplications ItisdesignedtosignificantlyeasetheburdenofwritingandmaintainingapplicationsthatrunonaJavaapplicationserverandrendertheirUIsbacktoatargetclient JSF流行曲 JSFDeveloperTypePageauthorApplicationdeveloperComponentwriterToolsproviderJSFimplementers 提纲 JSF标准规范框架设计原理生命周期跟踪高级特性分析RIA技术整合新版本趋势 JSF标准规范 JSF有什么 JSR 127StandardspecificationJDK1 5JavaServlet2 5JavaServerTMPages2 1JavaServerTMPagesStandardTagLibrary2 1ComponentModelEventDrivenNavigationModelApplicationLifecycle架构跟协议 Makeup的无关性 提纲 JSF标准规范框架设计原理生命周期跟踪高级特性分析RIA技术整合新版本趋势 JSFArchitecture MVC JSFArchitecture MVCModel2 JSFArchitecture MVCModel2Strutsmodel2 JSFArchitecture MVCModel2Strutsmodel2JSFmodel2 JSFArchitecture Model2Pattern MVC ModelManagedBean BackingbeansJavaScriptModelViewUIComponentDHTML DOM CSS XML based WML basedControllerFacesServletJavaScriptControlller Component BasedUIFramework UIComponentRendererRenderKitRenderer specificcomponentsubclassJSPtag Facelets JSFUIComponent 1 1 JSFUIComponent 1 11 2UINamingContainer JSF框架分析 1 SavingandRestoringStateStateManagerResponseStateManagerjavax faces ViewStateComponentFamilyandComponentTypeConverters Validators Events andListenersFacets JSF框架分析 2 Renderersdecodeencode JSF框架分析 2 RenderersRendererTypes JSF框架分析 2 RenderersRendererTypesRenderKitsHTMLSVG WML Ajax XULMicrosoft sDHTML HTMLComponents HTC Mozilla sXUL XMLBindingLanguage XBL CustomActionTagHandlers 提纲 JSF标准规范框架设计原理生命周期跟踪高级特性分析RIA技术整合新版本趋势 JSFDevelopment BuildinganApplicationUsingJSF创建ManagedBean编写View页面配置faces config xml JSFRequestProcess 接收到一个jsfRequest时 JSFimplementation启动 相应的processes services必须在portal servlet环境可用 为此JSF实现调用不同的工厂类完成各方面的职责 WebApplicationStart Up一个JSFWebapplication启动 4个工厂被实例化ApplicationFactory创建Application实例 LifecycleinstancetocreateandrestoreJSFviews LifecycleFactoryreturningaLifecycleinstanceforalifecycleidentifierRenderKitFactoryreturningaRenderKitfortheJSFWebapplicationFacesContextFactorycreateaninstanceofFacesContextthatisusedtorepresentcontextualinformationassociatedwiththeincomingrequestandeventuallywiththeresponse JSFLifecycle Request ProcessingLifecycle1RestoreView2ApplyRequestValues3ProcessValidations4UpdateModelValues5InvokeApplication6RenderResponse LifecycleWebStart up 启动阶段 LifecycleWebStart up 启动阶段facesServlet内部创建FacesContextFactoryLifecycleFactory每个JSFWeb程序一个ApplicationFactory每个JSFimplementation 有一个缺省RenderKit Lifecycle RestoreViewPhase RestoreViewPhaseViewHandler restoreView restoringaviewfromtheserverandclientstate如果ViewHandler restoreView 返回null调用FacesContext的renderResponse 否则调用ViewHandler createView 创建UIViewRoot 并绑定到FaceConext Lifecycle RenderResponsePhase 步骤1调用ViewHandler renderView 执行JSP文档从UIViewRoot中获取到viewId值 传递给方法ExternalContext dispatch dispatch方法再forward相应viewId的值给Web容器 Lifecycle RenderResponsePhase 步骤2JSF specific不负责forwardedrequest被FaceServlet忽略的request将传给JSP容器JSP容器将按顺序 根据上下文的相对路径 执行跟viewId匹配的JSP页面 Lifecycle RenderResponsePhase 步骤3在处理 执行JSF的JSP页面前 JSP引擎检测所用的contenttype text html 和characterencoding UTF 8 标签优先展示作为所有JSF组件的容器创建 保存一个ResponseWriter实例在FacesContext中ResponseWriter将输出客户端的标签缺省的RenderKit HTMLRenderKit 要求contenttype必须为text htmlJSFcomponent被创建 并绑定到组件层次树上如 对应HtmlForm Lifecycle RenderResponsePhase 步骤4JSFJSPtag调用Application createComponent 方法该方法以一个字符表示componenttype如 javax faces HtmlFormcomponenttype被映射到faces config xml中定义的一个类一个HtmlForm组件将被创建并绑定到UIViewRoot通过componentfamily和renderertype来定位一个具体的Renderertag调用组件的encodeBegin 方法相应调用HtmlFormrenderer的encodeBegin 方法方法输出代码 Lifecycle RenderResponsePhase 步骤5在 中所有嵌套的组件都会被创建并render并添加到中 tag被执行将调用Renderer的encodeEnd 调用ViewHandler的writeState 传递atoken给ResponseWriter jsf1 2之前的做法 encodeEnd 方法输出最后输出JSF1 2componenthierarchy先创建 再输出展示 Lifecycle PostbackRequest PostbackScenario用户在接收到初始请求页面后 输入 提交数据 HowJSFhandlespostback6个生命周期被调用或者FacesContext renderResponse 来跳过某个跟initialrequest的不同之处在于第一 最后一个阶段 Lifecycle JSFhandlespostback 1RestoreViewPhase跟InitRequest相同调用ViewHandler的restoreView方法 保存此前请求的任何状态变量 差异性restoreView 不再返回null 而是返回跟viewId相关的当前组件树状态 如果STATE SAVING METHOD设置为client side保存 回复的组件树将传递给FacesContext Lifecycle JSFhandlespostback 2ApplyRequestValuesPhase每个input组件从请求参数中建立submittedvalue每个command组件查询事件 并传递到InvokeApplicationphase 注意submittedvalue只存在组件上 不会提交到底层的Model上 到ApplyRequest阶段完成时 Renderers不再需要观察requestparameters 所有的值都提交到每个组件上了 Lifecycle JSFhandlespostback 3ProcessValidationPhaseUIViewRoot上的processValidators 被调用 conversion validation将被执行注意该过程递归调用每个组件上的processValidators方法每个HtmlInputText的验证时 TypeConversion首先只发生在组件的submittedvalue String TypedObject新的对象作为组件的localvalue 同时Submittedvalue被清除新的强类型对象被validated如果发生错误 接下来的步骤 将监听ValueChangeEvent事件 其被传递到最后一个ApplyRequestValuesphase如果转换 验证阶段发生异常 相应的JSF消息将通过组件的clientID绑定到FacesContext 然后调用renderResponse 方法 直接调整到RenderResponsephase Lifecycle JSFhandlespostback 4UpdateModelPhase所有的转换 验证OK的值 被提交到底层的ModelJSF遍历组件树 调用每个组件的processUpdates方法为了判定那里存储了新的值 processUpdates方法通过valuebinding 定义组件的value属性 如 credentials username Valuebinding指向Managedbean的一个属性 如username组件的localvalue提交到model中 然后localvalue清除注意任何Model的消息 错误 通过组件的clientId绑定到FacesContext上 renderResponse方法被调用 直接转到RenderResponsePhase Lifecycle JSFhandlespostback 5InvokeApplicationPhase不需要遍历层次树结构 该阶段只处理上一个阶段列入队列中的事件 处理完毕 或者进入最后阶段RenderResponse 或者重定向到另外一个页面 Lifecycle JSFhandlespostback 5InvokeApplicationPhase在ActionEvent发生时 有两个方法被执行 UIViewRoot上的processApplication 方法将队列中的事件 广播到目标的事件组件上 ActionListener上的processAction 方法所有注册的ActionListeners都被调用 然后方法绑定被执行 最后组件调用缺省ActionListener的processAction来执行绑定方法 处理导航 注意Action方法绑定最后执行被调用 Lifecycle JSFhandlespostback 6PostbackwithNavigation缺省ActionListenter处理ActionEvent 时 调用绑定的action方法 并且获取outcome 一个字符标示如果outcome为null 将继续处理下一个队列事件 处理完毕进入下一个阶段RenderResponse 如果outcome不是null ActionListener将传递FacesContext fromAction outcome到NavigationHandler Lifecycle JSFhandlespostback 6PostbackwithNavigation导航规则在faces config xml中存储 在start up时读取 并存在Appliction对象中 NavigationHandler检测导航规则 通过fromViewId fromAction outcome匹配 导航处理1 Redirecting导航处理2 通过handleNavigation 创建新的UIViewRoot 让缺省的ActionListener 调用renderResponse 来初始RenderResponsephase 提纲 JSF标准规范框架设计原理生命周期跟踪高级特性分析RIA技术整合新版本趋势 高级特性 JSF的底层技术事件驱动编程自定义验证器 转化器自定义组件 高级特性 JSF的底层技术ServletJSPJSTL ELFacelets 高级特性 JSF的底层技术 Servlet 高级特性 FacesServletjavax faces webapp FacesServlet实例Ajax4jsfEaswafoperamasks faces 2 2M1 高级特性 FacesServlet分析实例FacesContextFactoryLifecycleServletConfig方法init service destroy 高级特性 JSF的底层技术ServletJSPJSTL ELFacelets 高级特性 JSF的视图 View 技术JSP1 0 1 1风格 编译效率差 缺少模板化Facelets使用XHTML规范实现模板 Template 功能方便地创建自定义标签和EL函数Portal 高级特性 JSF的UI界面JSP风格 高级特性 JSF的UI界面JSP风格XHTML风格 高级特性 JSF的底层技术ServletJSPJSTL ELFacelets 高级特性JSTL JSTLJSP标准标记库 JSPStandardTagLibrary 实现Web应用程序中常见的通用功能的定制标记库集JSP1 2定制标记库集包括迭代和条件判断数据管理格式化XML操作数据库访问体现的作用避免在JSP页面中使用脚本编制元素从表示层删除源代码来简化软件维护 高级特性JSTL EL JSTL1 0 J2EE1 3 JSP1 2 core format xml sql验证器ScriptFreeTLV PermittedTaglibsTLVJSTL1 1 J2EE1 4 JSP2 0 支持EL灵活使用EL表达式 提供了一个用EL表示的强大的属性集 使得JSP动态表示层技术开发可以完全脱离Java脚本代码JSTL1 2 J2EE5 JSP2 1 高级特性JSTL EL 表达式语言 EL 以EcmaScript和XPath为基础JSP2 0新特性 ExpressionLanguage 擅长寻找对象及其特性 然后对它们执行简单操作用 和 访问对象的属性 高级特性JSTL EL 表达式语言 EL 以EcmaScript和XPath为基础JSP2 0新特性 ExpressionLanguage 擅长寻找对象及其特性 然后对它们执行简单操作访问隐式对象 高级特性JSTL EL 表达式语言 EL 以EcmaScript和XPath为基础JSP2 0新特性 ExpressionLanguage 擅长寻找对象及其特性 然后对它们执行简单操作访问隐式对象运算符 高级特性JSTL EL 表达式语言 EL 以EcmaScript和XPath为基础JSP2 0新特性 ExpressionLanguage 擅长寻找对象及其特性 然后对它们执行简单操作访问隐式对象运算符 优先级 高级特性 JSF的底层技术ServletJSPJSTLFacelets 高级特性 Facelets 问题JSF和Java服务器页面技术之间的不匹配JSP非常重视生成动态内容输出 而JSF需要JSP来协调组件模型的构建FaceletsFacelets是更加全面的解决方案专为JSF组件模型度身定制的模板化语言分析JSP是种生成servlet的模板化语言 JSP的主体与servlet的doGet 和doPost 方法等价 也就是说 成为jspService 方法 JSF定制标记 例如f view和h form 只是调用JSF组件来呈现它们自己的当前状态 JSF组件模型的生命周期独立于JSP生成的servlet的生命周期 这种独立性就是混淆的来源 高级特性 Facelets FaceletsFacelets这个模板化语言 从构建之初 就考虑了JSF的组件生命周期 使用Facelets 生成的模板会构建组件树 而不是servlet 这就允许更好的重用 因为可以把组件组合成另一个组件特性模板化 像Tiles 复合组件定制的逻辑标记表达式语言对设计师友好的页面开发创建组件库 高级特性 Facelets 开发要求Facelets本身就可以使用JSF定制组件在Facelet标记库文件中声明JSF组件在Facelets模板化语言中可以直接使用JSF组件 不用任何额外的开发Facelets模板框架允许使用熟悉的JSTL样式的标记和JSTL JSF JSP样式的表达式语言Facelets允许定义能够直接包含进页面或者容易地添加到Facelet标记库的组件集 高级特性 Facelets 步骤1导入jsf facelets jar在operamasks faces 2 2M1的operamasks third party jar包括了相应的lib 高级特性 Facelets 步骤2把Facelet初始化参数添加到web xml文件中如operamasks faces 2 2M1的web xml 高级特性 Facelets 步骤3在faces config xml配置FaceletViewHandler如 operamasks faces 2 2M1的faces config xml 高级特性 Facelets 步骤4使用xmlns ui 高级特性 Facelets 开发组件创建Facelets标记库 高级特性 Facelets 开发组件创建Facelets标记库在web xml中声明标记库 高级特性 Facelets 开发组件创建Facelets标记库在web xml中声明标记库用命名空间导入标记文件 高级特性 JSF的底层技术事件处理模型自定义验证器 转化器自定义组件 高级特性 JSF事件处理模型 动作事件简单导航根据 actionmethod 的结果来决定要导向的网页JSF会为其自动产生一个 预设的ActionListener 来处理事件 并根据其传回值来决定导向的页面 高级特性 JSF事件处理模型 动作事件优先处理指定的ActionListener 可有多个 再处理默认的ActionListener最后是Action使用标签向元件注册事件 高级特性 JSF事件处理模型 动作事件即时事件ImmediateEvents指JSF视图元件在取得请求中该取得的值之后 即立即处理指定的事件 而不再进行后续的转换器处理 验证器处理 更新模型值等流程 原因HTTP无状态的特性对于input与command元件 通过immediate属性当点击按钮后 JSF套用请求值之后会立即处理指定的actionListener 而不再进行验证 更新模型值 高级特性 JSF事件处理模型 动作事件即时事件值改变事件ValueChangeEvent方法1在控件上设定valueChangeListener属性方法2实现javax faces event ValueChangeListener 高级特性 JSF事件处理模型 动作事件即时事件值改变事件阶段事件JSF的生命周期的6个阶段各阶段的前后会引发javax faces event PhaseEvent可以实现javax faces event PhaseListener 并向javax faces lifecycle Lifecycle注册这个Listener 高级特性 JSF事件处理模型 阶段事件 PhaseListener三个必须实现的方法getPhaseId 传回一个PhaseIdbeforePhase afterPhase 实例 高级特性 JSF的底层技术事件处理模型自定义验证器 转化器自定义组件 高级特性 自定义转化器 验证器 转化器将HTTP请求提交的字符格式数据 转化为组件所需的格式对象 步骤实现Converter接口 javax faxes convert Converter 或者不实现Converter接口 直接在Bean中取得转换器的方法实现publicObjectgetAsObject FacesContextcontext UIComponentcomponent Stringstr 方法实现publicStringgetAsString FacesContextcontext UIComponentcomponent Objectobj 方法在faces config xml中注册自定义转换器使用用设置组件的converter属性直接在Bean中调用 高级特性 自定义转化器 验证器 转化器实例将一个字符串值转换为一个PhoneNumber对象 高级特性 自定义转化器 验证器 验证器验证客户端提交的值 是否满足业务要求 如果验证OK 更新到模型中 步骤实现接口Validator javax faces validator Validator 编写验证标签ValidatorTag注册验证器 注册标签使用 高级特性 自定义转化器 验证器 验证器 实例 高级特性 JSF的底层技术事件处理模型自定义验证器 转化器自定义组件 高级特性 自定义组件 JSF组件开发需要了解很多基础知识JSF组件由两部分组件和渲染器组件类定义UI组件的状态和行为渲染器定义如何从请求读取组件 如何显示组件通常通过HTML渲染参考手册 提纲 JSF标准规范框架设计原理生命周期跟踪高级特性分析RIA技术整合新版本趋势 RIA技术整合 AjaxMozillaXULMicrosoftHTCOpenLaszloFlash FlexApplet JavaFX RIA技术整合 Ajax特性 Ajax核心表单自动完成DWR实时验证Rico传送客户端视图状态直接Web远程调用Ajax组件命令式 声明式Ajax4JSF SeamingRemoting RIA技术整合 Ajax CoreAjaxJavaScript XMLHttpRequest DOMXMLHttpRequest RIA技术整合 Ajax 开发模式传统模式 RIA技术整合 Ajax 开发模式传统模式Ajax模式 RIA技术整合 Ajax 开发模式传统模式Ajax模式实例 RIA技术整合 Ajax JSF的Ajax整合步骤CreatingaUIprototypeCreatingeventsandlisteners Optional Creatingabehavioralsuperclass Optional Creatingaclient specificRendererPartial PageRendering PPR DeltaDOMRendering D2R Creatingarenderer specificsubclass Optional RegisteringaUIComponentandRendererCreatingaJSPtaghandlerandTLD Facelets不需要 CreatingaRenderKitandResponseWriter 支持多种RIA技术 客户端浏览技术 ExtendingtheJSFimplementation Optional RegisteringaRenderKitandJSFextensionRegisteringresourceswithWeblets RIA技术整合 Ajax Ajax的事件处理JSF的生命周期 对Servlet模型屏蔽了应用代码 从而促进了面向组件的设计 针对Ajax的抽象性 通过SeamRemoting Ajax4Jsf处理 SeamRemoting Ajax4Jsf通过Ajax交互 将JSF组件熔合到浏览器所需的管道处理 事件触发时 消息异步发送到服务器的组件收到响应后 对页面增量更新 都服务于JSF的Ajax化 Ajax整合SeamRemotingVSAjax4JSF 相同点都使用Ajax来引入交互模型都可配备生命周期 且在浏览器需要时 恢复组件状态都采用JSF组件模型SeamRemoting特性提供JavaScriptAPI使用定制的 非JSF生命周期 实现浏览器跟服务器组件通信 Seam容器和其组件 可在此请求期间被恢复 Ajax4JSF特性完全隐藏JavaScript而更加抽象 所有逻辑都封装在UI组件内 通过完整的JSF生命周期接受Ajax请求 RIA技术整合 AjaxMozillaXULMicrosoftHTCOpenLaszloFlash FlexApplet JavaFX RIA技术整合 MozillaXUL XULXMLUserInterfaceLanguage Mozilla
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年广东省云浮市中小学编制教师招聘笔试参考题库及答案详解
- 2026年山东省泰安市中小学编制教师招聘笔试模拟试题及答案详解
- 2026年廊坊市安次区中小学编制教师招聘考试参考题库及答案详解
- 2026年贵州省六盘水市中小学编制教师招聘考试模拟试题及答案详解
- 2025年淄博市博山区事业编单位人员招聘笔试试题及答案详解
- 2026年滨州市滨城区中小学编制教师招聘考试模拟试题及答案详解
- 2026年宁波市江北区中小学编制教师招聘考试模拟试题及答案详解
- 2026年莆田市荔城区事业编单位人员招聘笔试备考题库及答案详解
- 2026年襄樊市樊城区中小学编制教师招聘考试备考试题及答案详解
- 2026年海口市美兰区中小学编制教师招聘笔试备考试题及答案详解
- 2026年养老护理员职业资格考试真题试卷及答案(一)
- 2026年加油站安全生产月应急演练方案
- 亚马逊代工协议合同模板(2篇)
- 2026四川泸州翰飞航天科技发展有限责任公司招聘17人笔试备考题库及答案详解
- 电脑耗材及维护销售合同
- 服装打包质检外包合同
- 细胞因子释放综合征诊疗
- 2026年福建厦门集美市政集团有限公司招聘7人笔试备考题库及答案解析
- 危险化学品重大危险源企业安全专项检查细则
- 2026年建党周年知识竞赛能力测试备考题含完整答案详解(网校专用)
- 北京市2025北京日报社招聘笔试历年参考题库典型考点附带答案详解
评论
0/150
提交评论