select
- + -本章阅读说明
- 1,第一步、第二步和第三步的内容适合于那些没有读过该案例之前的章节读者,建议其他读者直接从第四步开始阅读
- 2,这里的读书记录,偏重于该案例在书中想要说明的知识点,而不是把前面章节没有涉及的内容都作为新知识点
- 3,建议阅读者,能够对照第四步中的内容,写出该案例的功能设计说明书
- 4,建议阅读者,能够对照第五步中的内容,写出该案例的功能实现方案
- 5,建议阅读者,能够动手在NetBeans(或其他IDE)中将该案例从头做一遍
- 6,本人在读书时,使用了思维导图(FreeMind)工具,如果有阅读者需要原型文档的,可qq联系:1028637037
- 7,该书是由美国 David Geary 和 Cay Horstmann 合著,由王超翻译,由《清华大学出版社》出版。如果您需要下载案例,可到出版社网址去。
- + -第一步:创建案例
- 使用随书源码在NetBeans中创建项目
- + -第二步:运行案例
- 在IDE中运行该案例
- + -第三步:阅读案例结构
- Web
- 页面文件
- index.xhtml
- showInformation.xhtml
- 资源文件夹resources
- 子文件夹css
- styles.css
- 子文件夹css
- 页面文件
- 源包
- java包com.corejsf
- RegisterForm.java
- messages.properties
- java包com.corejsf
- 库
- JDK 1.7
- GlassFish Server 3.1.2
- 配置文件
- beans.xml
- faces-config.xml
- web.xml
- Web
- + -第四步:阅读案例新功能
- + -第一层面:视图
- 页面文件
- index.xhtml
- *窗口标题显示内容:Checkboxes, Radio buttons, Menus, and Listboxes
- *页面标题显示内容:Please fill out the following information
- *文本“Name:”,对应一个“文本框”组件
- 供用户填写用户名
- *文本“Contact me”,对应单个“复选框”组件
- 供用户选择是否需要接收联系信息
- *文本“What`s the best day to contact you?”,对应一个“单选菜单”组件
- 供用户选择一周中的某一天为与之联系的最合适的一天
- *文本“What year were you born?”,对应一个“单选列表框”组件
- 供用户选择出生年份
- *文本“Select your favorite colors: ”,对应一组“复选框”组件
- 供用户选择多个喜欢的颜色
- *文本“Select the languages you speak: ”,对应一个“多选复选框”组件
- 供用户选择多个语言
- *文本“Select your highest education level: ”,对应一组“单选按钮”组件
- 供用户选择受教育的最高程度
- *文本“Submit information”,是一个“按钮”组件
- 供用户提交表单用
- index.xhtml
- 页面文件
- + -第二层面:控制
- 页面控制器
- RegisterForm
- + -*对应页面JSF HTML组件的属性
- 1,name:String
- 2,contactMe:boolean
- 3,bestDaysToContact:int []
- 4,yearOfBirth:Integer
- 5,colors:int []
- 6,languages:Set<String>
- 7,education:Education
- + -*对应页面JSF HTML组件的方法
- 1,对应于上述属性的读写方法
- + -*对应页面JSF HTML组件的属性
- RegisterForm
- 数据控制器
- RegisterForm
- *对应页面JSF CORE组件数据的属性
- 1,colorItems:SelectItem[]
- 2,educationItems:Map<String,Education>
- 3,languageItems:SelectItem[]
- 4,birthYears:Collection<SelectItem>
- 5,daysOfTheWeek:Weekday[]
- *对应页面JSF CORE组件数据的读写方法
- 1,getColorItems()
- 2,getEducationItems()
- 3,getLanguageItems()
- 4,getBirthYears()
- 5,getDaysOfTheWeek()
- *对应页面JSF CORE组件数据的属性
- RegisterForm
- 页面控制器
- + -第三层面:模型
- RegisterForm
- 内部类Weekday
- 内部枚举Education
- + -第四层面:配置
- 无新内容
- + -功能总结
- 同时使用了复选框、单选按钮、菜单和列表框等组件
- + -第一层面:视图
- + -第五步:详解新技术(选择标签)
- + -第一层面:视图
- 视图文件
- index.xhtml
- + -1,一个“单个复选框”
- *标签:h:selectBooleanCheckbox
- *值绑定:value="#{form.contactMe}"
- + -form是RegisterForm的实例对象名称
- 由标注@Named("form")来指定的
- contactMe是form的一个属性,其数据类型为boolean
- 参见“控制”层面的“页面控制器RegisterForm”
- + -form是RegisterForm的实例对象名称
- *使用
- (1)该组件的选择或者取消选择的状态的存取,都需要后台bean的一个读写属性来实现
- (2)当组件是选择状态时,取值为true
- (3)当组件是未选择状态时,取值为false
- (4)本案例中,该组件是用来指定用户是否接收服务方的联系
- + -2,一个“多选菜单”
- *标签:h:selectManyMenu
- *值绑定:value="#{form.bestDaysToContact}"
- + -form是RegisterForm的实例对象名称
- 由标注@Named("form")来指定的
- bestDaysToContact是form的一个属性,其数据类型为int数组
- 参见“控制”层面的“页面控制器RegisterForm”
- + -form是RegisterForm的实例对象名称
- *使用
- (1)组件的值绑定到对象form中的一个聚集中
- 该聚集是一个读写属性
- 该聚集的类型由该组件的“选项”的值类型来决定
- 该处的值是星期的某一天,其值是0至6,因此,聚集的类型为int数组较合适
- (2)该组件所列的选项是一个星期的每一天
- (3)用户可以选择选项中的一个或多个(多选)
- (4)本案例中,该组件是用来选择一星期中的哪些天接收服务方的联系较好
- (1)组件的值绑定到对象form中的一个聚集中
- 2-1,内嵌一个菜单“选项”组件
- *标签:f:selectItems
- *值绑定:value="#{form.daysOfTheWeek}"
- 是一个选项聚集
- 参见“控制”层面的“页面控制器RegisterForm”
- *选项聚集中的元素变量:var="w"
- w是页面设计者声明的,仅仅用来代表聚集中的元素
- 该聚集中的元素是内部类Weekday的对象
- *每个选项显示的内容:itemLabel="#{w.dayName}"
- *每个选项显示内容的对应值:itemValue="#{w.dayNumber}"
- *使用
- (1)特性value的值必须是:
- 单个SelectItem实例
- 或者聚集
- 或者数组
- 或者映射(映射实体是选项的标签和值)
- (2)该案例此处使用的是内部类Weekday数组
- (3)当用户选择一个选项时
- 该选项的值(而不是选项标签)就存入一个数组中
- 这个数组可以放入用户选择的每一个选项的值
- 当用户提交表单时
- 该数组作为参数传给父标签“多选菜单”:h:selectManyMenu
- 特性value指定的bean属性:bestDaysToContact 的写方法
- 当在页面showInformation中显示该数组的值时
- 使用bestDaysToContact 的读方法
- 请参考页面showInformation文件
- (1)特性value的值必须是:
- + -3,一个“单选菜单”
- *标签:h:selectOneMenu
- *值绑定:value="#{form.yearOfBirth}"
- + -form是RegisterForm的实例对象名称
- 由标注@Named("form")来指定的
- yearOfBirth是form的一个属性,其数据类型为Integer
- + -form是RegisterForm的实例对象名称
- *该菜单必须选择吗:required="true"
- *使用
- (1)该处特性value的值是对象form的读写属性yearOfBirth
- 数据类型:Integer
- (2)该值是存取用户的“出生年份”
- (3)当用户选择“菜单”中表示年份的某一选项时,该选项的值(而不是选项的标签)将写入属性yearOfBirth中
- 当需要用户存入的“出生年份”时,由该属性的读取方法来实现
- 参见页面文件showInformation.xhtml
- (4)本案例中,该组件是用来选择用户的出生年份
- (1)该处特性value的值是对象form的读写属性yearOfBirth
- 3-1,嵌入的菜单“选项”组件
- *标签:f:selectItems
- *值绑定:value="#{form.yearItems}"
- *使用
- 特性value指定的是控制器dorm的方法getYearItmes()
- 该方法的返回值是一个聚集Collection<SelectItem>的子类型ArrayList<SelectItem>
- 该聚集中的元素是:SelectItem实例对象
- 该实例对象中封装了表示年份的数字组成的值对象
- 当用户选择某个选项时,自动调用SelcetItem实例对象的方法getValue,返回选择的项目的值对象
- 这里的值对象会写入父组件所绑定的那个bean的属性中
- 即form.setearOfBirth()
- 特性value指定的是控制器dorm的方法getYearItmes()
- + -4,一个“多选复选框”
- *标签:h:selectManyCheckbox
- *值绑定:value="#{form.colors}"
- + -form是RegisterForm的实例对象名称
- 由标注@Named("form")来指定的
- colors是form的一个属性,其数据类型为int数组
- + -form是RegisterForm的实例对象名称
- *选择的项设置的css类:selectedClass="selected"
- *不可选择的项设置的css类:disabledClass="disabled"
- *当选择的选项有改变时就要利用js提交表单:οnchange="submit()"
- *使用
- (1)该标签提供多个复选框组件,用户可以选择多个选项
- (2)特性value指定标签的值是控制器form的读写属性colors
- 该属性是一个int类型数组
- (3)当用户选择一个选项时
- 所有选择的选项的值(而不是选项的标签)就写入属性colors
- 被选择的选项的显示css按照特性disabledClass设置的类selected做出改变
- 每次的选择选项动作,都会自动提交表单,由特性onchange设置的js函数submit()来完成
- (4)本案例中,该组件是用来选择用户喜欢的颜色
- 4-1,嵌入的复选框“选项”组件
- *标签:f:selectItems
- *值绑定:value="#{form.colorItems}"
- *使用
- 提供由多种颜色组成的一组选项
- 5,一个“多选列表框”
- *标签:h:selectManyListbox
- + -*值绑定:value="#{form.languages}"
- + -form是RegisterForm的实例对象名称
- 由标注@Named("form")来指定的
- languages是form的一个属性,其数据类型为Set<String>
- + -form是RegisterForm的实例对象名称
- *列表中最多同时可见的选项数目:size="5"
- *使用
- 本案例中,该组件是用来选择用户使用的语种
- 5-1,嵌入的列表“选项”组件
- *标签:f:selectItems
- *值绑定:value="#{form.languageItems}"
- languageItems是form的一个属性,其数据类型为SelectItem数组
- *使用
- 提供由SelectItem对象组成的一组选项,这些对象中分别封装了不同语言作为选项值
- + -6,一个“单选按钮”
- *标签:h:selectOneRadio
- *值绑定:value="#{form.education}"
- + -form是RegisterForm的实例对象名称
- 由标注@Named("form")来指定的
- education是form的一个属性,其数据类型为Education
- Education是一个自定义枚举类型
- + -form是RegisterForm的实例对象名称
- *多个单项按钮的布局方式:layout="pageDirection"
- *使用
- 本案例中,该组件是用来用户获得的最高学位
- 6-1,嵌入的多个单选按钮“选项”组件
- *标签:f:selectItems
- *值绑定:value="#{form.educationItems}"
- educationItems是form的一个属性,其数据类型为Map<String, Education
- *使用
- 提供一组选项
- 这些选项是由Map中的条目组成的
- 条目中的键,用作选项的标签
- 条目中的值用作选项的值
- + -1,一个“单个复选框”
- + -showInformation.xhtml
- 无选择标签
- index.xhtml
- + -视图资源
- JSF2.0资源规定目录:resource
- 存放资源文件的子目录:css
- 级联样式表
- styles.css
- 视图文件
- + -第二层面:控制
- + -页面控制器
- RegisterForm
- 对应页面文件中的“选择标签”的特性value,设置了方法,因此该控制器属于“页面控制器”
- RegisterForm
- + -数据控制器
- RegisterForm
- 其中的许多方法有直接处理数据模型功能,因此,该控制器属于“数据控制器”
- RegisterForm
- + -页面控制器
- + -第三层面:模型
- + -RegisterForm
- 其中有属性及其读写方法,直接存取用户提交的数据,因此,该类的实例对象就是一个“模型”
- + -内部类:Weekday
- 它对一个星期中的每一天进行建模
- + -枚举:Education
- 它对多种学历进行建模
- + -RegisterForm
- + -第四层面:配置
- 因为,本章重点学JSF标签,所以,该内容暂时略过
- + -第五层面:国际化
- 英文消息文件
- com.corejsf.messages.properties
- 注意:这里不讨论太多国际化问题,它超出了该案例的主要问题
- 英文消息文件
- + -第一层面:视图
- + -第六步:本章内容总结
- + -第一层面:视图
- + -选择类型标签select
- + -1,单选标签
- + -(1)仅有一个选项,要么选择,要么不选择
- *单个复选框:h:selectBooleanCheckbox
- + -(2)有多个选项,只允许选择其中的一个选项
- *单选按钮:h:selectOneRadio
- *单选菜单:h:selectOneMenu
- *单选列表框:h:selectOneListbox
- + -(1)仅有一个选项,要么选择,要么不选择
- + -2,多选标签
- + -(1)有多个选项,允许选择其中的多个选项
- *多选复选框:h:selectManyCheckbox
- *多选菜单:h:selectManyMeny
- *多选列表框:h:selecManyListbox
- + -(1)有多个选项,允许选择其中的多个选项
- + -1,单选标签
- + -选择类型标签select
- + -第二层面:控制器
- + -对选择标签的值绑定
- + -1,对于应单选标签
- + -(1)对于“单个复选框”
- + -*要求绑定控制器的一个读写属性
-
它是一个boolean类型
它包含了用户选择选项与否的值(true或false)
本案例中的用例:
在index.xhtml中:
<h:selectBooleanCheckbox value="#{form.contactMe}"/>
在RegisterForm中对应的属性:
private boolean contactMe;
-
- + -*要求绑定控制器的一个读写属性
- + -(2)对于“单选菜单”
- + -*要求绑定控制器的一个读写属性
-
它是一个Object类型
它包含了用户选择的那一个选项的值
本案例中的用例:
在index.xhtml中:
<h:selectOneMenu value="#{form.yearOfBirth}"
在RegisterForm中对应的属性:
private Integer yearOfBirth;
-
- + -*要求绑定控制器的一个读写属性
- + -(3)对于“单选按钮”
- + -*要求绑定控制器的一个读写属性
-
它是一个Object类型
它包含了用户选择的那一个选项的值
本案例中的用例:
在index.xhtml中:
<h:selectOneRadio value="#{form.education}"
在RegisterForm中对应的属性:
private Education education = Education.BACHELOR;
-
- + -*要求绑定控制器的一个读写属性
- + -(4)对于“单选列表框”
- + -*要求绑定控制器的一个读写属性
- 它是一个Object类型
- 它包含了用户选择的那一个选项的值
- 本案例中的用例:无
- + -*要求绑定控制器的一个读写属性
- + -(1)对于“单个复选框”
- + -2,对于多选标签
- + -(1)对于“多选复选框”
- + -*要求绑定控制器的一个读写属性
-
+ -它的数据类型
- 是一个聚集(Collection)
- 或者是一个映射(Map)
- 或者是一个数组
它包含了用户选择的那一些选项的值
本案例中的用例:
在index.xhtml中:
<h:selectManyCheckbox value="#{form.colors}"
在RegisterForm中对应的属性:
private int[] colors;
-
- + -*要求绑定控制器的一个读写属性
- + -(2)对于“多选菜单”
- + -*要求绑定控制器的一个读写属性
-
+ -它的数据类型
- 是一个聚集(Collection)
- 或者是一个映射(Map)
- 或者是一个数组
它包含了用户选择的那一些选项的值
本案例中的用例:
在index.xhtml中:
<h:selectManyMenu value="#{form.bestDaysToContact}">
在RegisterForm中对应的属性:
private int[] bestDaysToContact;
-
- + -*要求绑定控制器的一个读写属性
- + -(3)对于“多选列表框”
- + -*要求绑定控制器的一个读写属性
-
+ -它的数据类型
- 是一个聚集(Collection)
- 或者是一个映射(Map)
- 或者是一个数组
它包含了用户选择的那一些选项的值
本案例中的用例:
在index.xhtml中:
<h:selectManyListbox size="5" value="#{form.languages}">
在RegisterForm中对应的属性:
private Set<String> languages = new TreeSet<String>();
-
- + -*要求绑定控制器的一个读写属性
- + -(1)对于“多选复选框”
- + -1,对于应单选标签
- + -对选择标签的值绑定
- + -第三层面:模型
- 对学历建模
- 类:Education
- 对一个星期中的每一天建模
- 类:Weekday
- 对学历建模
- + -第一层面:视图