1. 引言

Apache Struts 2 是一个基于MVC的企业级Java Web应用框架。它是原始Struts框架的完全重写,提供了开源API实现和丰富的功能集。

在这篇教程中,我们将对Struts2框架的核心组件进行初级介绍,并展示如何使用它们。

2. Struts 2框架概述

Struts 2 的一些特性包括:

  • 基于POJO(Plain Old Java Objects)的动作:POJO意味着它不属于任何类型层次结构,可以作为独立的类使用。
  • 插件支持REST、AJAX、Hibernate、Spring等
  • 约定优于配置:简化了配置过程。
  • 支持多种视图层技术
  • 易于性能分析和调试

2.1. Struts2的不同组件

Struts2是一个基于MVC的框架,所有Struts2应用都包含以下三个组件:

  1. 动作类(Action class):一个POJO类,用于实现业务逻辑。
  2. 控制器(Controller):在Struts2中,HTTP过滤器充当控制器,负责拦截和验证请求/响应。
  3. 视图(View):用于呈现处理后的数据,通常是JSP文件。

3. 设计我们的应用

现在让我们开始开发Web应用。这是一个用户选择特定汽车品牌后,会收到定制消息的应用。

3.1. Maven依赖

pom.xml中添加以下内容:

<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-core</artifactId>
    <version>2.5.10</version>
</dependency>
<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-junit-plugin</artifactId>
    <version>2.5.10</version>
</dependency>
<dependency>
    <groupId>org.apache.struts</groupId>
    <artifactId>struts2-convention-plugin</artifactId>
    <version>2.5.10</version>
</dependency>

您可以在这里找到最新版本的依赖。

3.2. 业务逻辑

创建一个动作类CarAction,它根据输入值返回一条消息。CarAction有两个字段:carName(用于存储用户输入)和carMessage(用于存储要显示的定制消息):

public class CarAction {

    private String carName;
    private String carMessage;
    private CarMessageService carMessageService = new CarMessageService();
    
    public String execute() {
        this.setCarMessage(this.carMessageService.getMessage(carName));
        return "success";
    }
    
    // getters and setters
}

CarAction类使用CarMessageService,该服务为特定的汽车品牌提供定制消息:

public class CarMessageService {

    public String getMessage(String carName) {
        if (carName.equalsIgnoreCase("ferrari")){
            return "Ferrari Fan!";
        }
        else if (carName.equalsIgnoreCase("bmw")){
            return "BMW Fan!";
        }
        else {
            return "please choose ferrari Or bmw";
        }
    }
}

3.3. 接受用户输入

添加一个JSP,这是我们应用的入口点。这是input.jsp文件的内容:

<body>
    <form method="get" action="/struts2/tutorial/car.action">
        <p>Welcome to Baeldung Struts 2 app</p>
        <p>Which car do you like !!</p>
        <p>Please choose ferrari or bmw</p>
        <select name="carName">
            <option value="Ferrari" label="ferrari" />
            <option value="BMW" label="bmw" />
         </select>
        <input type="submit" value="Enter!" />
    </form>
</body>

<form>标签指定了表单的提交动作(在我们的例子中,是向GET请求的HTTP URI发送请求)。

3.4. 控制器部分

StrutsPrepareAndExecuteFilter是控制器,它会拦截所有传入的请求。我们需要在web.xml中注册以下过滤器:

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>

<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

StrutsPrepareAndExecuteFilter会过滤每个传入的请求,因为我们指定了URL匹配通配符<url-pattern>/\*</url-pattern>

3.5. 配置应用程序

在动作类CarAction上添加以下注解:

@Namespace("/tutorial")
@Action("/car")
@Result(name = "success", location = "/result.jsp")

这些注解的逻辑如下:

  • @Namespace用于逻辑分离不同动作类的请求URI;我们需要在请求中包含这个值。
  • @Action指定了请求URI的实际终点,将命中我们的动作类。动作类会咨询CarMessageService并初始化另一个成员变量carMessage的值。当execute()方法返回一个值(如“success”)时,它会匹配这个值来调用result.jsp
  • @Result有两个参数。第一个参数name指定了动作类将返回的值,这来自动作类的execute()方法。这是默认执行的方法名。

第二个参数location告诉在execute()方法返回值后要引用的文件。在这里,当我们返回一个字符串值“success”时,我们将转发请求到result.jsp

同样的配置也可以通过提供XML配置文件来实现:

<struts>
    <package name="tutorial" extends="struts-default" namespace="/tutorial">
        <action name="car" class="com.baeldung.struts.CarAction" method="execute">
            <result name="success">/result.jsp</result>
        </action>
    </package>
</struts>

3.6. 视图

这是将用于向用户显示消息的result.jsp内容:

<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="s" uri="/struts-tags" %>
<body>
    <p> Hello Baeldung User </p>
    <p>You are a <s:property value="carMessage"/></p>
</body>

需要注意两点:

  • <%@ taglib prefix="s" uri="/struts-tags %>中,我们导入了struts-tags库。
  • <s:property value="carMessage" />中,我们使用struts-tags库来打印carMessage属性的值。

4. 运行应用程序

这个Web应用可以在任何Web容器中运行,例如Apache Tomcat。以下是实现步骤:

  1. 部署Web应用后,在浏览器中访问以下URL:http://www.localhost.com:8080/MyStrutsApp/input.jsp
  2. 选择两个选项之一并提交请求。
  3. 您将被转发到result.jsp页面,显示根据所选输入选项定制的消息。

5. 总结

在这篇教程中,我们逐步指导了如何创建第一个Struts2 Web应用。我们在Struts2领域涵盖了与MVC相关的各个方面,并展示了如何将它们组合起来进行开发。

如往常一样,这篇教程可在GitHub上找到,作为Maven项目。