Skip to content

1. 简介

该文档的PDF版本可在此处获取 |HERE|。

文档中的示例可通过 |HERE| 获取。

本文旨在通过实例介绍 Struts 2 的重要概念。Struts 2 是一个 Web 框架,它提供:

  • 若干以 JAR 形式提供的库
  • 一个开发框架:Struts 2 影响着 Web 应用程序的开发方式。

理解这些示例所需的先决条件如下:

  • Java语言的基础知识
  • Web开发的基础知识,特别是HTML语言。

在 [http://developpez.com] 网站上可以找到满足这些先决条件所需的所有资源。其中部分资源由我编写,可在 [https://stahe.github.io] 网站上找到。

本文档中的示例可通过网址 |HERE| 获取。

若需深入了解 Struts 2,可参考以下资料:

  • [ref1]:Struts 2 官网上的官方文档
  • [ref2]:由 Donald Brown、Chad Michael Davis 和 Scott Stanlick 合著、Manning 出版社出版的《Struts 2 in Action》一书。该书具有极强的教学价值。

我们有时会引用 [ref2],以提示读者可通过该书深入了解相关领域。

本文的编写方式使得读者即使没有电脑在手也能阅读。因此,文中提供了大量屏幕截图。

1.1. Struts 2在Web应用中的定位

首先,让我们明确 Struts 2 在 Web 应用程序开发中的定位。通常,这类应用程序会基于如下所示的多层架构构建:

  • [web]层是与Web应用程序用户直接交互的层。用户通过浏览器显示的网页与Web应用程序进行交互。Struts 2就位于这一层,且仅位于这一层
  • [metier]层实现应用程序的管理规则,例如工资计算或发票生成。该层通过[web]层使用来自用户的数据,并通过[dao]层使用来自数据库管理系统(DBMS)的数据。
  • [dao]层(数据访问对象)、[jpa]层(Java持久化API)以及JDBC驱动程序负责管理对DBMS数据的访问。 [jpa]层充当ORM(对象关系映射器)。它在[dao]层操作的对象与关系型数据库数据的行和列之间架起桥梁。
  • 各层的集成可通过 Spring 容器或 EJB3(企业级 Java Bean)实现。

下文中给出的多数示例仅使用一个层,即 [web] 层:

不过,本文最后将介绍如何构建一个多层Web应用程序:

[metier]、[dao]、[jpa/hibernate]这几层将以 jar 压缩包的形式提供给我们,因此我们只需构建 [web] 这一层。

1.2. Struts 2 的 MVC 开发模型

Struts 2 通过以下方式实现了所谓的 MVC 架构模式(模型 – 视图 – 控制器):

客户端请求的处理流程如下:

请求的 URL 格式为 http://machine:port/contexte/rep1/rep2/.../Action.路径 [/rep1/rep2/.../Action] 必须与 Struts 2 配置文件中定义的某个操作(action)相对应,否则将被拒绝。操作在 XML 文件中以如下形式定义:

1
2
3
4
5
6
<package name="actions" namespace="/actions" extends="struts-default">
    <action name="Action1" class="actions.Action1">
      <result name="page1">/vues/Page1.jsp</result>
      <result name="page2">/vues/Page2.jsp</result>
    </action>
</package>

以上例为例,假设请求的 URL 为 [ http://machine:port/contexte/actions/Action1]。此时将执行以下步骤:

  1. 请求 - 浏览器客户端向控制器 [FilterDispatcher] 发起请求。该控制器处理所有客户端请求,是应用程序的入口点,即 MVC 中的 C
  2. 处理
  • 控制器 C 查询其配置文件,发现存在操作 actions/Action1namespace(第 1 行)与操作名称(第 2 行的 name 属性)拼接后,定义了操作 actions/Action1
  • 控制器 C 实例化了 [2a],这是一个类型为 [actions.Action1] 的类(第 2 行的 class 属性)。该类的名称和包名可以是任意值。
  • 如果请求的 URL 附带了 [param1=val1&param2=val2&...] 类型的参数,则 C 控制器将这些参数分配给 [actions.Action1] 类,方式如下:
[actions.Action1].setParami(valeuri) ;

因此,类 [actions.Action1] 必须针对每个预期的参数 parami 都提供相应的 setParami 方法。

  • 控制器 C 请求类 [actions.Action1] 中的签名方法 [String execute()] 执行。该方法随后可以利用该类已获取的参数 parami。 在处理用户请求时,它可能需要 [metier] 和 [2b] 层。一旦处理完客户端的请求,该方法可以调用各种响应。一个典型的例子是:
  • 如果请求无法正确处理,则显示错误页面
  • 否则返回确认页面

方法 execute 向控制器 C 返回一个字符串类型的结果,称为导航键。在上例中,即 [actions.Action1]。execute 可能生成两个导航键:“page1”(第 3 行)和“page2”(第 4 行)。方法 [actions.Action1]execute 方法还将更新模板 M [2c],该模板将由页面 JSP 使用,并作为响应发送给用户。该模板可能包含以下元素:

  • 在用户会话中实例化的 [actions.Action1] 类
  • 用户会话
  • 应用程序作用域数据
  • ...
  1. 响应——控制器 C 请求显示与导航键对应的页面 JSP [3]。这是视图,即 MVC 中的 V。 页面 JSP 使用 M 模型来初始化其需发送给客户端的响应中的动态部分。

现在,让我们明确 MVC 网页架构与分层架构之间的关系。实际上,这是两个不同的概念,有时会被混淆。以一个单层的 Struts 2 Web 应用程序为例:

如果我们使用 Struts 2 实现 [web] 层,虽然确实形成了 MVC 架构,但这并非多层架构。 在此,[web]层将包揽一切:展示、业务逻辑、数据访问。而在Struts 2中,这些工作将由[Action]类型的类来完成。

现在,让我们来看一个多层Web架构:

[web]层可以在不使用框架且不遵循MVC模型的情况下实现。这样虽然确实形成了一个多层架构,但Web层并未实现MVC模型。

在 MVC 中,我们提到模型 M 即视图 V 的模型,即 c.a.d,即视图 V 所显示的所有数据。有时(通常),会给出 MVC 模型 M 的另一种定义:

许多作者认为,位于 [web] 层右侧的部分构成了 MVC 的 M 模型。为避免歧义,我们可以这样表述:

  • 域模型(指 [présentation] 层右侧的所有内容)
  • 指视图V所显示的数据时,称为视图模型

下文中,“M模型”一词将专指视图V的模型。

1.3. 使用的工具

下文将使用(2011年12月)

  • NetBeans 7.01(可通过网址 [http://www.netbeans.org] 获取)
  • 适用于 NetBeans 7.01 的 Struts 2 插件,可通过以下网址获取:[http://plugins.netbeans.org/plugin/39218]
  • Struts 2 2.2.3 版本,可从网址 [http://struts.apache.org/] 获取

请注意,仅需从链接 [http://struts.apache.org/] 获取的 Struts 2 库,即可开发后续示例。 NetBeans 可以替换为其他开发环境(如 Eclipse、JDeveloper、IntelliJ 等),而 Struts 2 插件仅用于简化开发工作,并非必需。

1.3.1. IDE NetBeans

在 NetBeans 下载页面上,我们选择 Java 版本:

Image

1.3.2. Struts 2 插件

根据 NetBeans 的不同版本,该插件并非一直可用。2011 年 12 月,可在 [http://plugins.netbeans.org] 该网址找到它。该网址列出了 NetBeans 可用的各种插件,用户可以筛选所需内容。 在 [1] 中,我们查询名称中包含“struts”一词的插件。

  • 点击链接 [2]

下载插件并解压 [2]。要将其集成到 NetBeans 中,可按以下步骤操作:

  • 启动 NetBeans
  • 在 [1] 中,选择“工具/插件”菜单
  • 在“[2]”选项卡中,点击“[3]”按钮
  • 在 [4] 中,选择已下载插件的 .nbm 文件。此处,我们选择 Struts 2.2.3 版本的库,而非 Struts 2.0.14 版本
  • 返回 [2] 选项卡,点击 [5] 按钮安装所选插件。

安装插件通常需要重启 NetBeans。

1.3.3. Struts 2 库

如果已下载了适用于 NetBeans 的 Struts 2 插件,则已拥有 Struts 的主要库,但并非全部。接下来,我们将需要 Struts 2 网站上提供的某些库 [http://struts.apache.org/]。

我们依次点击链接 [1] 和 [2],下载 2.2.3.1 版本的压缩包。 解压发行版后,Struts所需的库位于发行版中的 [lib] [3] 文件夹内。其中包含数十个库,因此需要确定哪些是必不可少的。此时,Struts 插件将提供帮助。