读《JavaServer Faces 核心编程(第3版)》一书的记录—— 第 4 章 标准 JSF 标签——案例 select

All + All -

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
    • 源包
      • java包com.corejsf
        • RegisterForm.java
        • messages.properties
      • JDK 1.7
      • GlassFish Server 3.1.2
    • 配置文件
      • beans.xml
      • faces-config.xml
      • web.xml
  • + -第四步:阅读案例新功能
    • + -第一层面:视图
      • 页面文件
        • 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”,是一个“按钮”组件
            • 供用户提交表单用
    • + -第二层面:控制
      • 页面控制器
        • 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,对应于上述属性的读写方法
      • 数据控制器
        • 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()
    • + -第三层面:模型
      • RegisterForm
      • 内部类Weekday
      • 内部枚举Education
    • + -第四层面:配置
      • 无新内容
    • + -功能总结
      • 同时使用了复选框、单选按钮、菜单和列表框等组件
  • + -第五步:详解新技术(选择标签)
    • + -第一层面:视图
      • 视图文件
        • index.xhtml
          • + -1,一个“单个复选框”
            • *标签:h:selectBooleanCheckbox
            • *值绑定:value="#{form.contactMe}"
              • + -form是RegisterForm的实例对象名称
                • 由标注@Named("form")来指定的
              • contactMe是form的一个属性,其数据类型为boolean
              • 参见“控制”层面的“页面控制器RegisterForm”
            • *使用
              • (1)该组件的选择或者取消选择的状态的存取,都需要后台bean的一个读写属性来实现
              • (2)当组件是选择状态时,取值为true
              • (3)当组件是未选择状态时,取值为false
              • (4)本案例中,该组件是用来指定用户是否接收服务方的联系
          • + -2,一个“多选菜单”
            • *标签:h:selectManyMenu
            • *值绑定:value="#{form.bestDaysToContact}"
              • + -form是RegisterForm的实例对象名称
                • 由标注@Named("form")来指定的
              • bestDaysToContact是form的一个属性,其数据类型为int数组
              • 参见“控制”层面的“页面控制器RegisterForm”
            • *使用
              • (1)组件的值绑定到对象form中的一个聚集中
                • 该聚集是一个读写属性
                • 该聚集的类型由该组件的“选项”的值类型来决定
                • 该处的值是星期的某一天,其值是0至6,因此,聚集的类型为int数组较合适
              • (2)该组件所列的选项是一个星期的每一天
              • (3)用户可以选择选项中的一个或多个(多选)
              • (4)本案例中,该组件是用来选择一星期中的哪些天接收服务方的联系较好
            • 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文件
          • + -3,一个“单选菜单”
            • *标签:h:selectOneMenu
            • *值绑定:value="#{form.yearOfBirth}"
              • + -form是RegisterForm的实例对象名称
                • 由标注@Named("form")来指定的
              • yearOfBirth是form的一个属性,其数据类型为Integer
            • *该菜单必须选择吗:required="true"
            • *使用
              • (1)该处特性value的值是对象form的读写属性yearOfBirth
                • 数据类型:Integer
              • (2)该值是存取用户的“出生年份”
              • (3)当用户选择“菜单”中表示年份的某一选项时,该选项的值(而不是选项的标签)将写入属性yearOfBirth中
                • 当需要用户存入的“出生年份”时,由该属性的读取方法来实现
                • 参见页面文件showInformation.xhtml
              • (4)本案例中,该组件是用来选择用户的出生年份
            • 3-1,嵌入的菜单“选项”组件
              • *标签:f:selectItems
              • *值绑定:value="#{form.yearItems}"
              • *使用
                • 特性value指定的是控制器dorm的方法getYearItmes()
                  • 该方法的返回值是一个聚集Collection<SelectItem>的子类型ArrayList<SelectItem>
                  • 该聚集中的元素是:SelectItem实例对象
                  • 该实例对象中封装了表示年份的数字组成的值对象
                • 当用户选择某个选项时,自动调用SelcetItem实例对象的方法getValue,返回选择的项目的值对象
                • 这里的值对象会写入父组件所绑定的那个bean的属性中
                  • 即form.setearOfBirth()
          • + -4,一个“多选复选框”
            • *标签:h:selectManyCheckbox
            • *值绑定:value="#{form.colors}"
              • + -form是RegisterForm的实例对象名称
                • 由标注@Named("form")来指定的
              • colors是form的一个属性,其数据类型为int数组
            • *选择的项设置的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>
            • *列表中最多同时可见的选项数目: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是一个自定义枚举类型
            • *多个单项按钮的布局方式:layout="pageDirection"
            • *使用
              • 本案例中,该组件是用来用户获得的最高学位
            • 6-1,嵌入的多个单选按钮“选项”组件
              • *标签:f:selectItems
              • *值绑定:value="#{form.educationItems}"
                • educationItems是form的一个属性,其数据类型为Map<String, Education
              • *使用
                • 提供一组选项
                • 这些选项是由Map中的条目组成的
                  • 条目中的键,用作选项的标签
                  • 条目中的值用作选项的值
        • + -showInformation.xhtml
          • 无选择标签
      • + -视图资源
        • JSF2.0资源规定目录:resource
        • 存放资源文件的子目录:css
        • 级联样式表
          • styles.css
    • + -第二层面:控制
      • + -页面控制器
        • RegisterForm
          • 对应页面文件中的“选择标签”的特性value,设置了方法,因此该控制器属于“页面控制器”
      • + -数据控制器
        • RegisterForm
          • 其中的许多方法有直接处理数据模型功能,因此,该控制器属于“数据控制器”
    • + -第三层面:模型
      • + -RegisterForm
        • 其中有属性及其读写方法,直接存取用户提交的数据,因此,该类的实例对象就是一个“模型”
      • + -内部类:Weekday
        • 它对一个星期中的每一天进行建模
      • + -枚举:Education
        • 它对多种学历进行建模
    • + -第四层面:配置
      • 因为,本章重点学JSF标签,所以,该内容暂时略过
    • + -第五层面:国际化
      • 英文消息文件
        • com.corejsf.messages.properties
      • 注意:这里不讨论太多国际化问题,它超出了该案例的主要问题
  • + -第六步:本章内容总结
    • + -第一层面:视图
      • + -选择类型标签select
        • + -1,单选标签
          • + -(1)仅有一个选项,要么选择,要么不选择
            • *单个复选框:h:selectBooleanCheckbox
          • + -(2)有多个选项,只允许选择其中的一个选项
            • *单选按钮:h:selectOneRadio
            • *单选菜单:h:selectOneMenu
            • *单选列表框:h:selectOneListbox
        • + -2,多选标签
          • + -(1)有多个选项,允许选择其中的多个选项
            • *多选复选框:h:selectManyCheckbox
            • *多选菜单:h:selectManyMeny
            • *多选列表框:h:selecManyListbox
    • + -第二层面:控制器
      • + -对选择标签的值绑定
        • + -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类型
              • 它包含了用户选择的那一个选项的值
              • 本案例中的用例:无
        • + -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>();

    • + -第三层面:模型
      • 对学历建模
        • 类:Education
      • 对一个星期中的每一天建模
        • 类:Weekday

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值