如何使用 Easy Struts 插件
等级:中级
Nancy Chen Junhua (nancy_chenjunhua@yahoo.com)
软件顾问和开发者
2004 年 5 月
本文向您介绍了如何在 Eclipse IDE 中使用 Easy Struts 插件开发 Struts 应用程序。本文首先对 Easy Struts 及其安装配置步骤进行了简介,并通过一个循序渐进的例子介绍了如何构建一个基本的 Struts 应用程序。本文还介绍了增强 Struts 应用程序的各种方法,例如连接数据库,对应用程序进行模块化,内容的国际化和本地化,异常处理和创建自定义插件等等。最后,您将学习如何将自己的 Struts 应用程序部署到 Tomcat Web 服务器上。
由于 Easy Struts 插件可以管理所有的复杂配置文件,因此您可以将精力集中在程序逻辑的开发上。现在让我们先来看一下 Easy Struts 中可以帮助您构建一个完整的应用程序的 10 个功能:
Add Easy Struts support。向项目的 classpath 中添加所有必需的 Struts 库,并创建配置文件和默认的资源属性文件。
Easy Form。创建一个具有表单属性的 JSP 文件,以及一个具有表单属性的 getter 方法和 setter 方法的 Form bean,并向配置文件中添加一个 Form bean 的定义。
Easy Action。创建一个 Action 类,并向配置文件中添加一个操作映射的定义。
Easy Action associated with a form。创建一个具有表单属性的 JSP 文件,一个具有 getter 方法和 setter 方法的 Form bean 类,以及一个 Action 类;并向配置文件中添加一个 Form bean 的定义和一个操作映射的定义。
Easy Forward。创建局部转发和全局转发,它们定义了控制应该转向何处。
Easy Exception。处理异常。
Easy Message resources。创建资源属性文件,这对于内容的国际化和本地化特别重要。
Easy Plug-in。创建插件。
Easy Datasource。将应用程序连接到一个数据源上。
Easy Module。模块化应用程序。
在本文中,我们将介绍这 10 个功能中的 8 个(我们将不会介绍功能 2 和 3)。在开始开发 Struts 应用程序之前,您应该首先安装好所有必需的程序和插件,并要了解有关 Java 编程、HTML、JSP 脚本以及 XML 和 XSLT 的基本知识。
安装和配置准备
您需要安装 Eclipse 2.1、Struts 1.1、Tomcat Web 服务器和 Easy Struts,同时还要安装 Sysdeo Tomcat plug-ins for Eclipse、MySQL 数据库服务器以及 JDBC driver for MySQL。Eclipse 是一个 IDE 开发环境。Struts 1.1 提供了运行 Struts 应用程序所需要的库。Tomcat 是宿主应用程序的 Web 容器。Sysdeo Tomcat 插件可以让开发人员在 Eclipse 环境中启动或停止 Tomcat Web 服务器。JDBC driver for MySQL 可以将 JDBC 调用转换成 MySQL 所使用的网络协议。安装好这些软件之后,还需要为 Eclipse 配置两个插件。
安装
关于在哪里下载以下软件的链接,请参阅 参考资料 部分:
从 Eclipse 的 Web 站点上下载 Eclipse v2.1。您可以通过将其解压到任何一个选定的目录(这个目录在本文中称为 eclipse_home)中来安装它。
从 Apache 的 Web 站点上下载 Struts 1.1。您可以通过将其解压到任何一个选定的目录(这个目录在本文中称为 struts_home)来安装它。
从 Apache 的 Web 站点上下载 Tomcat Web 服务器。您可以通过将其解压到任何一个选定的目录(这个目录在本文中称为 tomcat_home)中来安装它。本文假设 Tomcat 的版本是 v4.1.18。
从 Sysdeo 的 Web 站点上下载最新的 Tomcat for Eclipse 插件。您可以通过将其解压到 eclipse_home/eclipse/plugins 目录中来安装它。本文假设 Tomcat for Eclipse 插件的版本是 v2.2。
从 SourceForge 上下载 Easy Struts for Eclipse 插件 v0.6.4。您可以通过将其解压到 eclipse_home/eclipse/plugins 目录中来安装它。
从 Sun 的 Web 站点上下载 J2SE SDK。您可以将其安装到任何一个选定的目录(这个目录在本文中称为 java_home)中。本文假设 J2SE SDK 的版本是 v1.4.2。
从 MySQL 的 Web 站点上下载 MySQL 数据库。您可以将其安装到任何一个选定的目录中。
从 MySQL 的 Web 站点上下载 JDBC driver for MySQL。您应该先解压下载的文件包,并将 mysql-connector-java-x.x.xx-stable/mysql-connector-java-x.x.xx-stable-bin.jar 拷贝到您的项目工作空间中。后面还需要回到这个步骤。本文假设 JDBC driver for MySQL 的版本是 v3.0。
配置
配置 Sysdeo Tomcat 插件
要配置 Sysdeo Tomcat 插件,执行以下步骤:
启动 Eclipse。
配置 Tomcat 插件。要实现这个功能,请单击“Window”菜单,然后选择“Preferences”菜单项,然后在弹出的菜单中选择“Tomcat”。然后执行以下步骤:
将“Tomcat version”设置成 Tomcat 的版本号。
将“Tomcat home”设置成 tomcat_home/jakarta-tomcat-4.1.18。
将“Perspective to switch when Tomcat is started”设置成 Java。
在“Tomcat”选项的子选项“JVM Settings” -> “Classpath”中,添加 Jar/Zip for tools.jar,该值应该是 java_home/lib/。这用于编译 JSP 文件。
为项目的 classpath 引用设置 classpath 变量 TOMCAT_HOME。要完成这一任务,请在与步骤 2 相同的弹出菜单中选择“Java”选项,然后选择“Classpath Variables”子选项,并添加一个新的变量“TOMCAT_HOME”,其路径是 tomcat_home/jakarta-tomcat-4.1.18。
确保“Tomcat”菜单和 3 个工具栏按钮可用。到现在为止,我们应该在 Java 视图中可以看到一个“Tomcat”菜单和 3 个 Tomcat 工具栏按钮(如图 1 所示)。如果您没有看到这些内容,回到“Window”菜单中,选择“Customize Perspective...”项,打开选项树,选中“Other”项并选中“Tomcat”子选项。
确保 Sysdeo Tomcat 插件可以正常工作。要验证这一点,请使用菜单或工具条来启动/停止 Tomcat。
图 1. Tomcat 工具栏按钮
配置 Easy Struts 插件
要配置 Easy Struts 插件,请参考 图 2 的内容,并执行以下步骤:
选择一个 Struts 版本。要完成这步操作,请单击“Window”菜单,选择“Preference”项,选择“Easy Struts”选项,并选择“Struts 1.1”选项卡。
添加 JARs。应该为 struts_home\jakarta-struts-1.1\lib 目录中的所有的 .jar 文件都添加“Add JARs”。
添加 TLDs。接下来,为 struts_home\ jakarta-struts-1.1\lib 目录中的所有 .tld 文件添加“Add TLDs”。
图 2. 配置 Easy Struts 插件
开发 Struts 应用程序
在本节中,我们将介绍使用 Easy Struts 插件构建 Struts 应用程序的基本步骤。首先,您将创建一个 Tomcat 项目。然后,您将添加 Easy Struts 对 Tomcat 项目的支持。接下来,您可以体验一下“Easy Action associated with a form”的功能。之后,您将对前一个步骤中自动生成的源代码进行必要的修改。再之后,您可以测试一下应用程序在 Tomcat Web 服务器上的运行情况。最后,您可以体验一下“Easy Forward”功能。
创建 Tomcat 项目
要创建一个 Tomcat 项目,回到“File”菜单,选择“New”项,并在子菜单中选择“Project”。然后执行以下步骤:
进入“Java”选项,选择“Tomcat Project”并单击“Next”(参见图 3)。
填上项目名,并单击“Next”(参见图 4)。
选中“Can update server.xml file”。系统会自动更新 Tomcat Web 服务器的 server.xml 文件。现在单击“Finish”就可以完成任务了(参见图 5)。
创建 Tomcat 项目的结果如 图 6 所示。
图 3. 创建 Tomcat 项目 - 步骤 1
图 4. 创建 Tomcat 项目 - 步骤 2
图 5. 创建 Tomcat 项目 - 步骤 3
图 6. 创建 Tomcat 项目 - 最终结果
添加 Easy Struts 支持
要添加 Easy Struts 对 Tomcat 项目的支持,执行以下两个步骤:
单击“New”工具栏按钮,在“Java”选项下面选择“Easy Struts”自选项,选择“Add Easy Struts support”并单击“Next”,转入下一个步骤(请参看 图 7 -- 在本文的后文中我们将这个视图称为 Easy Struts 功能视图)。
设置如 图 8 所示的配置。确保选中“Copy Struts binary”和“Copy Struts TLD”。
添加 Easy Struts 支持的结果如 图 9 所示。
图 7. Easy Struts 功能视图
在图 8 中:
通过请求容器转发它们到活动 servlet,URL 模式块告诉 Struts 处理所有匹配模式 *.do 的请求。 所有其他模式的请求都不是 Struts 处理的。
Default 应用程序资源将在 WEB-INF/classes/base package/ 目录中创建。
图 8. 添加 Easy Struts 支持
图 9. 添加 Easy Struts 支持 - 最终结果
图 7 显示了 Easy Struts 所提供的 10 个功能。我们已经看过了“Add Easy Struts Support”的功能。在本文的其余部分中,我们将介绍一下剩下的 7 个功能(“Easy Action” 和 “Easy Form”功能不介绍)。在本节的后续部分中,我们将使用“Easy Action associated with a form”功能和“Easy Forward”功能来构建一个简单却又完整的 Struts 应用程序。下一节将介绍“Easy Message resources”、“Easy Plug In”、“Easy Datasource”、“Easy Exception”和“Easy Module”功能。
使用 Easy Action Associated with a Form 功能
回到 Easy Struts 功能视图,选择“Easy Action associated with a form”,并执行以下步骤来配置表单:
在 Use case 中输入内容;Form 名和 Form 类型都会根据系统的 Use case 自动生成。您可以手工修改 Form 名和 Form 类型(参见 图 10)。
在 Form 属性部分中单击“Add”;使用如 图 11 所示的视图添加表单属性。例如,我们按照图中所示的一样视图添加一个文本输入域:该域名为“tel”,值为“tel”,类型为 int。我们将“tel”的初值设置为 0。在设置“Type”时,我们可以直接输入,也可以使用“Browse”功能来选择。对于“JSP input type”的设置,我们也是既可以直接输入,也可以从下拉列表中选择。Struts 系统会在 Form bean 类中为每个表单属性生成一对getter 方法和setter 方法。因此,对于一个选择列表来说,您应该只创建一个 <html:select> 即可,而不用创建所有的 <html:option>。
由于您正在开发一个 Web 应用程序,因此请选中前两个检查框。
单击“Next”继续。
图 10. 配置表单
注意
表单属性名不能以大写字母开头。否则,系统就会警告您在调用操作时找不到 getter 方法。
表单属性名不能重复。如果您真想使用两个相同的属性名,可以使用空格作为前缀或后缀来解决这个问题。
图 11. 关系的图形化表示
到现在为止,您应该会看到一些非常类似于 图 12 的内容。默认情况下,输入的值是“/form/owner.jsp”,这意味着 JSP 文件被放在“easyStruts/form”文件夹中。您可以手工修改 JSP 文件的位置,或者 preference 的设置。要修改 preference 的设置,进入“Window”菜单,选择“Preferences”,单击“Easy Struts”选项,选择“Style”选项卡,并将“JSP form location”设置为空。例如,在本文中,我们倾向于将这些 JSP 文件直接保存在 easyStruts (项目名)文件夹中。因此,请将其修改为“/owner.jsp”,如 图 12 所示。
图 12 中所显示的操作映射的属性如下:
Path。所提交请求的相对路径。路径名必须以“/”开头而且唯一。
Type。这个 ActionMapping 正在描述的 Action 类的名字。
Attribute。可以访问这个 Form bean 的请求范围或会话范围的属性名,条件是名字与这个 bean 指定的名字不同。
Scope。规定与这个映射相关的 Form bean 的值应该可以保存多少位。
input。规定如果碰到验证错误时控制流程应该返回到输入表单的相对路径。
Validate。如果这个属性被设置为 true,就会对与这个映射关联的表单调用 ActionForm.validate() 方法。
Parameter。可用于向由这个映射选择的 Action 传递其他信息。
图 12. 配置操作
单击“Next”,您应该可以看到类似于如 图 13 所示的内容。图 13 中所显示的是操作映射属性,如下:
Forward。指定要处理这个请求的 servlet 或 JSP 资源的相对路径。ActionMapping 可以使用 findForward() 将控制流程转换到这个 servlet 或 JSP 资源上。
Exception。与这个映射相关的 ExceptionHandlers。
此处的转发和异常都是本地的,稍后我们会讨论全局转发和全局异常。
图 13. 配置转发
局部转发属性:
name 是唯一的标识符,在操作映射的 findForward() 方法中可以用它来返回这个路径。
contextRelative 标签告诉 Struts 以下信息:
如果该值被设置为 true,那么路径就被认为是相对于整个 Web 应用的相对路径。
如果该值被设置为 false,那么路径就被认为是相对于一个模块化应用程序的这个模块的相对路径。
如果 redirect 为 true,那么控制流程就会被转到一个重定向的页中,而不是一个转发的页中。这意味着创建一个新请求。
在单击“Finish”之后(参见图 14),系统会在 easyStruts/WEB-INF/src/ 目录中生成 com.asprise.struts.form.OwnerForm.java 和 com.asprise.struts.action.OwnerAction.java。同时还会生成另外一个文件:easyStruts/owner.jsp。在接下来的几节中,您将对这三个文件进行一些修改,从而完成整个表单,添加用户输入的验证方法并处理验证错误。
图 14. 添加转发
修改 ActionForm 类
将 ActionForm.java 中的所有“Integer”修改为“int”,这是因为您刚才创建的表单属性“tel”的类型是 java.lang.Integer。然后编写 validate() 方法的代码,对用户输入的表单属性进行验证。validate() 方法的完整代码如 清单 1 所示。
ActionError(“error.noEmail”)中的“error.noEmail”是资源属性文件中定义的一个关键字,它等价于“<li><font color=red>Enter your email</font> ”。在资源属性文件中,可以使用 <html> 代码。ActionErrors 中 add(java.lang.String property, ActionError error) 方法的参数 property 是一个表单属性名。这个 ActionError 只能与一个指定的表单属性相关。例如,如果 email 地址为空,或者只包含空格字符,那么在对表单进行验证时就会显示“Enter your email”消息。如果在 email 地址中没有“@”字符,那么就会显示“Correct your email”消息,这是在资源属性文件中使用“error.wrongEmail”关键字定义的。这两个错误都只与表单属性“email”有关(参见清单 1)。我们稍后再回来介绍。
清单 1. OwnerForm.java
package com.asprise.struts.form;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionError;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
public class OwnerForm extends ActionForm {
private String email;
private String greet = "Mr.";
private String address;
private int tel = 0;
private String name;
public ActionErrors validate(
ActionMapping mapping,
HttpServletRequest request) {
ActionErrors errors = new ActionErrors();
if (greet == null || greet.trim().equals("")) {
errors.add("greet", new ActionError("error.greet"));
}
if (name == null || name.trim().equals("")) {
errors.add("name", new ActionError("error.name"));
}
if (address == null || address.trim().equals("")) {
errors.add("address", new ActionError("error.address"));
}
if (email == null || email.trim().equals("")) {
errors.add("email", new ActionError("error.noEmail"));
}
else if (email.indexOf("@")==-1) {
errors.add("email", new ActionError("error.wrongEmail"));
}
if (tel==0) {
errors.add("tel", new ActionError("error.tel"));
}
return errors;
}
...
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
...
}
在资源属性文件中可以使用 <html> 代码。资源属性文件的内容是一些键-值对(参见清单 2)。在源代码文件中可以调用这些关键字。在每个资源属性文件中系统都需要 errors.header 和 errors.footer 这两个关键字。
清单 2. ApplicationResources.properties
errors.header=<h4>Validation Error(s)</h4><ul>
errors.footer=</ul><hr>
error.greet=<li>Choose your greet
error.name=<li>Enter your name
error.address=<li>Enter your address
error.tel=<li>Enter your contact number
error.wrongEmail=<li>Correct your email
error.noEmail=<li>Enter your email
修改 Action 类
OwnerAction 类会在局部转发路径“success”中简单地显示一条诸如“Thank you, Miss Nancy Chen”之类的消息。请修改 OwenerAction 类的 execute() 方法来实现您的逻辑,(每个 action 类都必须实现 execute() 方法)。参见清单 3,它会将控制流程转向 success.jsp。
清单 3. OwnerAction.java
public class OwnerAction extends Action {
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws Exception {
OwnerForm ownerForm = (OwnerForm) form;
String greet = ownerForm.getGreet();
String name = ownerForm.getName();
request.setAttribute("name", name);
request.setAttribute("greet", greet);
// Forward control to the specified success target