JSF框架应用第四章
- 格式:ppt
- 大小:515.00 KB
- 文档页数:17
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对象中,以备后⾯的处理过程所⽤。
xpage读法XPages是IBM Lotus Domino平台上的一种技术,用于开发Web 应用程序。
它基于Java和JavaServer Faces(JSF)框架,提供了一种快速、简便的方式来构建功能强大的企业级Web应用程序。
XPages的核心概念是将应用程序的界面和逻辑分离,使开发人员可以专注于业务逻辑的实现。
通过使用XPages,开发人员可以轻松地创建各种类型的表单、视图和导航,以及处理和显示数据的逻辑。
XPages还提供了一组强大的控件和功能,如数据绑定、事件处理、验证和安全性等,使开发人员能够快速构建出现代化的Web 应用程序。
在XPages中,开发人员可以使用标准的HTML、CSS和JavaScript来创建用户界面。
同时,XPages还提供了一些自定义标签和属性,以简化开发过程和增强用户体验。
开发人员可以使用这些标签和属性来创建交互式的表单、数据表格和图表等元素,以及实现动态效果和用户反馈。
XPages还支持各种类型的数据源,如关系数据库、文档数据库和Web服务等。
开发人员可以使用XPages的数据绑定功能,将这些数据源与应用程序的界面进行绑定,实现数据的展示、输入和处理。
同时,XPages还提供了一套强大的搜索和过滤功能,以帮助用户快速找到所需的数据。
除了基本的Web应用程序开发功能外,XPages还提供了一些高级功能,如多语言支持、主题和样式管理、移动设备适配等。
这些功能使开发人员能够更好地满足用户的需求,并提供更好的用户体验。
总的来说,XPages是一种功能强大、易于使用的开发技术,适用于构建各种类型的企业级Web应用程序。
它的出现大大简化了开发人员的工作,提高了开发效率,同时还提供了丰富的功能和灵活性,使开发人员能够更好地满足用户的需求。
无论是初学者还是经验丰富的开发人员,都可以通过学习和使用XPages来创建出色的Web应用程序。
《J2EE应用框架设计与项目开发-2014》试题第一章J2EE体系结构一、单项选择题(每题2分,其中只有一个选择项为正确,多选、不选或错选该题均不得分)1、下列关于J2EE的说法,正确的是()A.是一套使用java进行企业级web应用开发的事实上的工业标准。
B.J2EE不是一种平台规范。
C.J2EE平台提供了多层分布式的应用模型,不能重新利用组件的能力。
D.J2EE不一定要基于J2SE。
答案:A2、J2ME是指()A.java to more enterpriseB.java 2 mobile editionC.java 2 micro editionD.java 2 mini edition答案:C3、J2EE的三层结构包括表示层、中间层、()A.服务层B.会话层C.保存层D.数据层答案:D4、在J2EE三层结构中,中间层与MVC设计模式中的()模块相对应。
A.视图B.控制器C.模型D.以上都不对答案:B5、JavaEE服务器与容器的关系是()A.服务器是javaEE容器基础,容器是它的一部分B.javaEE容器是服务器的基础,服务器是它的一部分C.二者没有什么关系D.服务器和容器指的是同样一个东西答案:A6、下列不属于J2EE标准服务的是()A.邮件服务B.安全服务C.短信服务D.消息服务答案:C7、下列不属于J2EE组成结构中的各元素的是()A.J2EE应用程序组件B.J2EE容器C.J2EE资源适配器D.J2EE磁盘答案:D8、下列那个不属于java技术框架SSH里面的()A.StrutsB.HiveC.SpringD.Hibernate答案:B二、多项选择题(其中有两个或两个以选择项为正确,不选、错选或多选均得0分,漏选则按选对率计分,每题3分。
)1、通常的瘦客户端多层次应用程序难于编写,是因为要设计多行复杂代码()A.用于事务处理B.用于状态管理C.用于多线程D.用于资源池E.用于其他的复杂的底层设计答案:ABCDE2、下列哪些是J2EE的标准服务:()A.邮件服务B.消息服务C.安全服务D.连接器提供的服务E.硬件检测服务答案:ABCD3、J2EE必须支持的应用组件有:()A.客户端应用程序B.代码编译器C.AppletsD.Servlets、JSP页面、JSF应用程序、过滤器、WEB事件监听器E.企业javabean组件答案:ACDE4、下列属于web服务器的是:()A.IISB.WeblogicC.ApacheD.TomcatE.Websphere答案:ACD三、判断题(每题1.5分)1、JAVA是由微软公司推出的。
[摘要]论文提出一个能够满足高职院校需要的且基于JSF框架的试题生成系统。
系统采用随机获取试题的方式来进行智能组卷,并将结果输出到word中实现试卷的生成。
[关键词]组卷策略;JSF;试题系统[中图分类号]G718.5[文献标识码]A[文章编号]1673-0046(2012)8-0053-02基于JSF框架的试题自动生成系统温彩玲(太原城市职业技术学院,山西太原030027)众所周知,不管是什么阶段的学校,学生从入学开始到最后的完成学业毕业,期间都要进行很多形式的考试,直至最终获得毕业证书。
传统形式的考试要经历教师出题、教务处排版印刷、监考老师分发试卷、考生答卷、教师收卷阅卷以及最后的统计分数等多个步骤,这其中大部分过程都要求教师手工参与完成,不仅需要消耗了大量的时间精力,同时还需要对工作有较高的保密要求。
虽然现在市面上已经出现了在线考试系统,但是由于该方法对于考试的类型以及考试结束后内容的保存等方面存在一定的问题,无法达到满足现阶段所有科目考试的需要。
尤其对于高职院校,由于本身注重的是学生实践、操作、应用能力方面的培养,简单的理论考试根本无法满足需要。
因而,我们提出这种基于试题库的试题自动生成系统。
该系统中的试卷是根据用户的要求自动提取题库中的试题生成的。
试题的抽取采取确定参数后随机排列,然后随机抽取的方式进行提取,并对生成试题的用户、试题的特征、生成时间进行记录,从根本上杜绝了试卷泄密和考试作弊的问题,可以充分保证了考试的公平性。
一、系统开发语言JavaServerFaces(JSF)是JavaEE5.0开始提出,是JavaCommunityProcess(JCP)推动的,有望成为Web应用程序开发的一种标准框架。
JSF中所有与应用程序的用户交互均由一个前端FacesServlet(控制器)来处理,对于每个请求,FacesServlet首先会创建一个FacesContext对象,它包含了处理请求所必须的信息。
JSF英文全称 JavaServer Faces (JSF) 是一种用于构建 Web 应用程序的新标准 Java 框架。
它提供了一种以组件为中心来开发 Java Web 用户界面的方法,从而简化开发,也是Sun精心打造的一项技术。
JSF优势之一:UI组件(UI-component)UI组件(UI-component)一直是桌面程序的专利,web程序中,虽然HTML 定义了基本的UI标签,但要使这些UI标签像UI组件那样工作,还需要很多代码片断来处理数据及其表现形式,而且有效地组织这些代码片断使其协调一致也是一件繁琐的工作。
JSF的UI组件是真正意义上的UI组件,能极大地简化程序员的工作,例如,在页面上放置一个文本输入框,这个输入框立即具备了数据填充、界面更新、事件侦听、动作触发、有效性检查和类型转换的功能。
更为重要的是,程序员只需根据业务逻辑编写核心业务代码,JSF会保证代码在合适的时候被执行,完全不用考虑代码与代码之间该如何来配合。
JSF优势之二:事件驱动模式事件是面向对象方法的重要组成部分,对象之间通过事件进行沟通和交流,使得一个或多个对象能够对另一个对象的行为作出响应,共同合作去完成一项业务逻辑。
通常,编写Web程序时,程序员要为对象之间的沟通设计机制,编写代码。
虽然沟通的内容属于业务逻辑,但沟通的机制显然与业务没有太大关系,程序员因此为业务逻辑之外的功能浪费了时间。
JSF改变了这种状况。
JSF的事件和侦听模式与大家熟悉的Javabean的事件模式类似,有Java基础的程序员并不需要学习任何新的东西。
JSF的UI组件可以产生事件,例如,当页面上一个文本输入框的内容被修改时,会发出一个“值改变事件”。
另一个对象如果对“值改变事件”感兴趣,只需注册为该对象的侦听者,并编写处理例程,即可命令JSF在事件发生时自动调用处理例程。
JSF做了所有该做的事,留给程序员的只有业务逻辑代码的编写。
JSF优势之三:用户界面到业务逻辑的直接映射举个例子,表单提交是Web编程最常见的任务,也是最复杂的任务之一。
A4J 用户指南 (转载请注明博客:天空的颜色) 目录1. 介绍2. 开始使用Ajax4jsf环境需求下载Ajax4jsf安装简单的 AJAX Echo 项目JSP 页面数据 Beanfaces-config.xmlWeb.xml部署3. Ajax4jsf 框架的基本概念介绍结构概览如何做...发送一个AJAX 请求决定发送什么决定改变什么4. Ajax4JSF 组件库a4j:ajaxListenera4j:regiona4j:pagea4j:supporta4j:commandLinka4j:commandButtona4j:outputPanela4j:actionparama4j:statusa4j:loadBundlea4j:mediaOutput5. Ajax4jsf内建的换肤功能6. 技术要求支持的java版本支持的 JavaServer Faces 实现支持的服务器支持的浏览器7. 附加的设置Web程序描述符参数Sun JSF RIApache MyFacesFacelets 支持JBoss Seam 支持8. 与IDE集成9. Exadel VCP 和 Ajax4jsf10. Web上的资源List of Tables4.1. a4j:ajaxListener attributes4.2. a4j:region attributes4.3. a4j:page attributes4.4. a4j:support attributes4.5. a4j:commandLink attributes4.6. a4j:commandButton attributes4.7. a4j:outputPanel attributes4.8. a4j:actionparam attributes4.9. a4j:status attributes4.10. a4j:loadBundle attributes4.11. a4j:mediaOutput attributes7.1. Initialization Parametres7.2. org.ajax4jsf.Filter Initialization Parametres10.1. Ajax4jsf Resources序言:Ajax4JSF是一个很容易使用的框架.有什么问题可以在JSF中文论坛讨论.Chapter 1. 介绍这里是一些介绍a4j的内容,暂时先不翻译了,等有时间再补充上.Ajax4jsf 是一个添加Ajax功能到JSF项目中的开源框架,使用该框架不用写JS 代码.Ajax4jsf 充分利用了JSF框架的优点,如: 生命周期, 验证, 转换的灵活性和受管理的静态和动态资源. 使用Ajax4jsf, 具有Ajax支持的富组件和高度可自定义的外观感觉可以很容易的与JSF结合起来.Ajax4JSF 被设计用来:在使用Ajax时充分显示JSF的优点.Ajax4jsf 完全被结合到 JSF 生命周期中. 当其他框架仅仅给你访问Managed Bean的便利时,Ajax4JSF带给你 Action 和Value Change 监听器,激活服务端验证,在Ajax请求-响应周期中的转化这些功能.添加 AJAX 功能到已经存在的 JSF 项目. 该框架被实现为使用一个组件库来添加ajax功能到你的页面中,而不要写js代码或者使用新的Ajax装饰器替换你已经做好的JSF组件. Ajax4jsf 具有页面范围(page-wide)的Ajax支持,而不是传统的组件范围(component-wide)的ajax支持. 这意味着你可以在页面中定义一个激活Ajax请求的事件,和当根据客户端事件触发Ajax请求来改变服务器端数据后如何使用JSF组件树来同步显示JSF页面.使用内建的Ajax支持写自定义富组件. 将来, 我们将有一个完全的组件开发包(CDK)来支持AJax4JSF. CDK 将包含代码生成工具和一个使用类似JSP语法的模版工具.这些功能将去除一些创建组件的一个例行工作.使用这个喝满油的组件工厂机器来创建一个带有 Ajax功能的富组件将比使用传统的编码过程创建一个简单的组件还要简单.项目的Java类与资源包. 除了核心的 AJAX 功能外, Ajax4jsf 也有管理资源的高级支持,例如:图片,JS代码和CSS样式表单,资源框架使简单的打包这些资源到你自定义组件的Jar文件中成为可能.动态(on-the-fly)将非常容易. 作为另外一种附加的功能, 资源框架有一个动态产生图片的工具. 使用这个特性,你可以使用类似于使用Java Graphic2D库的方法来创建图片.使用基于皮肤的技术来创建一个现代富用户界面的外观感觉(look-and-feel). Ajax4jsf 提供一个换肤特性 . 该特性允许通过命名的皮肤参数来简单的定义和管理不同颜色模式与其他UI特性. 你可以从JSP代码和Java代码(例如:基于UI的文本来产生动态的图片)来访问这些皮肤参数 . 注意:, 虽然换肤功能不是完全的替代传统的CSS,但是它还是值得称赞的.测试components, actions, listeners, 和 pages 就像你在创建他们一样容易. 一个制动测试工具正在开发中 .它将在你开发组件使为你的组件产生测试案例. 该测试框架不仅仅测试组件,也测试服务端和客户端的功能包括JS代码 .作为附加的有用工具,你不需要单独的部署测试程序到Servlet容器中就可以做到这些了.Ajax4JSF 组件已经可以使用了, 因此开发者可以立即使用这种省时的具有高级特性的工具来创建提供了更快更可靠的用户体验的Web程序了. Chapter 2. 开始使用Ajax4jsfTable of ContentsEnvironmentDownloading Ajax4jsfInstallationSimple AJAX Echo ProjectJSP PageData Beanfaces-config.xmlWeb.xmlDeployment环境要求要使用Ajax4JSF 框架你仅仅需要JDK1.4或者更高,任何JSF实现,和你最喜欢的Servlet容器.在下一章我们将给你提供详细的环境信息.Ajax4jsf 被设计为一个容易使用的框架.仅仅有一点简单的设置步骤就可以在你的JSF程序中使用Ajax功能了.下载 Ajax4jsf最新的Ajax4jsf 发布版在这里https:///nonav/ajax/ajax-jsf/download.html下载. 安装∙解压 ajax4jsf.zip 文件.∙复制 ajax4jsf.jar and oscache-2.2.jar 到程序的 WEB-INF/lib 文件夹下.∙把下面的内容添加到你的程序的 WEB-INF/web.xml 文件中:∙ <filter>∙ <display-name>Ajax4jsf Filter</display-name>∙ <filter-name>ajax4jsf</filter-name>∙ <filter-class>org.ajax4jsf.Filter</filter-class>∙ </filter>∙ <filter-mapping>∙ <filter-name>ajax4jsf</filter-name>∙ <servlet-name>Faces Servlet</servlet-name>∙ <dispatcher>REQUEST</dispatcher>∙ <dispatcher>FORWARD</dispatcher>∙ <dispatcher>INCLUDE</dispatcher>∙ </filter-mapping>注意. 你可以复制和粘贴上面的内容在 README.txt 文件中.∙添加下面的内容:∙ <%@ taglib uri="https:///ajax"prefix="a4j"%>到你每个使用Ajax功能的JSP页面中.简单的 AJAX Echo 项目让我们来看一个简单的JSF项目. 我们仅仅需要一个JSP页面,里面包含一个Form和一些JSF标签: <h:inputText> 和 <h:outputText>.我们这个简单的程序应该可以让我们输入一些文字到<h:inputText>中, 然后发送数据到Server,并在 <h:outputText>中显示Server的响应(给我们一个Echo 信息).JSP 页面下面是一个我们需要的页面代码 (echo.jsp) :<%@ taglib uri="https:///ajax" prefix="a4j"%> <%@ taglib uri="/jsf/html" prefix="h"%><%@ taglib uri="/jsf/core" prefix="f"%><html><head><title>repeater </title></head><body><f:view><h:form><h:inputText size="50" value="#{bean.text}" ><a4j:support event="onkeyup" reRender="rep"/></h:inputText><h:outputText value="#{bean.text}" id="rep"/></h:form></f:view></body></html>就如你看到的,唯一一行于常给JSF页面代码不同的就是下面的一行<a4j:support event="onkeyup" reRender="rep"/>在这里我们在父标签(<h:inputText>)中添加了一个AJAX 支持. 该支持绑定了JavaScript事件“onkeyup” .因此, 每一次该事件发布给父标签时,我们的程序将发送一个AJAX请求到Server.这意味着我们的受管理的bean将包含该“text” 域中我们输入的最新数据.<a4j:support> 标签的“reRender” 属性(attribute)定义我们的页面的哪一部分被更新. 在这里,该页面唯一被更新的部位是 <h:outputText> 标签,因为他的ID值和“reRender” 的属性值向匹配. 在一个页面中更新多个元素(elements)也是很简单的:仅仅把他们的IDs放在“reRender” 属性中就可以了.数据 Bean当然了,为了运行这个程序我们还需要一个受管理的beanpackage demo;public class Bean {private String text;public Bean() {}public String getText() {return text;}public void setText(String text) {this.text = text;}}faces-config.xml下一步, 我们需要在faces-config.xml 中注册上面的bean:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE faces-config PUBLIC "-//Sun Microsystems, Inc.//DTD JavaServer Faces Config 1.1//EN""/dtd/web-facesconfig_1_1.dtd"><faces-config><managed-bean><managed-bean-name>bean</managed-bean-name><managed-bean-class>demo.Bean</managed-bean-class><managed-bean-scope>request</managed-bean-scope><managed-property><property-name>text</property-name><value/></managed-property></managed-bean></faces-config>注意:这里没有任何东西直接和Ajax4jsf 有关联.Web.xml最后,不要忘了添加jar文件和更改 web.xml 文件:<?xml version="1.0"?><web-app version="2.4" xmlns="/xml/ns/j2ee" xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/xml/ns/j2ee/xml/ns/j2ee/web-app_2_4.xsd"><display-name>a4jEchoText</display-name><context-param><param-name>javax.faces.STATE_SAVING_METHOD</param-name><param-value>server</param-value></context-param><filter><display-name>Ajax4jsf Filter</display-name><filter-name>ajax4jsf</filter-name><filter-class>org.ajax4jsf.Filter</filter-class></filter><filter-mapping><filter-name>ajax4jsf</filter-name><servlet-name>Faces Servlet</servlet-name><dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher><dispatcher>INCLUDE</dispatcher></filter-mapping><listener><listener-class>com.sun.faces.config.ConfigureListener</listener-class></listener><!-- Faces Servlet --><servlet><servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class><load-on-startup>1</load-on-startup></servlet><!-- Faces Servlet Mapping --><servlet-mapping><servlet-name>Faces Servlet</servlet-name> <url-pattern>*.jsf</url-pattern></servlet-mapping><login-config><auth-method>BASIC</auth-method></login-config></web-app>就这样了, 现在你的程序应该可以工作了.部署最终,你可以在Servlet容器中部署你的程序了. 在你喜欢的容器中部署,然后在你的浏览器中输入: http://localhost:8080/a4jEchoText/echo.jsfChapter 3.Ajax4jsf 框架中的基本概念Table of ContentsIntroductionArchitecture OverviewHow To...Send an AJAX RequestDecide What to SendDecide What to Change介绍该框架被实现为使用一个组件库来添加ajax功能到你的页面中,而不要写js代码或者使用新的Ajax装饰器替换你已经做好的JSF组件. Ajax4jsf 具有页面范围(page-wide)的Ajax支持,而不是传统的组件范围(component-wide)的ajax支持. 这意味着你可以在页面中定义一个激活Ajax请求的事件,和当根据客户端事件触发Ajax请求来改变服务器端数据后如何使用JSF组件树来同步显示JSF页面. (This means you can define the event on the page that invokes an AJAX request and the areas of the page that should be synchronized with the JSF Component Tree after the AJAX request changes the data on the server according to the events fired on the client).下面的图片展示了它是如何工作的:Ajax4jsf 允许你定义(意味着通过JSF tags)你希望通过AJAX请求更新的JSF 页面的不同部分并且提供的一些发送AJAX请求到服务器端的选项,除了你的JSF 页面于常规的JSF有点不同外,没有其他的不同了,这是一个你不需要写JS代码和XMLHttpRequest对象的天堂.结构概览下面的图片展示了Ajax4jsf 框架的一些重要的元素Ajax 过滤器(Filter). 为了得到应用 Ajax4jsf 的好处你必须在在 web.xml 文件中注册一个Ajax Filter.该过滤器有一些职责. Ajax Filter 可以识别多种ajax请求种类. 图片3的序列图展示了在处理常规页面和AJAX请求页面的不同之处.在开始的情况下,所有的JSF树将被编码(encoded). 在第二种情况下依据AJAX 区域(region) (你可以通过使用<a4j:region> tag来定义AJAXregion )的大小(size). 就如你看到的,第二种情况下过滤器将解析AJAX响应的内容,在它被发送到客户端以前, 查看下面的图片来理解这两种方式:在这两种情况下, 你的程序所需要的静态或者动态资源的信息将被注册到ResourseBuilder 类中.当请求一个资源时(图片4),AJAX filter 检查资源缓存(Resource Cache)看看这个资源是否存在,如果存在该资源将被送到客户端.否则过滤器将在ResourceBuilder中搜索注册的资源. 如果该资源被注册了,AJAX filter将发送一个请求到 ResourceBuilder来创建[create (deliver)]该资源.下面的图片显示了请求资源的处理过程.Ajax动作组件(Action Components). 有3个Ajax动作组件: AjaxCommandButton, AjaxCommandLink 和 AjaxSupport. 你可以使用他们从客户端发送AJAX请求.Ajax容器 (Containers). AjaxContainer 是一个接口,该接口描述了在Ajax 请求中应该被解码(decoded)的JSF页面中的一个区域.AjaxViewRoot 和AjaxRegion 实现了该接口.JavaScript引擎 (Engine). Ajax4jsf JavaScript 引擎在客户端运行. 它知道如何根据来自于Ajax响应的信息来更新你JSF页面上的不同的区域. 程序开发者不需要直接使用这里的JavaScript代码.它自动的下载到客户端.如何做...发送一个 AJAX 请求从JSF页面发送ajax请求有不同的方法. 你可以使用 <a4j:commandButton>, <a4j:commandLink> 或者 <a4j:support> tags.所有的这些标签隐藏了在创建一个XMHttpRequest 对象和发送ajax请求所需要的JavaScript 活动.并且, 他们允许你选择页面中那个JSF组件被重新渲染(re-rendered) 来表现Ajax响应的结果 (你可以列出他们的 IDs 在“reRender” 属性中).<a4j:commandButton> 和 <a4j:commandLink> tags 用来在“onclick” JavaScript 事件中发送Ajax请求.在你选择JS事件(“onkeyup”, “onmouseover”, etc)时, <a4j:support> tag 允许你在普通的JSF组件中添加Ajax 功能和发送ajax请求.提供Ajax请求功能的大部分重要的属性如下:∙reRender 属性 - 就如我们前面提到过的,在一个Ajax响应到来时重新渲染(reRendered)组件.∙RequestDelay 属性–用来调节请求的频率.∙ <h:inputText size="50" value="#{bean.text}">∙<a4j:support event="onkeyup" RequestDelay=”3”/>∙ </h:inputText>因此每一个来自于键盘事件的请求将会延迟3 ms ,来减少请求的次数.∙EventsQueue –储存下一个请求的队列的名字. 队列帮助阻止下一个请求知道当前的处理完.∙LimitToList 用来控制更新的区域. 设置为true –将更新仅在reRender list中的区域, 如果为false,将更新所有Output Panels区域.∙ajaxSingle 如果设置为false用来指定发送请求的区域–如果为true则发送整个区域 - only control caused event.(attributesspecify regions to be sent with request if false –it’ll be full region in other case - only control caused event.)决定发送什么你可能描述了一个你决定发送到服务器的页面区域.当你发送ajax请求的时候,通过这种方式你可以控制JSF View的那个部分在服务器端被解码(decoded).描述你JSF页面上的一个Ajax区域的最容易的方法是什么都不做.这是因为在<f:view> 和 </f:view> tags 中的内容在默认值的情况下认为是ajax区域.通过使用<a4j:region> tag你可以在一个JSF页面中定义多个Ajax区域 (they can even be nested).如果你希望渲染ajax响应以外的区域,那么renderRegionOnly属性值应该设置为false.否则ajax更新被限制在活动区域的元素中.决定改变什么在大部分情况下都可以使用“reRender”中的ids来定义需要更新的“AJAX zones”.但是如果你的页面包含<f:verbatim/> tag(你希望在ajax响应中更新它的内容)你不可以使用这种方式.我们在上面描述的<f:verbatim/> tag 的问题涉及到JSF组件的transientFlag 值. 如果该标记的值为true,这个组件不能参与保存和恢复组件树(saving or restoring)的处理过程.为了提供一种解决这个问题的方法, Ajax4jsf 利用<a4j:outputPanel> tag定义了一个output panel . 如果你把<f:verbatim/> tag放在output panel中, 那么在AJAX 响应中 <f:verbatim/> tag和其他panel中的child tags中的内容可以被更新 .有两种方法来控制它:∙设置“ajaxRendered” 属性值为true.∙设置动作组件的“reRender” 属性值为output panel的 ID.Chapter 4. Ajax4JSF 组件库Table of Contentsa4j:ajaxListenera4j:regiona4j:pagea4j:supporta4j:commandLinka4j:commandButtona4j:outputPanela4j:actionparama4j:statusa4j:loadBundlea4j:mediaOutputa4j:ajaxListener和 ActionListener或者ValueChangeListener的工作方式一样, 只是仅用于AJAX容器. 添加一个指定的类作为AjaxEvent的监听器. (sent in case of an AJAX request for this container).Table 4.1. a4j:ajaxListener attributes<a4j:region selfRendered="true" ajaxListener="#{bean.processAjax}" id="Region">…</a4j:region>当来自于Region的AJAX request触发时,将调用bean的'processAjax'方法. a4j:region该标签定义在AJax请求处理过程中被发送到服务器端解码的部分JSF组件树.Table 4.2. a4j:region 的属性<a4j:region><!--Some content--><a4j:region>如果在该组件的区域中有一个Ajax 请求调用了 – 该区域将根据Ajax 的设置被框架处理.a4j:page该组件呈现一个完全的HTML 页面结构.它必须是view root (JSP <f:view> tag)的第一个(并且是仅有的一个)子组件. 没有Html 代码可以在该组件的外面. 它也支持在Ajax 请求中处理子组件,就和<a4j:region>一样.对于一个普通的请求,它将把结果呈现为在客户端页面< head>元素中的<script>元素.如果该组件包含一个"head" facet, 该facet 的内容也呈现在<head>中.对于一个Ajax 请求,在整个结构中仅仅涉及到的组件被呈现.下面是个在JSP (jspx version)中使用它的例子:<jsp:root xmlns:....<f:view><a4j:page><f:facet name="head">...</f:facet><!-- page content here --></a4j:page></f:view></jsp:root>Table 4.3. a4j:page attributes<a4j:page><f:facet name=”head”>…</f:facet>…<a4j:page>上面的示例结构将被呈现为:<HTML><HEAD>…</HEAD><body >…</body></HTML>a4j:support在 UIComponent-based组件上添加ajax功能,使他们有JavaScript事件属性. 在解码期间:如果一个请求为Ajax-performed, 从ExternalContext 中的requestParameterMap属性中得到Map,如果该Map中"clientId" key对应的值非空,在组件上创建一个 javax.faces.event.ActionEvent, 并且传递该事件到该组件的queueEvent()中,然后把他的reReander区域中的组件id添加到reReander属性中.在编码过程中.不编码一个组件. 相反的,在父组件上添加一个与事件属性的值相同的值绑定(Instead, it adds ValueBinding for a property of the parent component with the name as a value of its "event" property).结果,当呈现时,父组件创建一个在提交一个ajax请求时用到的JS代码.如果该组件有子UIParameter组件,添加他的 name/value作为附加的请求参数.如果父组件是一个UIInput的实例,并且ajaxType属性是input, 则也提交input 域中的值. 在这种情况下,你可以在UIForm外面提交一个单一的input 域. (As a result, when rendered, the parent component builds JavaScript code for submitting an AJAX request on this event. If the component has child UIParameter components, appends it's name/value as additional request parameters. If a parent component is an instance of UIInput andthe ajaxType property is "input", submits the value of the input field, also. In this case, you can submit a single input field outside of UIForm.)Table 4.4. a4j:support 属性所有你需要指定的东西 - 父组件用来触发ajax请求的事件和被reRender的区域, 和处理事件的Java bean方法.<a4j:region selfRendered="true">…<h:selectBooleanCheckbox value="#{pizza.tip}"><a4j:support event="change" reRender="#{partsId.list}"action="#{Some.show_hide}"/></h:selectBooleanCheckbox>…</a4j:region>因此,在上面的例子中,checkbox状态的改变将提交当前的区域. 'show_hide'动作将被调用,并且 'list'中的id所指定的组件将被更新.a4j:commandLink呈现一个Html <a> 元素,当点击时的动作就象一个form提交一样.在解码的过程中:从ExternalContext的属性requestParameterMap中得到一个Map,如果该Map中包含"clientId" key的非空值, 在组件上创建一个javax.faces.event.ActionEvent 事件,并且传递该事件给组件的queueEvent() 方法.如果该请求是Ajax-performed,把reRander属性中的IDs值添加到嵌套的AjaxContainer的 rendered areas list中 ,在解码的过程中也添加组件的参数(PARAM_NAME 和 PARAM_VALUE 是任何嵌套的子UIParameter的names 和values .) names 和 values必须是被URLEncoded处理过的.如果styleClass 属性被指定了,呈现它的值为html中的class属性的值. 呈现任何non-UIParameter子组件为<a>的相应的子组件. 这些看起来就像一个Link文本.Table 4.5. a4j:commandLink attributes通常a4j:commandLink 是一个具有AJAX 支持的HTML <input> 元素. 包含所有的a4j:support的主要功能, 还有它自己的onclick事件的Ajax请求和所有与a4j:Support组合的CommandLink特性.a4j:commandButton呈现一个HTML "input" 元素.在解码的过程中:从ExternalContext的属性requestParameterMap中得到一个Map,如果该Map中包含"clientId" key的非空值, 在组件上创建一个javax.faces.event.ActionEvent 事件,并且传递该事件给组件的queueEvent() 方法.如果该请求是Ajax-performed,把reRander属性中的IDs值添加到嵌套的AjaxContainer的 rendered areas list中 .在编码的过程中:为onclick事件创建一个AJAX.Submit JavaScript调用.呈现组件的clientId 为name属性的值.呈现组件的当前值为value属性的值.如果styleClass属性被指定了,呈现它的值为class属性的值. 呈现 HTML "input"元素的子元素.Table 4.6. a4j:commandButton attributes简单来说a4j:CommandButton 是一个带有AJAX Support的 HTML <input> 元素 . 包含所有的a4j:support的主要功能, 还有它自己的onclick事件的Ajax请求和所有与a4j:Support组合的CommandButton特性.a4j:outputPanel创建页面中具有 AJAX-enabled的一个区域. 作为普通的请求,根据layout的属性值("inline" or "block")呈现为 <span> 或者 <div> HTML 元素. ( "id"属性将是clientId 属性的值.) 对于一个AJAX请求,如果ajaxRendered被设置为true,该元素的内容被包含在ajax响应中.Table 4.7. a4j:outputPanel attributes<h:form><a4j:region><h:outputText value="Input your name" /><a4j:outputPanel><h:message for="userName" style="color:red" /></a4j:outputPanel><h:inputText id="un" value="#{erName}" required="true"/><a4j:outputPanel id="test" layout="block"><h:outputText value="#{erName}" /></a4j:outputPanel><a4j:commandButton value="submit"></a4j:commandLink></a4j:region></h:form>在上面的例子中,在每个a4j:commandButton请求时 OutputPanels 中的outputText 将被 reRendered. 当验证错误时,消息将出现;或者,text将重复出现.a4j:actionparam联合两个JSF tags的桥梁, <f:actionListener>; 和 <f:param>. 在呈现阶段,像往常一样被符组件 (<h:commandLink>; 或者 like) 解码,在处理请求阶段,如果父组件执行一个动作事件, 更新"assignTo" 属性的值为它的新值.如果一个转换属性被指定了,使用它来编码和解码该值为保存在html 参数中的字符串.Table 4.8. a4j:actionparam attributesa4j:status在客户端呈现一个表现ajax请求状态的标识.在编码过程中:创建两个带有id的该组件的子(clientId )span元素,或者添加了":status.start" 和 ":status:stop" 字符串的 ajax区域的目标(使用for属性来指定). "start" span 具有 "display:none" style (隐藏).在span里面,呈现startText/stopText属性值或者如果"start" 和 "stop" facets存在的话,呈现facets的内容. 在执行一个ajax请求时, 客户端的js代码改变 "start" span 的可见属性并且隐藏"stop". 当该指示器所指示的请求都完成时,恢复"stop" 并且隐藏"start" .start[style,styleClass] 和stop[style,styleClass] 被呈现为 spans 的 style 和 class 属性 .During Encoding: Creates two "span" elements with id created as clientId of this component or of target AJAX region (pointed to by the "for" property) with appended ":status.start" and ":status:stop" strings. "start" span has "display:none" style (hidden). Inside this span, renders the value of the startText/stopText properties or, if they exist, the content of "start" and "stop" facets. On performing an AJAX request, the client-side script changes the visibility of the "start" span and hides "stop". After all requests for this indicator are completed, restores "stop" and hide "start" start[style,styleClass] andstop[style,styleClass] are rendered for spans as style and class atributes, respectivetly.在解码的过程中:....Creates two "span" or "div"(depending on 'layout' attribute) elements with id created as clientId of this component or of target AJAX region (pointed to by the "for" property) with appended ":status.start" and ":status:stop" strings. "start" element has "display:none" style (hidden). Inside this element, renders the value of thestartText/stopText properties or, if they exist, the content of "start" and "stop" facets. On performing an AJAX request, the client-side script changes the visibility of the "start" element and hides "stop". After all requests for this indicator are completed, restores "stop" and hide "start" start[style,styleClass] and stop[style,styleClass] are rendered for spans as style and class atributes, respectivetly.Table 4.9. a4j:status attributes指示请求状态的两种表示方式:1.定义 "startText" 和 "stopText" 属性2. <a4j:status startText="Performing Request"3. stopText="Request Done"4. for="stat1"/>5.定义 "start" 和 "stop" facets6. <a4j:status for="stat2">7. <f:facet name="start">8. <h:graphicImage value="/images/ajax_process.gif" />9. </f:facet>10. <f:facet name="stop">11. <h:graphicImage value="/images/ajax_stoped.gif" />12. </f:facet>13. </a4j:status>在任何一种状态下,当请求开始时 - ":status.start" span 将被呈现并且在请求结束后":status.stop" span 将出现.将状态应用到组件上也有两种方法:1.指定目标 AJAX Containers 的id为“for” 属性的值2.在组件上定义“status” 属性指定到状态.如果for省略了 - 状态组件将指向它所在的区域(status component will be pointed to region where it's placed )a4j:loadBundle加载一个本地化当前view的资源包,并且暴露它(作为一个Map)为当前请求的请求参数. In difference of original f:loadBundle tag, stored in components tree and activate on ajax/non ajax responsesTable 4.10. a4j:loadBundle attributesa4j:mediaOutput用用户指定的资源( images, sounds, video, active objects, applets ...)来创建任何连接元素类型的类.在CreateContent属性中指定的方法将把从DataBean中指定的值传递给OutputStream.重要: 在value中指定的数据bean 必须实现Serializable接口.Table 4.11. a4j:mediaOutput attributes在our Examples page.上有个创建图片的示例. 就像我们前面提到的一样,任何实现了 Serializable的 Bean 都可以是createContent方法的数据提供者.Chapter 5. Ajax4jsf中的更换皮肤功能Ajax4jsf 提供了一种在UI设计中很容易使用的换皮肤功能.使用这个框架,你可以很容易的在资源文件中使用命名皮肤参数来控制程序的显示外观.这里有个例子,提供了几种皮肤:/vcpDemo/使用Ajax4jsf 框架的skinability 服务,你可以很容易的控制程序的look-and-feel. 在Ajax4jsf的帮助下,使用skinability 服务,你可以在标准的JSF组件和自定义的JSF组件中定义相同的风格 .为了使用skinability 功能,请按照下面的步骤来:1.创建一个自定义的render kit并且在faces-config.xml 中注册它:2. <render-kit>3. <render-kit-id>NEW_SKIN</render-kit-id>4. <render-kit-class>5. org.ajax4jsf.framework.renderer.ChameleonRenderKitImpl6. </render-kit-class>7. </render-kit>8.然后,我们需要为已经定义好的组件皮肤创建和注册自定义renderers (Then we need to create and register custom renderers for the component skins based on the look-and-feel predefinedvariables that have been defined for the render-kit):9. <renderer>10. <component-family>mand</component-family>11. <renderer-type>javax.faces.Link</renderer-type>12. <renderer-class>13. newskin.HtmlCommandLinkRenderer14. </renderer-class>15. </renderer>16.最后,我们需要放置一个保存皮肤参数的属性文件在类路径根目录下面.该属性文件有两个要求:∙文件名必须是<name of renderer class>.skin.properties ― 在上面的例子中将是newskin.skin.properties .∙文件的第一行应该是 render.kit=<render-kit-id>― 在上面的例子中将是 render.kit=NEW_SKIN .关于创建自定义 renderers 的更多的信息可以在下面的连接中找到:/javaee/javaserverfaces/reference/docs/index.html Chapter 6. 技术要求Table of ContentsSupported Java VersionsSupported JavaServer Faces ImplementationsSupported ServersSupported Browsers下面是你使用 Ajax4jsf的技术条件.∙Java∙JavaServer Faces∙Java application server or servlet container∙Browser (on client side)支持的 Java 版本∙JDK 1.4 - 1.5支持的 JavaServer Faces 实现(注意: Ajax4JSF 也和 Facelets JSF 组件兼容.)∙Sun JSF 1.1RI∙JSF 1.2∙MyFaces 1.1.1 - 1.1.3支持的 Servers∙Apache Tomcat 4.1 - 5.5∙IBM Web Sphere 5.1 - 6∙BEA Web Logic 8.1 - 9∙Oracle AS / OC4J 10.1.3∙Resin 3.0∙Jetty 5.1.X∙Sun Application Server 8 (J2EE 1.4)∙Glassfish (J2EE 5)∙JBoss 3.2 - 4.0支持的 Browsers∙IE 5 - 6∙FireFox 1.0 - 1.5∙Opera 8.0 - 9.0∙Netscape 7.0Chapter 7. 附加的设置Table of ContentsWeb Application Descriptor parametresSun JSF RIApache MyFacesFacelets SupportJBoss Seam SupportAjax4jsf支持JSF中的所有组件和标签.在一个已经存在的JSF项目中添加Ajax4jsf支持,你必须把Ajax4jsf 库放在项目的lib目录下,并且在web.xml 文件中添加过滤器mapping.如果仅仅添加Ajax4JSF功能则已经存在的项目的行为将不会改变.web项目描述参数这些参数帮助开发和提高Ajax4JSF的扩展性.Table 7.1. 初始化参数Table 7.2. org.ajax4jsf.Filter 初始化参数Sun JSF RIAjax4jsf 与任何JSF (both JSF 1.1 and JSF 1.2) 实现都兼容.不需要附加的设置就可以和大部分JSF 组件库共同工作. 更多的信息参考:Apache MyFacesAjax4jsf 与所有的Apache MyFaces versions (1.1.1 - 1.1.3)兼容,并且包含附加的类库,如: Tomahawk Sandbox 和将来的Trinidad (以前的 ADF Faces). 但是有一些东西需要配置,为了使 MyFaces 和 Ajax4jsf更好的共同工作.。
jsfl使用手册摘要:1.JavaServer Faces (JSF) 简介2.JSF 开发环境搭建3.JSF 基本组件4.JSF 数据绑定5.JSF 事件处理6.JSF 验证7.JSF 导航8.JSF 高级特性9.JSF 实践建议与最佳实践10.JSF 开发常见问题及解决方案正文:JavaServer Faces (JSF) 是一个用于构建Java 企业级应用程序用户界面的标准框架。
它将用户界面与后端逻辑分离,使开发人员可以更专注于业务逻辑的实现。
本手册将介绍如何使用JSF 进行开发。
1.JSF 开发环境搭建要开始使用JSF,首先需要搭建开发环境。
这包括安装JDK、配置环境变量、安装并配置Java 开发工具包(JDK) 以及安装和配置JSF 支持的服务器,如GlassFish 或WildFly。
2.JSF 基本组件JSF 提供了一组基本组件,用于构建用户界面。
这些组件包括表单、文本框、按钮、标签等。
通过使用这些组件,开发人员可以轻松地构建复杂的用户界面。
3.JSF 数据绑定JSF 数据绑定功能允许将用户界面与后端数据模型进行关联。
开发人员只需在XML 文件中定义数据模型,JSF 引擎将自动完成数据绑定。
数据绑定支持一对多、多对多等复杂关系。
4.JSF 事件处理JSF 提供了事件处理机制,允许开发人员监听用户操作并作出相应的响应。
例如,当用户点击按钮时,可以触发一个事件处理器,执行相应的操作。
5.JSF 验证JSF 提供了验证功能,确保用户输入的数据满足一定的约束条件。
例如,非空验证、最小长度验证等。
验证失败时,JSF 引擎会显示友好的错误提示。
6.JSF 导航JSF 导航功能允许开发人员构建多页面应用程序。
通过配置导航规则,可以实现页面间的跳转。
此外,JSF 还支持基于请求参数的导航。
7.JSF 高级特性JSF 提供了许多高级特性,如数据表格、表单提交、国际化支持等。
这些特性可以帮助开发人员构建更加丰富和灵活的应用程序。
第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配置文件中的说明。
JSF中的javaScript的使用JSF一个常见的情况是在触发一个动作之前弹出一个确认对话框(例如:删除一条记录,取消编辑)。
另一个常见的情况是在保存一些信息到服务器之前在客户端做验证,例如在传回服务器之前验证password和Confirm password是否相等。
这篇文章描述了在<h:commandLink>和<h:commandButton>组件里如何触发客户端的java script功能。
<h:commandLink> 关联一个java script和一个commandLink并不困难,但是为了能够成功关联你需要理解jsf是怎样解析<h:commandLink>组件的。
下面的例子说明了<h:commandLink>是怎么被解析成HTML的:<h:form id=”userForm”><h:commandLink id=”lnkDeleteUser”value=”delete” action=”#{userBean.deleteUser}”/></h:form><a href="#" onclick= "clear_userForm();document.forms[‘userForm‘].elements[‘userForm:_link_ hidden_‘].value=‘userForm:lnkDeleteUser‘;if (document.forms[‘userForm‘].onsubmit){if (document.fo rms[‘userForm‘].onsubmit())document.forms[‘userForm‘].submit();}else {document.forms[‘userForm‘].submit();}return false; "id="userForm:lnkDeleteUser">delete</a>这里有几点需要注意:1,<h:commandLink>被解析成了超级链接<a href/>。
JavaServerFacesJSF框架详细介绍JavaServer Faces(JSF)框架详细介绍JavaServer Faces(JSF)是一种用于构建Web用户界面的Java EE 框架。
它提供了一组组件、工具和API,用于简化Web应用程序的开发过程。
本文将详细介绍JSF框架的特点、组成部分以及如何使用JSF 构建Web应用程序。
一、JSF的特点JSF具有以下几个特点,使得开发人员能够更加高效地构建可靠的Web应用程序:1. 组件化:JSF采用组件化的开发模式,它提供了丰富的可重用组件,如按钮、文本框、下拉列表等,开发人员可以通过组合和定制这些组件来构建Web界面。
2. 事件驱动:JSF基于事件驱动的模型,开发人员可以通过监听和处理事件来实现页面之间的交互和数据传递。
3. 易于扩展:JSF提供了可扩展性和灵活性,开发人员可以通过编写自定义组件或扩展JSF的现有组件来满足特定需求。
4. 内容管理:JSF的面向组件的开发模式使得管理和维护页面内容变得更加容易,开发人员可以集中精力于业务逻辑的实现。
二、JSF的组成部分JSF框架由以下几个核心部分组成:1. JSF API:提供了开发Web应用程序所需的一系列Java类和接口,包括组件、事件、验证、数据绑定等。
2. JSF实现:包括了JSF API的具体实现,如Oracle的Mojarra和Apache的MyFaces等。
3. 组件库:JSF框架提供了一些内置的组件库,如PrimeFaces、RichFaces等,开发人员可以通过使用这些组件库来快速构建Web用户界面。
4. 配置文件:JSF框架使用配置文件来管理组件、事件处理、验证规则等,开发人员可以通过配置文件来定义和定制应用程序的行为。
三、如何使用JSF构建Web应用程序使用JSF构建Web应用程序涉及以下几个基本步骤:1. 定义页面:使用JSF提供的标签和组件来构建Web页面,包括按钮、表格、表单等。
JSF雏形——ASFJSF早期叫做ASF,当时的选择如下:RPC框架:基于dubbo2.3.2做配置扩展,以及功能扩展包括:rest(resteasy)、webservice(cxf)、kryo/thrift序列化、调用压缩等;注册中心:Zookeeper,RPC框架直接接入数据源;监控中心:监控服务+HBase;管理平台:读取Zookeeper做管理平台,提供基本的上下线、黑白名单等功能。
现在的JSF构成目前的JSF几乎是全部自研RPC框架:轻量级,更佳的性能,兼容旧版本协议;注册中心:基于DB作为数据源,前置Index服务;支持十倍接入量;部分逻辑放在注册中心减少客户端负担;监控中心:监控Proxy服务+InfluxDB(2015后改为ElasticSearch);管理端:基于DB,功能更强大,提供完善的服务治理管理功能;打通京东应用管理平台,提供应用依赖关系梳理;HTTP网关:基于Netty,支持跨语言调用。
目前的JSF是基于DB做的数据最终一致,也就是AP系统。
注册中心主要实现的就是服务列表的注册订阅推送,服务配置的获取下发,服务状态的实时查看等功能。
注册中心节点是无状态的,可水平扩展的。
整个注册中心集群下的所有注册中心几点都是等价的。
JSF优化与特点引入Index服务概念:该服务就是一个最简单HTTP的服务,用于找注册中心节点(同机房或者压力最小或者其它特定场景),可以认为是不会挂的服务,RPC框架会优先连该服务拿注册中心地址,这样子的好处是注册中心地址变化后,RPC框架不用修改任何设置;注册中心内存有服务列表全量缓存,连不上数据库也保证可读;数据库的数据结构更适合各种维度展示、过滤、分析等,例如根据分组/IP/应用/机房等不同维度;注册中心就是个JSF服务,监控到压力大即可进行动态水平扩展,不会出现2015年双十一那样的事故了;服务列表推送逻辑改进:例如原来100个Provider,现在加1个节点,之前的SAF是需要下发101个节点,自己判断加了哪个节点,进行长链接建立;现在的改进是:修改为下发一个add事件,告知RPC框架加了1个节点,RPC框架进行长链接建立;这样做大大减少了推送的数据量;注册中心与RPC框架可各种交互:注册中心和RPC框架是长链接,而且JSF 是支持Callback的,注册中心可以调用RPC框架进行服务列表变化之外的操作;例如查看状态,查看配置,配置下发等。
Java的PrimeFaces框架第一章:介绍PrimeFaces框架PrimeFaces是一个用于构建Java服务器端Web应用程序的开源用户界面(UI)组件库。
它构建在JavaServer Faces(JSF)技术之上,并提供了丰富的、可定制的UI组件,使开发者可以轻松地构建出现代化、交互性强的Web应用程序。
PrimeFaces框架具有丰富的UI组件库,包括表格、图表、面板、对话框等。
它还提供了诸如主题定制、响应式设计、Ajax支持等功能,使开发者可以创建出具有高度可定制性和可扩展性的Web应用程序。
第二章:PrimeFaces的特性1. 丰富的UI组件库:PrimeFaces提供了大量的UI组件,例如按钮、输入框、下拉框、菜单等。
这些组件具有丰富的功能和样式,可以满足开发者的各种需求。
2. Ajax支持:PrimeFaces框架内置了Ajax支持,使得开发者可以在不刷新整个页面的情况下更新部分页面内容。
这种无刷新的交互方式提升了用户体验,并提高了应用程序的性能。
3. 主题定制:PrimeFaces允许开发者轻松地定制应用程序的外观和样式。
它提供了多个内置主题,并允许开发者根据自己的需求进行主题定制。
4. 响应式设计:PrimeFaces支持响应式设计,使得应用程序可以在不同尺寸的设备上自适应布局。
这使得应用程序在桌面、平板电脑和手机等多种设备上都能够良好地展示。
5. 安全性:PrimeFaces框架提供了一些安全性功能,例如跨站点请求伪造(CSRF)防护、输入验证等。
这些功能有助于保护应用程序免受安全威胁。
第三章:PrimeFaces的使用1. 环境准备:使用PrimeFaces框架之前,需要确保电脑上已经安装了Java JDK 和一个Java IDE,例如Eclipse或IntelliJ IDEA。
2. 引入PrimeFaces:首先,需要将PrimeFaces库文件引入到项目中。
可以从PrimeFaces官方网站下载最新的库文件,并将其添加到项目的依赖中。