1、Java Server Faces,北京京北方科技股份有限公司 2009年3月3日,主要内容,1 JSF简介 2 JSF入门 3 JSF标签 4 JSF数据验证和转换 5 JSF表格 6 JSF与Struts的区别,1 JSF简介,1.1 什么是JSF 1.2 JSF的相关介绍 1.3 JSF示例,1.1 什么是JSF,Java Server Faces (JSF) :符合JavaEE5标准的Java Web应用框架。 JSF提供: 标准的编程接口 丰富可扩展的组件库 事件驱动模型 JSF通过IDE工具支持拖放式开发。,1.2 JSF相关介绍-JSF的目标,目标 简化开发 超越现有Web框架
2、试图在不同的角度上提供网页设计人员、应用程序设计人员、组件开发人员解决方案,让不同技术的人员可以彼此合作又不互相干扰,1.2 JSF相关介绍-JSF 体系结构,JSF 的主要优势之一就是它既是 Java Web 用户界面标准又是严格遵循模型-视图控制器 (MVC) 设计模式的框架。所有与应用程序的用户交互均由一个前端“Faces Servlet(控制器)来处理。,1.2 JSF相关介绍-JSF的优势,UI组件(UI-component) 事件驱动模式 用户界面到业务逻辑的直接映射 程序员和网页设计人员的分工 请求处理生命周期的多阶段划分 全面的用户自定义支持 Web开发的官方标准之一,1.3
3、JSF示例-第一个JSF程序,现在可以开发一个简单的程序了,我们将设计一个简单的登入程序,使用者送出名称,之后由程序显示使用者名称及欢迎讯息。,JSF示例-index.jsp-网页设计人员, 第一个JSF程序 请输入您的名称 名称: ,JSF示例-UserBean.java-程序开发人员,public class UserBean private String name; public void setName(String name) this.name = name; public String getName() return name; ,JSF示例-faces-config.xml-
4、程序开发人员, /pages/index.jsp login /pages/welcome.jsp usernet.UserBean session,JSF示例-welcome.jsp-网页设计人员, 第一个JSF程序 您好! 欢迎使用 JavaServer Faces! ,2 JSF入门-从示例程序中掌握,2.1 JSF 表达式语言(Expression Language) 2.2 托管 Bean(Backing Bean) 2.3 JSF导航,2.1 JSF 表达式语言(EL),搭配 JSF 标签来使用,是用来存取数据对象的一个简易语言。 以#开始,将变量或运算式放置在 与 之间。 #us
5、erBean.name EL的变量名也可以程序执行过程中所声明的名称,或是JSF EL预定义的隐含对象。 #param.name 对于Map类型对象,可以使用 . 运算符指定key值来取出对应的value,也可以使用 与 来指定。 #paramname #someBean.someMapuser.name 如果变量是List类型或阵列的话,则可以在 中指定索引。 #someBean.someList0,2.2 托管 Bean,JSF 使用 Bean 来达到逻辑层与表现层分离的目的,Bean 的管理集中在配置文件中,只要修改配置文件,就可以修改 Bean 之间的相依关系。 Backing Bea
6、n:在真正的业务逻辑Bean及UI组件之间搭起桥梁,在Backing Bean中会呼叫业务逻辑Bean处理使用者的请求,或者是将业务处理结果放置其中,等待UI组件取出当中的值并显示结果给使用者。,托管 Bean,在faces-config.xml中集中管理 作用域: application :一直存活 session :会话过程 request :请求阶段 none :需要时,临时,Beans的配置与设定,Bean的基本定义: 名称 类 存活范围 见JSF示例中Bean的配置 可选设置 属性的初始值 user #user ,2.3 JSF导航-Navigation,在示例配置文件的中,我们定义
7、了页面流程,当请求来自中指定的页面,并且指定了中的为login时,则会将请求导向至所指定的页面。接下来我们扩充程序,让它可以根据使用者输入的名称与密码是否正确,决定要显示欢迎讯息或是将使用者送回原页面进行重新登入。,JSF导航-简单Navigation,首先我们修改一下UserBean中的方法: private String name; private String password; private String errMessage; public String verify() if(!name.equals(“justin“) | !password.equals(“123456“)
8、errMessage = “名称或密码错误“; return “failure“; else return “success“; ,JSF导航-简单Navigation,接下来我们修改一下 faces-config.xml 中的页面流程定义:/pages/index.jsp success /pages/welcome.jsp failure /pages/index.jsp,JSF导航-简单Navigation,接下来告诉网页设计人员Bean名称与相关属性,以及决定页面流程的verify名称,我们修改 index.jsp 如下:请输入您的名称 名称: 密码: ,3 JSF标签,核心标签 标准
9、标签 输出类标签 输入类标签 命令类标签 选择类标签 其他标签,JSF核心标签,view 创建顶层视图 subview 创建视图的子视图 facet 向组件添加facet param 向组件添加参数 attribute 向组件添加属性 actionListener 在父组件上注册操作监听器 valueChangeListener 向父组件注册值变更监听器 converter 注册任意转换器 convertDateTime 注册日期时间转换器 convertNumber 注册数量转换器 validateLength 验证组件值的长度 validateDoubleRange 验证组件值的双精度范围
10、 validateLongRange 验证组件值的长整型范围 validator 向组件添加验证器 loadBundle 加载资源包 verbatim 向页面中添加标签 selectItem 指定UISelectOne或UISelectMany组件的一个项目 selectItems 指定UISelectOne或UISelectMany组件的多个项目,JSF标准标签,输出(Outputs) 其名称以output作为开头,作用为输出指定的信息或绑定值。 输入(Inputs) 其名称以input作为开头,其作用为提供使用者输入框。 命令(Commands) 其名称以command作为开头,其作用为提
11、供命令或链接按钮。 选择(Selections) 其名称以select作为开头,其作用为提供使用者选项的选取。 其它 包括了form、message、graphicImage等等未分类的标签。,标准HTML标签的属性,输出类标签,outputLabel产生 HTML标签,使用for属性指定组件的client ID,例如:outputLink产生 HTML标签,搭配可帮链结加上参数,所有的参数都会变成 name=value 的类型附加在链接后,value所指定的内容也可以是JSF EL绑定。例如:outputText简单的显示指定的值或绑定的信息,例如:,输入类标签,inputText显示单行输
12、入框,即输出 HTML标签,其type属性设定为text,例如:inputTextarea显示多行输入文字区域,即输出 HTML标签,例如:inputSecret显示密码输入框,即输出 HTML标签,其type属性设定为password,例如:inputHidden隐藏输入框,即输出 HTML标签,其type属性设定为hidden,隐藏输入框的值用于保留一些信息于客户端,以在下一次发送表单时一并提交,例如:,命令类标签,commandButton显示一个命令按钮,即输出 HTML标签,其type属性可以设定为button、submit或reset,预设是submit,按下按钮会触发 javax
13、.faces.event. ActionEvent,例如:commandLink产生超链接,会输出 HTML标签,而href属性会有#,而onclick属性会含有一段JavaScript程序,这个JavaScript的目的是按下链接后自动提交表单,具体来说其作用就像按钮,但外观却是超链接,例如: ,选择类标签,选取框单选 单选按钮 单选列表 单选菜单 复选 复选框 复选列表 复选菜单,选择类标签的选项, itemLabel itemValue 或者value绑定一个传回javax.faces. model.SelectItem的方法 value绑定至一个提供传回SelectItem的列表(数组
14、)的方法 SelectItem: value, label value绑定至一个提供传回Map对象的方法Map : label, value,其他标签, 图片排版 本体间只能包括JSF组件,如果想要放入非JSF组件,例如简单的样版(template)文字,则要使用 包括住。 包装组件,4 JSF数据转换与验证-表单中应用,4.1 转换器(Converter)协助模型与视图之 间的数据转换 4.2 验证器(Validator)协助进行语意检验(Semantic Validation),4.1 标准转换器,HTTP字符串 Java对象 对于基本数据类型(primitive type)JSF会使用j
15、avax.faces.Boolean、javax.faces.Byte等自动进行转换 对于 BigDecimal、BigInteger,则会使用javax. faces.BigDecimal、javax.faces.BigInteger自动进行转换 对于DateTime、Number,可以使用、标签进行转换,它们各自提供有一些简单的属性,可以让我们在转换时指定一些转换的格式细节:,4.1 自定义转换器,实现javax.faces.convert.Converter接口,这个接口有两个要实现的方法: public Object getAsObject(FacesContext context,
16、UIComponent component, String str); public String getAsString(FacesContext context, UIComponent component, Object obj); 在faces-config.xml中注册:cn.wiztek.converter.User cn.wiztek.converter.UserConverter在JSF页面中通过converter-id使用转换器: ,4.2 标准验证器,语法检验(Synatic Validation) 检查使用者输入的数据是否合乎我们所要求的格式,最基本的就是检查使用者是否填
17、入了栏目值,或是栏目值的长度、大小值等等是否符合要求。 三种标准验证器:,4.2 自定义验证器,实现javax.faces.validator.Validator接口中的validate()方法,如果验证错误,则丢出一个ValidatorException,它接受一个FacesMessage对象,这个对象接受三个参数,分别表示信息的严重程度(INFO、 WARN、ERROR、FATAL)、信息概述与详细信息内容,这些信息将可以使用或标签显示在页面上。 在faces-config.xml中注册验证器的标识(Validater ID)。 通过标签并设定validatorId属性来使用自定义验证器。
18、,错误信息处理,预定义的错误信息可以使用或标签显示出来 通过提供一个信息资源文件可以修改预定义的错误信息 MyFaces提供了支持中文的错误信息文件Messages_zh_CN.properties 也可以在程序中使用FacesMessage来提供信息,5 JSF表格处理,配合来以表格的方式显示数据,中只能包括 JSF组件或者是,JSF支持两种facet:header与footer。分别用以设定表格的表头与表尾文字,下面我们来实现一个简单表格的例子。,5 JSF表格示例,JSF表格数据设定,public class TableBean private List userList; public
19、 List getUserList() if(userList = null) userList = new ArrayList(); userList.add(new UserBean(“caterpillar“, “123456“);userList.add(new UserBean(“momor“, “654321“); userList.add(new UserBean(“becky“, “7890“); return userList; ,JSF表格样式,另外,对于表头、表尾仍至于每一行列,都可以分别设定CSS风格 ,6 JSF与Struts的相同和区别,相同点:据说JSF的主要负责
20、人就是struts的主要作者,所以二者的相似点还是有很多的。都采用taglib来处理表示层:在jsp页面中,二者都是采用一套标记库来处理页面的表示和model层的交互。 二者都采用了bean来作为和jsp页面对应的model层。该model层保存了jsp页面上的数据,同时可以作一些验证工作,在struts中就是FormBean,在JSF中就是back bean. 都采用bean作为控制层,Struts中采用ActionBean来处理业务逻辑,对于简单的应用可以直接在ActionBean中编写业务逻辑代码,也可以调用另外的bean或者EJB来处理业务逻辑;对于JSF则采用backing bean
21、来处理业务逻辑,同样,backing bean也可以直接编写业务逻辑或者调用其他的bean来处理业务逻辑。 都采用xml配置文件来处理bean的配置,页面导航等问题,增加了系统的灵活性。下面主要介绍下几个区别:,二者的侧重点不同,Struts侧重于控制层,侧重于如何分派和处理用户的请求,所以表示层的taglib功能不够强大。而JSF则侧重于表示层,实现了大量的标准组件,允许开发人员对表示层有更多的控制权,同时JSF实现了一个开放的架构,允许开发人员创建自己的组件,或者在现有的组件上继承,开发功能更强大的组件。,和jsp 对应的model层,在Struts中,jsp和FormBean是紧密结合在
22、一起的,只要写一个 jsp就必须对应一个FormBean,同时jsp上的每个组件都对应FormBean中相同名字的字段。这里不太灵活,比如,开发页面的时候就必须考虑后台的FormBean的实现,但此时如果该页面没有FormBean的话则程序运行时会出错。在JSF中,JSP页面中的组件通过value属性和backing bean的字段关联,这样就有比较大的灵活性,页面上的每个组件可以对应相同的backing bean,也可以对应不同的backing bean,而且在设计页面的时候可以不考虑backing bean如何设计,可以在设计完页面之后再考虑backing bean的实现问题。,关于数据验
23、证,Struts可以采用在FormBean中的验证函数中进行验证,也可以使用validator进行验证。在JSF中,提供了一些标准的validator.可以对输入的数据做一些简单的验证,例如验证数值数据的范围,字段是否必填等。另外对于input类型的组件可以通过validator属性关联到backing bean的一个验证方法上。,控制层,Struts 中通过form的action来提交请求,通过ActionServlet来分发请求,最后由ActionBean来处理请求,在Action中实现业务逻辑或者调用其他的业务逻辑bean来完成用户的请求并返回客户端。在这里,一个form只有一个acti
24、on,即一个页面只能提交到一个action Bean.对于页面上有多个按钮都需要提交的情况就需要使用一些变通的方法了。 JSF采用了事件模式来处理用户提交的请求。JSF实现了事件监听器来监测事件,例如当用户单击了一个按钮就会触发一个按钮单击事件,还有valuechange事件监听器来监测数值改变的事件等。例如在页面中通过通过CommandButton按钮的action属性来关联到backing bean的方法来执行相应的操作。 每个不同的按钮都可以关联不同的方法,当然也可以关联相同的方法,页面的导航,Struts的页面跳转是在ActionBean中发生,execute方法最后返回一个actio
25、nForward来进行跳转。而JSF则在事 件处理方法中最后返回一个字符串,由系统在xml文件中匹配自动进行跳转。 在JSF中也可以通过在JSP页面的CommandButton的action 属性中直接填写跳转的别名直接跳转,而不必经过事件处理方法的处理。,JSF进一步学习,FacesContext对象FacesContext的实例里包含了所有处理JSF请求所需的每个请求的状态信息 JSF请求处理生命周期 恢复视图:在内存中恢复或创建代表客户端用户界面信息的服务器端组件树(视图)。 应用请求值:用来自客户端的最新数据更新这些服务器端组件。 处理验证:对新数据执行验证和数据类型转换。 更新模型值:用新数据更新服务器端模型对象。 调用应用程序:调用满足请求所需要的应用程序逻辑,然后如果有需要,再导航到新页面。 渲染响应:把响应渲染给请求客户端。 JSF自定义组件,学习资料,JSF入门-简体中文版 JSF标签-简体中文版,谢谢大家!,