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应用都包含以下三个组件:
- 动作类(Action class):一个POJO类,用于实现业务逻辑。
- 控制器(Controller):在Struts2中,HTTP过滤器充当控制器,负责拦截和验证请求/响应。
- 视图(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。以下是实现步骤:
- 部署Web应用后,在浏览器中访问以下URL:
http://www.localhost.com:8080/MyStrutsApp/input.jsp
- 选择两个选项之一并提交请求。
- 您将被转发到
result.jsp
页面,显示根据所选输入选项定制的消息。
5. 总结
在这篇教程中,我们逐步指导了如何创建第一个Struts2 Web应用。我们在Struts2领域涵盖了与MVC相关的各个方面,并展示了如何将它们组合起来进行开发。
如往常一样,这篇教程可在GitHub上找到,作为Maven项目。