1. 前言 这个文档基于下列环境编写: Sun JDK 1.5.0, Eclipse 3.1 和 MyEclipse 4.0。如果你注意到这个文档和你正在操作的Eclipse/MyEclipse的版本不一致, 在使用这个向导时遇到困难或者无法根据向导进行操作, 请参考 用户反馈 部分来了解如何汇报这个问题。 2. 介绍 在这个教程中我们将使用MyEclipse Enterprise Workbench来开发一个小小的
JSF 示例程序。不需要您对关于JSF 和 MyEclipse的相关知识有所了解, 不过如果有所了解的话会更好。 因为Struts 是一个非常流行的 web 应用框架, 所以JSF 和 Struts之间的相似点我们适当的提示您注意, 来帮助哪些有过 Struts 开发经验的读者。然而, 如果你以前对 Struts 一无所知, 你完全可以很自在的忽略这些内容。
3. 系统需求 下面是这个指南所使用的软件的列表: JDK 1.4+ (Sun 或者 IBM)
Eclipse 3.1 SDK
MyEclipse 4.1
Tomcat 5.x (首选5.5.9, 或者其它符合标准的 Servlet/EJB 容器) 对这个简单的例子, 用户名是“myeclipse” , 密码也是“myeclipse”。
注意: 在安装过 JDK 并且重启你的计算机后, 请确保首先安装 Eclipse 然后是 MyEclipse, 最后安装 Tomcat。所有这些软件安装完毕后, 请确保在 MyEclipse 中设置对应的Tomcat 5 服务器设置;请使用正确的Tomcat Home 目录和你刚刚安装好的那个可用的 JDK. 如果你不知道如何在 MyEclipse 中设置 Tomcat, 你可以参考 使用应用服务器 快速入门向导。4. 设置新项目和目录结构 为了组织我们的开发过程, 我们需要在 MyEclipse 中创建一个新的 Web 模块并向它添加 JSF 功能(JSF Capabilities)模块. 你可以通过向导来创建一个web项目, 请通过选择菜单项File > New > Other > Project > J2EE > Web Project 来打开, 如下图 4.1所示。
图:新建项目
图:输入项目名称
这个向导可以让你自定义项目的设置, 通过在对话框的输入框里输入一些值来自定义, 如图4.2所示。 注意: 因为开发 JSF 程序的时候流行和JSTL类库搭配, 所以在项目创建时建议您选择“JSTL Libraries”。 然而, 您也可以在以后再来添加 JSTL 类库, 通过选择 MyEclipse 菜单的“Add JSTL Libraries”菜单项来完成。 一旦Web项目创建了, 我们需要给它添加JSF功能. 这个操作可以通过Package Explorer 视图的项目根节点上右键点击, 选择弹出菜单中的 MyEclipse > Add JSF Capabilities, 如图4.3 所示。
图:选择弹出菜单中的 MyEclipse > Add JSF Capabilities
JSF 对话框的默认值对这个教程来说不需要修改就可以使用. 高手们也可以通过修改对话框里面的默认值来改变配置, 如图 4.4 所示。
图:点击完成
这个向导结束后, 项目的目录结构将会如下图 4.5所示.
图:JSF config
现在项目已经创建, 我们可以开始修改并创建我们自己的应用相关的代码了。
5. 创建消息包 让我们来通过创建一个MessageBundle文件正式开始我们的应用。这是一个简单的属性文件, 它将保存所有的消息字符串以及相关的主键。然后这个消息包可以用在我们的任何JSP文件中来让我们的应用很容易的支持国际化语言。作为类比, Struts 在这个领域提供了相似的支持, 通过使用ApplicationResources.properties 文件, 以及不同的 标签, 以及bean标签所允许的消息包属性来完成这套功能。 在 JSF里面, 我们可以在JSP页面里加入一行代码来加载消息包: 注意:这一行代码创建了一个生命周期为页面的消息包, 这个包可以稍后在页面中通过变量名'bundle'来进行引用, 可以用来查找消息主键, 然后返回对应的消息值。 在创建消息包文件的时候, 先在源代码目录创建包 com.jsfdemo, 通过右键点击源代码目录, 然后选择弹出的菜单中的New > Package即可完成. 要创建消息包文件, 我们使用新建文件向导, 右键点击项目的’src’目录, 在弹出的菜单中选择New > File , 如下图所示。
图:在弹出的菜单中选择New > File
当指定新建文件的保存位置时, 选择 Browse..., 选中目录 /JSFLoginDemo/src/com/jsfdemo, 将文件命名为 MessageBundle.properties, 然后选择 Finish。 新建消息包文件成功后,我们需要为每个在JSP里面需要显示的标签或者字符串以键值对的方式添加到属性文件中。复制图5.2中的内容到你的消息包文件然后保存它: MessageBundle.properties user_name_label=User Name:
user_password_label=Password:
login_button_label=Login
图:打开faces-config.xml
现在我们的 MessageBundle 创建完毕了, 接下来我们要创建受管Bean(ManagedBean), 它将处理我们的用户登录操作。
6. 创建受管Bean 在这一部分我们将会看到如何创建ManagedBean, 这个Bean将会执行登录JSP页面所提示的登录操作, 以及保存用户输入的用户名和密码。出于演示的目的,我们的登录操作知识简单的检查用户名和密码是不是都是“myeclipse”, 然后将用户重新指引到userLoginSuccess.jsp 页面。否则它会返回到登录页面。 首先使用MyEclipse JSF Editor打开文件faces-config.xml:
图:点击下拉箭头
在 MyEclipse 4.0 中 faces-config.xml 编辑器已经比以前的版本有所增强, 你不仅可以创建和管理应用程序流程(浏览规则 Navigation Cases), 还可以通过大纲(Outline)视图来创建/修改并管理所有资源。你可以点击大纲视图右上角的下箭头按钮来添加新的bean, 如图6.2:
图:输入名字等信息
现在你会看到新建Managed Bean 向导对话框;请按照下面的图6.3和6.4所示来输入值:
图:新建Managed Bean 向导对话框
图:注意新的UserBean
你现在会注意到新的 UserBean 被添加到 Outline 视图, 如图 6.5 所示:
图:新的 UserBean 被添加到 Outline 视图
同时新建的UserBean.java 源文件也在 Java 编辑器中打开了:
图:新建的UserBean.java 源文件也在 Java 编辑器中打开了
注意我们的两个属性(username 和 password)的getters 和 setters 方法已经自动生成了, 所以对这个类唯一需要做的就是添加并实现loginUser 方法, 这个方法将会在用户登录时调用. 下面的图6.7显示了loginUser方法的代码片断. 请将这个代码复制粘贴到你自己的文件里, 并添加必要的新的类的import语句: UserBean.java public String loginUser() {
if("myeclipse".equals(getUserName()) && "myeclipse".equals(getPassword()))
return "success"; FacesContext facesContext = FacesContext.getCurrentInstance();
FacesMessage facesMessage = new FacesMessage(
"You have entered an invalid user name and/or password");
facesContext.addMessage("loginForm", facesMessage); return "failure";
}
图:新建的 UserBean.java文件中的 loginUser 代码片断 仔细看看 bean 的代码, 我们可以注意到一些独特之处。例如, UserBean 类并没有继承或者实现绑定到 JSF 的任何类或者接口。它仅仅是一个简单的包含了额外的逻辑来执行有用的操作的 JavaBean。用 Struts 的术语来说, 它包含了Struts Form 和 Struts Action的所有功能, 方便的合并在一个类中。 另一个和 Struts 的不同之处是这些方法没有返回任何特殊的类, 例如ActionForward, 因为导航信息是在faces-config.xml部署描述符中通过配置完成的。而且, 在 第 8部分 我们将展示如何创建并配置这个描述。