MyEclipse6Java开发中文教程 第十四章开发JSF应用 第十四章开发JSF应用 141前言 142介绍 143系统需求 144快速入门 144.1创建 HelloJSF项目 1442创建消息包 33467 1443创建受管Bean 1444创建JSP页面 1445添加导航规则 1446运行应用程序 292 145事件监听和导航机制 14.5.1位于 Managed Bean中的事件处理方法 1452基于导航规则的命令按钮 action 1453加入多个 ActionListener类 146JSF中的内置依赖注入 147JSF整合 Spring开发 33 1471简介 1472创建项目 jsfspring并修改Java类 147.3修改配置文件并在JSF中注入Bean 1474完全使用 Spring配置Bean 148JSF+JPA的 MyEclipse官方Bog实例 147小结 148参考资料 141前言 在第十二章的时候,我们讨论了 Struts2,也稍微提到了JsF。我们都知道Java的Web 开发日益面临着框架林立,开发工具笨拙,思路独特的限制。然而,Sun公司的工程师们希 望能把基于Swng的开发模式应用到web中去,让这些可怜的Java程序员不用了解什么 是HTML和HTTP也能工作。这很大程度上是因为微软的NETWebforr给人留下的深刻 印象,NET的程序员们不用像Java的Web程序员们那样,要学过一大堆的框架外加HTML, cSS和 JavaScript后才能工作,他们只需要用可视化的 Visual studio中的页面设计器,拖 放几个控件到页面上,设置下属性,编写以下事件处理代码,就搞定了。因此,Sun希望在 Java的世界里也能出现这样的技术和配套的IDE,因此很早的时候,就开始了JSF的研究, 而现在更是将它作为 Java ee5规范的一部分,所有要开发服务器的厂商都必须支持它 然而,好事多磨,因为Java世界的向心力总是不如微软那样强,大家各自打自己的算盘, 刘长炯著
MyEclipse 6 Java 开发中文教程 1 刘长炯著 第十四章 开发 JSF 应用 第十四章 开发JSF应用 ..................................................................................................... 1 14.1 前言................................................................................................................... 1 14.2 介绍................................................................................................................... 3 14.3 系统需求............................................................................................................ 3 14.4 快速入门............................................................................................................ 3 14.4.1 创建HelloJSF项目 ................................................................................... 4 14.4.2 创建消息包.............................................................................................. 6 14.4.3 创建受管Bean ......................................................................................... 7 14.4.4 创建JSP页面......................................................................................... 12 14.4.5 添加导航规则 ........................................................................................ 19 14.4.6 运行应用程序 ........................................................................................ 22 14.5 事件监听和导航机制......................................................................................... 23 14.5.1 位于Managed Bean中的事件处理方法.................................................. 23 14.5.2 基于导航规则的命令按钮action ............................................................. 27 14.5.3 加入多个ActionListener类 ..................................................................... 29 14.6 JSF中的内置依赖注入...................................................................................... 31 14.7 JSF整合Spring开发.......................................................................................... 33 14.7.1 简介....................................................................................................... 33 14.7.2 创建项目jsfspring并修改Java类 ............................................................ 34 14.7.3 修改配置文件并在JSF中注入Bean........................................................ 36 14.7.4 完全使用Spring配置Bean...................................................................... 40 14.8 JSF + JPA的MyEclipse 官方Blog实例............................................................. 41 14.7 小结................................................................................................................. 45 14.8 参考资料.......................................................................................................... 46 14.1 前言 在第十二章的时候,我们讨论了 Struts 2,也稍微提到了 JSF。我们都知道 Java 的 Web 开发日益面临着框架林立,开发工具笨拙,思路独特的限制。然而,Sun 公司的工程师们希 望能把基于 Swing 的开发模式应用到 Web 中去,让这些可怜的 Java 程序员不用了解什么 是 HTML 和 HTTP 也能工作。这很大程度上是因为微软的.NET WebForm 给人留下的深刻 印象,.NET的程序员们不用像Java的Web程序员们那样,要学过一大堆的框架外加HTML, CSS 和 JavaScript 后才能工作,他们只需要用可视化的 Visual Studio 中的页面设计器,拖 放几个控件到页面上,设置下属性,编写以下事件处理代码,就搞定了。因此,Sun 希望在 Java 的世界里也能出现这样的技术和配套的 IDE,因此很早的时候,就开始了 JSF 的研究, 而现在更是将它作为 Java EE 5 规范的一部分,所有要开发服务器的厂商都必须支持它。 然而,好事多磨,因为 Java 世界的向心力总是不如微软那样强,大家各自打自己的算盘
MyEclipse6Java开发中文教程 所以自从2004年3月第一个版本发布一来,很长一段时间内无人问津,更有很长时候成为 高手们批判的对象。所幸风水轮流转,经过了一阵混乱的开源热风后,程序员已经尝到了非 标准化和框架更新换代飞快,API和开发模式互不兼容的苦头,所以现在JSF又重新回到 了公众的视野,不过,现实是残酷的,因为不够成熟,它的支持率始终不是那么的高。原因 有:配置文件复杂,基于XML格式;开发工具不够智能化;组件不够丰富。然而,它毕竟 还是让人看到了统一化编程的方向,所以各大公司和开源组织不遗余力的探索和改进,目前 新的规范正在制定当中,也就是第三代Web框架:基于标注的后台模式和基于组件的前台 模式。 首先,JSF是一组规范和接口,不包含具体的实现类。就其规范内容来说,因为要涵盖 方方面面,所以里面的内容还是蛮复杂的。和Sun一贯的作风一样,它把JSF分成了两部 分:面向开发工具制造商的部分(提供JSF的底层实现,组件库,以及配套开发工具)和 面向开发人员的部分。虽然底层的实现各不相同,但是对于开发人员来说,标准的组件其用 法都是一样的,这样就允许厂商在自己的JSF实现中在保持AP不变的方式下进行性能等 的竞争。另一方面,不像其它的Web框架,JSF首次提出组件库的概念,它可以让厂商和 开发人员很容易的就对JSF进行扩展,而使用者却不需要关心底层的实现,它只需要按照 要求包含类库和标签库,就能工作了,这样也利于商业化。 在这里笔者不打算对JSF进行细致入微的介绍,我们只需要关注一下对开发人员带来 的东西就可以了。首先是概念上的转变,像Stus2一样,JSF要求开发人员不再考虑HTTP Request, Response这些东西,而把注意力转移到业务类和表示层上去。另外,第二个是 服务器端事件驱动的编程模式。例如:< button onc‖ick=" alert(hell)”>,点击按钮后会弹出 一个对话框,然而现在这些功能可以转移到服务器端来进行了,更重要的是页面的每一个组 件都可以这样来做,这是 Struts(包括 Struts2)里面所无法很轻松就能实现的,因为首先 您要保存页面的当前状态,然后判断点击的是哪个按钮,之后在根据这个按钮再触发对应的 处理方法,所幸的是这些功能JF都已经做好了(或者说是要求JSF的框架开发人员必须 实现这些)。读者不需要再去考虑表单提交之类的内容,它们都已经被封装好了。第三个改 变就是您可以使用可视化的设计器进行开发,就像NET的 Visual studio开发工具一样。像 读者期待的那样,可以在页面里面拖放一张数据库表格,直接对上面的数据进行编辑等等 更重要的是这些功能都是做好的,无须自己从头开始。而且,JSF目前也提供了大量支持 AJAX的组件和标签库。 在厂商的支持上,sF目前获得了大多数 Java e服务器厂商的支持,例如 Oracle BEA等等,还有国产的金蝶软件的 Apusic服务器;当然还有Sun自己的 GlassFish。开源 上,则为数众多,例如 ICEfaces, JBoss RichFaces, Apache MyFaces等等,最后,还有 国产的金蝶开源的 Apusic OperaMasks。开发工具上,则有众多的选择(大部分都是免费 的,并支持可视化的设计器),包括 Oracle JDeveloper, Bea Workshop, MyEclipse, Apusic Studio以及目前来说做的开源里面最优秀的 Netbeans IDE6。图141展示了 Netbeans中 正在进行可视化JSF开发的截屏。相比较而言, MyEclipse的JSF开发功能则相对较弱, 但是也足够我们使用的了。 2 刘长炯著
MyEclipse 6 Java 开发中文教程 2 刘长炯著 所以自从 2004 年 3 月第一个版本发布一来,很长一段时间内无人问津,更有很长时候成为 高手们批判的对象。所幸风水轮流转,经过了一阵混乱的开源热风后,程序员已经尝到了非 标准化和框架更新换代飞快,API 和开发模式互不兼容的苦头,所以现在 JSF 又重新回到 了公众的视野,不过,现实是残酷的,因为不够成熟,它的支持率始终不是那么的高。原因 有:配置文件复杂,基于 XML 格式;开发工具不够智能化;组件不够丰富。然而,它毕竟 还是让人看到了统一化编程的方向,所以各大公司和开源组织不遗余力的探索和改进,目前 新的规范正在制定当中,也就是第三代 Web 框架:基于标注的后台模式和基于组件的前台 模式。 首先,JSF 是一组规范和接口,不包含具体的实现类。就其规范内容来说,因为要涵盖 方方面面,所以里面的内容还是蛮复杂的。和 Sun 一贯的作风一样,它把 JSF 分成了两部 分:面向开发工具制造商的部分(提供 JSF 的底层实现,组件库,以及配套开发工具)和 面向开发人员的部分。虽然底层的实现各不相同,但是对于开发人员来说,标准的组件其用 法都是一样的,这样就允许厂商在自己的 JSF 实现中在保持 API 不变的方式下进行性能等 的竞争。另一方面,不像其它的 Web 框架,JSF 首次提出组件库的概念,它可以让厂商和 开发人员很容易的就对 JSF 进行扩展,而使用者却不需要关心底层的实现,它只需要按照 要求包含类库和标签库,就能工作了,这样也利于商业化。 在这里笔者不打算对 JSF 进行细致入微的介绍,我们只需要关注一下对开发人员带来 的东西就可以了。首先是概念上的转变,像 Struts 2 一样,JSF 要求开发人员不再考虑 HTTP, Request,Response 这些东西,而把注意力转移到业务类和表示层上去。另外,第二个是 服务器端事件驱动的编程模式。例如:<button onclick=”alert(‘hello’)”>,点击按钮后会弹出 一个对话框,然而现在这些功能可以转移到服务器端来进行了,更重要的是页面的每一个组 件都可以这样来做,这是 Struts(包括 Struts 2)里面所无法很轻松就能实现的,因为首先 您要保存页面的当前状态,然后判断点击的是哪个按钮,之后在根据这个按钮再触发对应的 处理方法,所幸的是这些功能 JSF 都已经做好了(或者说是要求 JSF 的框架开发人员必须 实现这些)。读者不需要再去考虑表单提交之类的内容,它们都已经被封装好了。第三个改 变就是您可以使用可视化的设计器进行开发,就像.NET 的 Visual Studio 开发工具一样。像 读者期待的那样,可以在页面里面拖放一张数据库表格,直接对上面的数据进行编辑等等, 更重要的是这些功能都是做好的,无须自己从头开始。而且,JSF 目前也提供了大量支持 AJAX 的组件和标签库。 在厂商的支持上,JSF 目前获得了大多数 Java EE 服务器厂商的支持,例如 Oracle, BEA 等等,还有国产的金蝶软件的 Apusic 服务器;当然还有 Sun 自己的 GlassFish。开源 上,则为数众多,例如 ICEfaces,JBoss RichFaces,Apache MyFaces 等等,最后,还有 国产的金蝶开源的 Apusic OperaMasks。开发工具上,则有众多的选择(大部分都是免费 的,并支持可视化的设计器),包括 Oracle JDeveloper,Bea Workshop,MyEclipse,Apusic Studio 以及目前来说做的开源里面最优秀的 Netbeans IDE 6。图 14.1 展示了 Netbeans 中 正在进行可视化 JSF 开发的截屏。相比较而言,MyEclipse 的 JSF 开发功能则相对较弱, 但是也足够我们使用的了
MyEclipse6Java开发中文教程 口区 文件()(E图(导抗N源(5)重构A生成(日)运行()分析P)版本控制D工只①空二(帮动 臼国号3自D鄙·① 「项目和x立件 条 Pagel *success x navig,回组佳面版 3-O WebApplicationl ab页 设计JPJ副母回任意大小 标签 +-O NETA-IITF A静态文本 4-D VEB-IIF 文本字段 。P1.jg 回文本区域 success. Jsp 按钮 中配置文件 请注册 ●超级链接 a NAITIFESINF 当 cont ext.xnl 器图像超级链接 config, xnl butt1:注册-导航 m1:注間一 用户名 style p。st1 bodyl 白日 Form 因 staticfert1:用户名 t textField 主因 a staticText2:地址 +-xtertField2 sbed口回 巴btan注册 图141可视化开发JSF的 Netbeans6 面对这么多的JSF框架,开发人员又该如何抉择呢?建议读者要学习JSF的话,尽量 选择Sun公司的JSF参考实现,这样是比较规范和标准的。然而,这些JSF框架各具特色 例如有的尤其擅长AJAX功能,读者可以自己根据实际情况进行抉择 142介绍 由于JSF框架的目前市场占有率并不是特别的高,因此在本章呢,也不打算特别深入 和全面的对其进行介绍。读者如有兴趣可以查看本章末尾的参考资料一章来获取更多信息。 我们主要来做个非常简单的登录应用,来展示基本的开发过程。读者很快就可以发现后台 类的开发和 Struts2有很相似的地方。实际上,JSF和我们以前介绍的 Struts1和 Struts2 都有很多相似的概念。当然,读者可以完全在没有接触过 Struts的情况下学习JSF 143系统需求 我们的第一个练习只需要MyEc|ipse6.0+ Tomcat就可以了,或者其它的Web服务 器也可以 后面的部分需要 My Eclipse Derby数据库。 144快速入门 本节我们将会做一个非常简易的登录示例应用 刘长炯著
MyEclipse 6 Java 开发中文教程 3 刘长炯著 图 14.1 可视化开发 JSF 的 Netbeans 6 面对这么多的 JSF 框架,开发人员又该如何抉择呢?建议读者要学习 JSF 的话,尽量 选择 Sun 公司的 JSF 参考实现,这样是比较规范和标准的。然而,这些 JSF 框架各具特色, 例如有的尤其擅长 AJAX 功能,读者可以自己根据实际情况进行抉择。 14.2 介绍 由于 JSF 框架的目前市场占有率并不是特别的高,因此在本章呢,也不打算特别深入 和全面的对其进行介绍。读者如有兴趣可以查看本章末尾的参考资料一章来获取更多信息。 我们主要来做一个非常简单的登录应用,来展示基本的开发过程。读者很快就可以发现后台 类的开发和 Struts 2 有很相似的地方。实际上,JSF 和我们以前介绍的 Struts 1 和 Struts 2 都有很多相似的概念。当然,读者可以完全在没有接触过 Struts 的情况下学习 JSF。 14.3 系统需求 我们的第一个练习只需要 MyEclipse 6.0 + Tomcat 就可以了,或者其它的 Web 服务 器也可以。 后面的部分需要 MyEclipse Derby 数据库。 14.4 快速入门 本节我们将会做一个非常简易的登录示例应用
MyEclipse6Java开发中文教程 1441创建 HelloJSF项目 我们需要在 MyEclipse中创建一个新的Web项目,并向它添加必要的Sus2类库 和配置文件。现在我们来创建一个名为 HelloS的Web项目。选择菜单File>New>Web Project,可以启动创建Web项目的向导,如图83所示。在弹出的对话框的 Project Name 中输入 HelloS,然后选中J2 EE Specification Leve下面的 Java ee50单选钮,最后 点击 Finish按钮就可以创建好这个Web项目了。 注意:因为开发JSF程序的时候流行和JSTL类库搭配,所以在项目创建时如果您选 中的是J2EE14,建议您选中复选框 Add jstl libraries to web-infdlib folder?,并选 中JSTL11单选钮。当然,您也可以在以后再来添加JSTL类库,通过选择菜单项 My Eclipse Project Capabilities Add JSTL Libraries .*EEX Web项目创建完毕后,我们需要给它添加JsF功能。这个操作可以通过在 Package Explorer视图的项目根节点上右键点击,选择弹出菜单中的 My Eclipse> Add jsF Capability:也可以通过选择菜单 MyEclipse> Proiect Capabilities Add JSF Capabilities….来启动 Add JSF Capabilities向导,如图142所示。JSF对话框的默认 值一般来说不需要修改就可以使用,不过您熟悉的话也可以通过修改对话框里面的默认值来 改变配置。图中默认的JSF实现是 Java ee50Sun公司的版本,不支持 Facelets。对话 框中的 JsF config path指定了JSF配置文件的位置,v而 Faces servlet name则指定了 JSF的核心 Servlet的名字, URL pattern制定了 JSF Servlet的默认监听的URL类型的名 字为‘ faces,这些值都可以加以修改。如果选中了复选框 Add JSF Facelets support,那 么就可以点击Next按钮进入下一页设置 Facelets Add JSF Capabilities Javaserver Faces Support for My Eclipse Web Project Enable project for JavaServer Faces development Heb-root folder JSF specification level: 1.2 (for Java EE 5.0 projects) JSF Implenentation: JS? implementati on included with JEE 5 AppServer JSF config path VYEB-INF/facer-config,xml Faces servlet name: aces Servlet URL Pattern: v Copy JSF TLDs into project View and edit libraries DAdd JSF Facelets support (Facelets is not supported for Sun JSF Reference Inplenentati on 1.1) K Back Hext> Finish Cancel 142添加JSF功能向导对话框 刘长炯著
MyEclipse 6 Java 开发中文教程 4 刘长炯著 14.4.1 创建 HelloJSF 项目 我们需要在 MyEclipse 中创建一个新的 Web 项目,并向它添加必要的 Struts 2 类库 和配置文件。现在我们来创建一个名为 HelloJSF 的 Web 项目。选择菜单 File > New > Web Project,可以启动创建 Web 项目的向导,如图 8.3 所示。在弹出的对话框的 Project Name 中输入 HelloJSF,然后选中 J2EE Specification Level 下面的 Java EE 5.0 单选钮,最后 点击 Finish 按钮就可以创建好这个 Web 项目了。 注意:因为开发 JSF 程序的时候流行和 JSTL 类库搭配,所以在项目创建时如果您选 中的是 J2EE 1.4,建议您选中复选框 Add JSTL libraries to WEB-INF/lib folder?,并选 中 JSTL1.1 单选钮。当然,您也可以在以后再来添加 JSTL 类库,通过选择菜单项 MyEclipse > Project Capabilities > Add JSTL Libraries...来完成。 Web 项目创建完毕后,我们需要给它添加 JSF 功能。这个操作可以通过在 Package Explorer 视图的项目根节点上右键点击,选择弹出菜单中的 MyEclipse > Add JSF Capabilities;也可以通过选择菜单 MyEclipse > Project Capabilities > Add JSF Capabilities ... 来启动 Add JSF Capabilities 向导,如图 14.2 所示。JSF 对话框的默认 值一般来说不需要修改就可以使用,不过您熟悉的话也可以通过修改对话框里面的默认值来 改变配置。图中默认的 JSF 实现是 Java EE 5.0 Sun 公司的版本,不支持 Facelets。对话 框中的 JSF config path 指定了 JSF 配置文件的位置,而 Faces servlet name 则指定了 JSF 的核心 Servlet 的名字,URL pattern 制定了 JSF Servlet 的默认监听的 URL 类型的名 字为*.faces,这些值都可以加以修改。如果选中了复选框 Add JSF Facelets support,那 么就可以点击 Next 按钮进入下一页设置 Facelets。 14.2 添加 JSF 功能向导对话框
MyEclipse6Java开发中文教程 3 JSF类库 当向导结束后,可以看到项目的目录结构将如图143 所示。其中的两个jar是JSF的类库,读者完全可以替换 熟 JRE System Li bray [My成其它类型的JsF实现,例如 MyFaces,而不必修改 EA Java EE 5 Libraries ava web. xm/中的 Servlet定义。 faces-con1gxm则是JSF的 jsf-impl-rDt。核心配置文件,这和Sus等其它框架是相似的,都有核 jsf-api.ja」、a3心的配置文件。 5t1-1.2.ja-D:小a在这时候,空白的 faces-config xm的内容如下: 日多 WebRoot <?xml version=1.0 ding=UTF-8?> +-C META-INF 白②WEB-IF <faces-config JsfEexmlns="http://java.suncom/xml/ns/javaee Gfaces-config.xm1xmlns:xsi="http://www.w3.org/2001/xmische X ma-lnstance T index. jsp xsischemalocation="http://javacsun.com/x 图143添加完JSF功能的项m1/ns/ Javaee 目目录结构 http://java.suncom/xm1/ns/gavaee/web-fac msconfig 1 2. xsd" version=1.2> </faces-config 。 web . xm的代码清单如下所示: <web-appxmlns="http://iava.suncom/xmi/ns/iavaee xmlns:xsi=http://www.w3.org/2001/xmlschema-instance"version=2.5 xsischemalocation=http://java.sun.com/xm1/ns/javaee http://java.suncom/xml/ns/javaee/web-app25.xsd"> <param-name>javax. faces. CONFIG FILES</param-name> Ne/fa fig xml</param-va </context-paral <servlet> <servlet -name>Faces Servlet</servlet-name> <servletfclass>javax. faces.webapp. Faces servlet</servlet-class> <load-onAstartup>0</load-on-startup> <servlet <servlet-name >Faces Servlet</servlet-name> aces</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index. jsp</welcome -file> </welcome -file-list> </web-app> javax. faces. CONFIG_FLES这个变量的取值指定了JSF的配置文件的位置所在,读 者可以根据自己的需要进行修改 刘长炯著
MyEclipse 6 Java 开发中文教程 5 刘长炯著 图 14.3 添加完 JSF 功能的项 目目录结构 当向导结束后,可以看到项目的目录结构将如图 14.3 所示。其中的两个 jar 是 JSF 的类库,读者完全可以替换 成其它类型的 JSF 实现,例如 MyFaces,而不必修改 web.xml 中的 Servlet 定义。faces-config.xml 则是 JSF 的 核心配置文件,这和 Struts 等其它框架是相似的,都有核 心的配置文件。 在这时候,空白的 faces-config.xml 的内容如下: <?xml version='1.0' encoding='UTF-8'?> <faces-config xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSche ma-instance" xsi:schemaLocation="http://java.sun.com/x ml/ns/javaee http://java.sun.com/xml/ns/javaee/web-fac esconfig_1_2.xsd" version="1.2"> </faces-config> 。web.xml 的代码清单如下所示: <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <context-param> <param-name>javax.faces.CONFIG_FILES</param-name> <param-value>/WEB-INF/faces-config.xml</param-value> </context-param> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.faces</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app> 。javax.faces.CONFIG_FILES 这个变量的取值指定了 JSF 的配置文件的位置所在,读 者可以根据自己的需要进行修改