Java Server Faces 参考书籍 Java Server Faces 核心编程
Java Server Faces JSF产生的目的 JSF具有以下部件 将快速用户界面开发引入到服务器端JAVA 一套预制的UI组件 事件驱动的编程模型 使得第三方开发者能够支持其他组件的组件模型
Java Server Faces 与Struts的相似性 如果对于Struts熟悉的话,会发现JSF具有与Struts很相似的体系结构,因为JSF的设计者之一就是Struts的设计者
Java Server Faces 如果您是从使用的角度来看JSF,则您不用理会HTTP、数据转换等细节,JSF将细节都隐藏起来了,无论您是网页设计人员或是应用程序设计人员,都可以使用自己熟悉的方式来看JSF
Java Server Faces 有很多方案试着解决web开发的种种困境,而各自的着眼点各不相同,有的从程序设计人员的角度来解决,有的从网页设计人员的角度来解决,各种框架被提出,所造成的是各种不统一的标签与框架,集成开发环境(IDE)难以整合这些标签与框架,另一方面,开发人员的学习负担也不断的加重,他们必须一人了解多个角色的工作
Java Server Faces JavaServer Faces的提出在试图解决这个问题,它试图在不同的角度上提供网页设计人员、应用程序设计人员、组件开发人员解决方案,让不同技术的人员可以彼此合作又不互相干扰,它综合了各家厂商现有的技术特点,由Java Community Process(JCP)团队开发出来的一套标准,并在2004年三月发表了JavaServer Faces 1.0实现成果
Java Server Faces 从网页设计人员的角度来看,JavaServer Faces提供了一套像是新版本的HTML标签,但它不是静态的,而是动态的,可以与后端的动态程序结合,但网页设计人员不需要理会后端的动态部份,网页设计人员甚至不太需要接触JSTL这类的标签,也可以动态的展现数据(像是动态的查询表格内容),JavaServer Faces提供标准的标签,这可以与网页编辑程序结合在一起,另一方面,JavaServer Faces也允许您自定义标签
Java Server Faces 从应用程序设计人员的角度来看,JavaServer Faces提供一个与传统应用程序开发相类似的模型(当然因某些本质上的差异,模型还是稍有不同),他们可以基于事件驱动来开发程序,不必关切HTTP的处理细节,如果必须处理一些视觉组件的属性的话,他们也可以直接在整合开发环境上拖拉这些组件,点选设定组件的属性,JavaServer Faces甚至还为应用程序设计人员处理了对象与字符串(HTTP传送本质上就是字符串)间不匹配的转换问题
Java Server Faces 从UI组件开发人员的角度来看,他们可以设计通用的UI组件,让应用程序的开发效率提高,就如同在设计Swing组件等,UI开发人员可以独立开发,只要定义好相关的属性选项来调整细节,而不用受到网页设计人员或应用程序设计人员的干扰。 三个角色的知识领域原则上可以互不干扰,根据您的角色,您只要了解其中一个知识领域,就可以运用JavaServer Faces,其它角色的知识领域您可以不用了解太多细节
Java Server Faces 当然,就其中一个角色单独来看,JavaServer Faces隐藏了许多细节,若要全盘了解,其实JavaServer Faces是复杂的,每一个处理的环境都值得深入探讨,所以学习JavaServer Faces时,您要选择的是通盘了解,还是从使用的角度来了解,这就决定了您学习时所要花费的心力
Java Server Faces 要使用JSF,首先您要先取得JavaServer Faces参考实现(JavaServer Faces Reference Implementation),在将来,JSF会与Container整合在一起,届时您只要下载支持的Container,就可以使用JSF的功能
第一个JSF程序 一个用户登陆程序示范 新建WEB工程,增加对JSTL与JSF支持
导航规则设置 在JSF中是根据faces-config.xml中<navigation-rule>设定,以决定在符合的条件成立时,该连结至哪一个页面 对于JSF,每一个视图(View)都有一个独特的标识(identifier),称之为View ID,在JSF中的View ID是从Web应用程序的环境相对路径开始计算,设定时都是以/作为开头,如果您请求时的路径是/pages/index.faces,则JSF会将副文件名改为/pages/index.jsp,以此作为view-id
导航规则设置 在<navigation-rule>中的<from-view-id>是个选择性的定义,它规定了来源页面的条件,<navigation-case>中定义各种导览条件,<from-outcome>定义当表单结果符合的条件时,各自改导向哪一个目的页面,目的页面是在<to-view-id>中定义
导航规则设置 您还可以在<navigation-case>中加入<from-action>,进一步规范表单结果必须根据哪一个动作方法(action method),当中是使用 JSF Expression Language 来设定
导航规则设置
导航规则设置 在导航时,预定义都是使用forward的方式,您可以在<navigation-case>中加入一个<redirect/>,让JSF发出让浏览器重新导向(redirect)的header,让浏览器主动要求新网页
导航规则设置 您的来源网页可能是某个特定模组,例如在/admin/下的页面,您可以在<from-view-id>中使用通配符,也就是使用 * 字符 <from-view-id>/admin/*</from-view-id> 在上面的设定中,只要来源网页是从/admin来的,都可以开始测试接下来的<navigation-case>
导航规则设置 <from-view-id>如果没有设定,表示来源网页不作限制,您也可以使用 * 显式的在定义文件中表明 或
JSF Expression Language
JSF Expression Language 在JSF标签的属性上," 与 " (或'与')之间如果含有EL,则会加以运算,您也可以这么使用它: ... <f:view> 名称, 年龄:<h:outputText value="#{userBean.name}, #{userBean.age}"/> </f:view> 一个执行的结果可能是这样显示的: 名称, 年龄:zhangsan,20
JSF Expression Language EL的变量名也可以程序执行过程中所声明的名称,或是JSF EL预定义的隐含对象,例如下面的程序使用param隐含对象来取得使用者输入的参数
JSF Expression Language
JSF Expression Language
JSF Expression Language
JSF Expression Language
国际化信息 JSF的国际化(Internnationalization)信息处理是基于Java对国际化的支持,您可以在一个信息资源文件中统一管理信息资源,资源文件的名称是.properties,而内容是名称与值的配对
国际化信息 资源文件名称由basename加上语言与地区来组成 * basename.properties * basename_en.properties * basename_zh_CN.properties 没有指定语言与地区的basename是预定义的资源文件名称,JSF会根据浏览器送来的Accept-Language header中的内容来决定该使用哪一个资源文件名称
国际化信息
国际化信息 messages_zh_CN.txt titleText=JSF示范 hintText=请输入名称与密码 nameText=名称 passText=密码 commandText=送出
国际化信息
国际化信息 接下来您可以使用<f:loadBundle>标签来指定载入信息资源 参考页面index.jsp 如此一来,如果您的浏览器预定义接受zh_CN语系的话,则页面上就可以显示中文,否则预定义将以英文显示
国际化信息
Managed Beans JSF 使用 Bean 来达到逻辑层与表现层分离的目的,Bean 的管理集中在配置文件中,您只要修改配置文件,就可以修改 Bean 之间的相依关系
Backing Beans JSF使用 JavaBean 来达到程序逻辑与视图分离的目的,在JSF中的Bean其角色是属于Backing Bean,又称之为Glue Bean,其作用是在真正的业务逻辑Bean及UI组件之间搭起桥梁,在Backing Bean中会调用业务逻辑Bean处理使用者的请求,或者是将业务处理结果放置其中,等待UI组件取出当中的值并显示结果给使用者 JSF将Bean的管理集中在faces-config.xml中
Backing Beans 可以将Bean存活范围设定为none,当设定为none时会在需要的时候生成一个新的Bean,例如您在一个method中想要生成一个临时的Bean,就可以将之设定为none。 在JSF页面上要取得Bean的属性,是使用 JSF表示语言 (Expression Language),要注意到的是,JSF表示语言是写成 #{expression},而 JSP表示语言 是写成 ${expression},因为表示层可能是使用JSP,所以必须特别区分,另外要注意的是,JSF的标签上的属性设定时,只接受JSF表示语言
Beans的配置与设定 JSF预定义会读取faces-config.xml中关于Bean的定义,如果想要自行设置定义文件的名称,我们是在web.xml中提供javax.faces.CONFIG_FILES参数
Beans的配置与设定 定义文件可以有多个,中间以 "," 区隔
Beans的配置与设定
Beans的配置与设定 如果有必要在启始Bean时,自动设置属性的初始值,则可以如下设定
Beans的配置与设定 如果要设定属性为 null 值,则可以使用<null-value/>标签
Beans的配置与设定 属性不一定是字符串值,也许会是int、float、boolean等等类型,您可以设定<value> 值时指定这些值的字符串名称,JSF会尝试进行转换,例如设定为true时,会尝试使用Boolean.valueOf()方法转换为boolean的 true,
Beans的配置与设定
Beans的配置与设定 可以将其它产生的Bean设定给另一个Bean的属性
Beans上的List, Map 如果Bean上有接受List或Map类型的属性,则您也可以在配置文件中直接设定这些属性的值
Beans上的List, Map 这是一个设定接受List类型的属性,我们使用<list-entries>标签指定将设定一个List对象,其中<value-class>指定将存入List的类型,而<value>指定其值,如果是基本类型,则会尝试使用指定的 <value-class>来作Wrapper类 设定Map的话,则是使用<map-entries>标
Beans上的List, Map
Beans上的List, Map 由于Map对象是以key-value对的方式来存入,所以我们在每一个<map-entry>中使用<key>与<value>标签来分别指定 您也可以直接像设定Bean一样,设定一个List或Map对象
Beans上的List, Map
数据转换与验证 转换器(Converter)协助模型与视图之间的数据转换,验证器(Validator)协助进行语意检验(Semantic Validation)
标准转换器 JSF定义了一系列标准的转换器(Converter),对于基本数据类型(primitive type)或是其Wrapper类,JSF会使用 javax.faces.Boolean、javax.faces.Byte、 javax.faces.Character、javax.faces.Double、javax.faces.Float、 javax.faces.Integer、javax.faces.Long、javax.faces.Short等自动进行转换
标准转换器 至于DateTime、Number,我们可以使用<f:convertDateTime>、<f:convertNumber>标签进行转换,它们各自提供有一些简单的属性,可以让我们在转换时指定一些转换的格式细节 参见范例