简介:Struts2是一个用于构建MVC架构Java Web应用的框架,通过本示例我们将学习Struts2的入门使用和核心概念。示例内容包括配置Struts2环境、创建Action类、定义Action配置、创建视图页面以及运行应用程序。通过这些步骤,读者将理解如何构建一个简单的“HelloWorld”应用,并可进一步探索Struts2的高级特性,以优化开发流程。
1. Struts2框架介绍
什么是Struts2
Struts2是一个优雅的、可扩展的Web应用框架,它基于MVC设计模式,提供了一套完整的请求处理流程。在Java Web应用中,Struts2用以替代传统的Servlet/JSP模式,将业务逻辑、页面显示和用户输入进行分离,便于开发和维护。
Struts2框架特点
Struts2以其插件化设计、拦截器机制和OGNL(对象图导航语言)表达式的强大功能,成为Java Web开发者常用的选择。此外,Struts2支持多种视图技术,如JSP、FreeMarker、Velocity等,这让它能够与各种前端技术无缝配合。
Struts2与其他框架的比较
与Struts1和Spring MVC相比,Struts2在易用性和灵活性上有较大优势。Struts2利用拦截器进行请求处理,这种松耦合的方式不仅简化了代码,也降低了开发复杂度。同时,Struts2在处理文件上传、国际化等方面也有很好的支持,使得开发者能够更加专注于业务逻辑的实现,而不必过多关注底层细节。
2. Struts2基本结构
2.1 Struts2框架核心组件
2.1.1 Action类和ActionContext
Struts2框架的处理流程是从Action类开始的。Action类是Struts2框架中用于处理业务逻辑的组件,它通常继承自 ActionSupport
类。Action类中包含一个或多个执行业务逻辑的方法,通常是 execute()
方法。此外,还有一个非常重要的组件是 ActionContext
,它用于封装Action的上下文信息,比如请求参数、值栈(Value Stack)、会话(Session)信息等。
public class ExampleAction extends ActionSupport {
// ActionContext中可以存储各种对象
private ActionContext context;
public String execute() {
// 使用ActionContext获取值栈,操作数据
ValueStack stack = context.getValueStack();
// 从值栈中获取数据,或者将数据放入值栈等操作
// ...
return SUCCESS;
}
}
在上面的代码中, ExampleAction
类继承自 ActionSupport
,并重写了 execute()
方法。在执行过程中,可以通过 ActionContext
来访问和操作与当前Action相关的上下文数据。
2.1.2 Interceptor拦截器
Interceptor(拦截器)是Struts2框架中用于处理请求前后的拦截逻辑的组件。拦截器可以执行诸如验证、日志记录、权限检查等预处理和后处理任务。Struts2提供了一系列内置的拦截器,也可以由开发者自定义拦截器来满足特定需求。
拦截器的配置通常在 struts.xml
配置文件中完成,如下所示:
<action name="exampleAction" class="com.example.actions.ExampleAction">
<interceptor-ref name="defaultStack"/>
<interceptor-ref name="loggingOnlyStack"/>
<result name="success">/success.jsp</result>
</action>
其中, <interceptor-ref>
标签用于引用拦截器堆栈(Interceptor Stack)。一个堆栈可以包含多个拦截器,它们按照定义的顺序执行。例如, defaultStack
是Struts2框架提供的默认拦截器堆栈,它包含了许多常用的拦截器,如 params
(处理请求参数), conversionError
(处理类型转换错误)等。
2.2 Struts2的工作流程
2.2.1 请求处理流程分析
Struts2框架处理请求的过程可以分为以下几个主要步骤:
- 用户发送一个HTTP请求到服务器。
- 根据请求的URL,Struts2框架在
struts.xml
文件中查找对应的<action>
配置。 - 如果存在匹配的
<action>
配置,框架将创建对应的Action实例。 - 根据配置,Struts2框架将创建并执行一组拦截器,这些拦截器负责处理预处理和后处理任务。
- 最后,执行Action类的
execute()
方法(或者自定义的其他方法)。 - Action执行完毕后,返回一个结果字符串(比如
SUCCESS
或ERROR
),Struts2框架根据这个结果来决定跳转到哪个页面。
下面是一个简化的流程图,描述Struts2的请求处理流程:
graph LR
A[用户发送HTTP请求] --> B[查找对应的<action>配置]
B --> C[创建Action实例]
C --> D[执行拦截器堆栈]
D --> E[执行Action的execute方法]
E --> F[返回结果字符串]
F --> G[根据结果跳转]
2.2.2 结果处理机制
Struts2的结果处理机制是通过 <result>
标签定义的。每个 <result>
标签指定了在Action执行完毕后,根据返回的结果字符串跳转到相应的视图页面。视图页面通常是一个JSP文件,负责展示数据和接收用户输入。
<action name="exampleAction" class="com.example.actions.ExampleAction">
<result name="success">/success.jsp</result>
<result name="error">/error.jsp</result>
</action>
在上面的配置中,如果Action执行成功(返回 SUCCESS
),则用户将被重定向到 /success.jsp
页面。如果执行过程中出现错误(返回 ERROR
),则跳转到 /error.jsp
页面。
结果处理机制的灵活性在于可以定义多个结果,并且可以进行条件判断、动态结果选择等操作。此外,Struts2还支持动态结果,可以根据返回的结果字符串动态地解析出对应的JSP页面名或者直接返回一个数据模型。
public String execute() {
if (/* 条件 */) {
return "success";
} else {
return "error";
}
}
在Action类的 execute()
方法中,可以根据实际业务逻辑的需要返回不同的结果字符串,从而控制流程的跳转。
3. 配置Struts2环境
3.1 环境配置准备
配置Struts2环境是整个框架应用的基础。它确保Web应用能够在服务器上正常运行,同时提供必要的资源支持。
3.1.1 安装和配置Java开发环境
在开发Struts2应用之前,首先需要安装Java开发工具包(JDK),因为Struts2是基于Java语言的。以下是JDK的安装步骤:
- 访问Oracle官网或其他JDK提供商,下载适合当前操作系统的JDK版本。
- 运行下载的安装程序,并遵循安装向导完成安装。
- 配置环境变量:
-
JAVA_HOME
:指向JDK安装目录。 -
PATH
:添加JDK的bin目录路径,确保命令行工具如java
和javac
可以全局访问。 -
CLASSPATH
:设置为.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
。
Java环境配置完成后,通过在命令行输入 java -version
和 javac -version
验证是否安装成功。
3.1.2 安装和配置Web服务器
Struts2通常与Web容器一起使用,如Apache Tomcat或Jetty。此处以Tomcat为例进行说明:
- 从Apache Tomcat官网下载Tomcat服务器的压缩包。
- 解压缩到目标文件夹,例如
C:\Tomcat
。 - 配置环境变量
CATALINA_HOME
,指向Tomcat的根目录。 - 配置环境变量
PATH
,添加Tomcat的bin
目录到系统路径中。 - 启动Tomcat服务器,通常通过执行
CATALINA_HOME\bin\startup.bat
(Windows系统)。
通过访问 ***
检查Tomcat服务器是否启动成功。如果出现Tomcat的默认页面,说明Web服务器配置完成。
3.2 Struts2配置文件解析
配置文件是Struts2框架的核心部分,它包括了系统中所有的Struts2设置。
3.2.1 struts.xml配置文件结构
struts.xml
是Struts2框架的核心配置文件,它的结构通常包括以下几个部分:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"***">
<struts>
<constant name="struts.devMode" value="true" />
<package name="default" extends="struts-default" namespace="/">
<!-- Action配置 -->
</package>
</struts>
-
<struts>
标签 :这是整个配置文件的根节点。 -
<constant>
标签 :用于定义系统级别的常量,如开发模式、配置文件路径等。 -
<package>
标签 :用于将多个Action组织在一起,其中extends
属性指定了父包(通常是struts-default
),namespace
属性定义了包的命名空间。
3.2.2 常用配置项及作用
Struts2框架提供了许多配置项,用于调整框架的行为。以下是一些常用配置项:
-
结果类型(result-types) :
xml <struts> <result-types> <result-type name="dispatcher" class="org.apache.struts2.dispatcher.ServletDispatcherResult"/> </result-types> <!-- 其他配置 --> </struts>
result-types
定义了结果类型,例如dispatcher
用于转发到JSP页面,freemarker
用于使用FreeMarker模板。 -
拦截器(interceptors) :
xml <struts> <interceptors> <interceptor name="myInterceptor" class="com.example.MyInterceptor"/> </interceptors> <!-- 其他配置 --> </struts>
interceptors
标签用于定义自定义拦截器,可以用来扩展框架功能,如日志记录、数据校验等。 -
全局结果(global-results) :
xml <struts> <global-results> <result name="error">/error.jsp</result> </global-results> <!-- 其他配置 --> </struts>
global-results
标签定义全局结果,当Action返回特定的返回值时,系统会自动跳转到指定的结果页面。
以上配置项需要根据实际项目的需求进行设置,以确保框架能够以期望的方式运行。随着对Struts2框架的深入了解,开发者可以进一步扩展和优化这些配置项,以提高应用的性能和用户体验。
4. 创建Action类与方法
4.1 Action类编写规范
4.1.1 Action类的继承关系
在Struts2框架中,Action类扮演着模型(Model)和控制器(Controller)的角色。它通常是业务逻辑执行的地方,同时提供操作结果给视图层展示。一个标准的Action类需要继承自 ActionSupport
类, ActionSupport
是Struts2框架提供的一组默认实现,它为Action类提供了一些常用的默认行为和方法,比如国际化(I18N)支持、验证(Validation)和拦截器(Interceptor)链等。
public class MyAction extends ActionSupport {
// Action类的实现细节
}
继承 ActionSupport
类后,Action类可以使用框架提供的以下特性:
- 输入验证:通过
validate()
方法或注解进行输入数据的验证。 - 国际化支持:通过
getText()
方法来获取国际化消息。 - 文件上传:使用框架提供的方法处理文件上传功能。
4.1.2 execute方法的实现
Action类中最重要的方法是 execute
,当请求达到Struts2框架并成功匹配到相应的Action类时,框架会自动调用该方法执行业务逻辑,并根据返回值确定后续操作。
@Override
public String execute() {
// 执行业务逻辑
// 返回逻辑视图名称,决定下一个视图组件的渲染
return SUCCESS;
}
返回值是 execute
方法的一个重要组成部分,它通知Struts2框架下一步要执行的动作。常见的返回值包括 SUCCESS
、 ERROR
、 INPUT
等,每个返回值都对应配置文件中预定义的逻辑结果,Struts2根据这些逻辑结果来执行相应的页面跳转。
4.2 Action方法与业务逻辑
4.2.1 实现具体业务逻辑
Action类中的 execute
方法通常不直接编写业务逻辑代码,而是调用其他业务组件(Service层组件)来处理业务逻辑。这样的设计符合MVC模式,便于管理和维护。
@Override
public String execute() {
try {
// 调用服务层处理业务逻辑
userService.processUserLogin();
} catch (LoginException ex) {
// 处理异常情况
addActionMessage(ex.getMessage());
return INPUT;
}
return SUCCESS;
}
在上述代码中, userService.processUserLogin()
代表调用业务层处理用户登录逻辑。如果登录失败,通过 addActionMessage
方法记录错误信息,然后返回 INPUT
值,指示Struts2框架将请求转发回输入页面,同时错误信息将显示给用户。
4.2.2 数据封装与返回结果
Action类可以包含多个属性和它们的getter/setter方法,这些属性用于与前端页面进行数据的传输。在执行完业务逻辑后,Action类将包含业务数据或者处理结果。
private String username;
private String password;
private boolean isLoggedIn;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public boolean isIsLoggedIn() {
return isLoggedIn;
}
public void setIsLoggedIn(boolean isLoggedIn) {
this.isLoggedIn = isLoggedIn;
}
在上述代码段中,定义了三个属性: username
, password
和 isLoggedIn
。 isLoggedIn
代表用户登录状态,它可以被设置为 true
或者 false
,根据业务逻辑的执行结果。
使用OGNL(Object-Graph Navigation Language)表达式,Struts2可以自动将Action对象的属性绑定到JSP页面,这样JSP就可以直接访问这些属性值。当需要在页面中显示用户登录状态时,可以通过 ${isLoggedIn}
来获取 Action
类中的 isLoggedIn
属性值。
<c:if test="${isLoggedIn}">
<!-- 显示已登录用户信息 -->
</c:if>
在JSP页面中,可以使用 <c:if>
标签来根据用户登录状态显示不同的信息。如果 isLoggedIn
为 true
,则执行 <c:if>
标签内的内容,展示已登录用户的相关信息。这种数据绑定方式简化了数据的传递过程,使得前后端交互更加流畅。
5. 定义Action配置映射
在Web应用程序开发中,定义清晰的Action配置映射是构建易于维护和扩展的系统的关键步骤。Struts2框架通过其独特的配置方式,使得映射过程既灵活又直观。在本章中,我们将深入探讨如何配置Action映射,以及如何通过这些配置来实现参数传递。
5.1 配置Action映射
Action映射定义了用户请求和对应的Action类之间的映射关系。在Struts2框架中,这一映射通常是通过配置文件中的 <action>
标签实现的。
5.1.1 action标签的使用
<action>
标签用于指定一个Action的名字和它对应的类,以及当Action执行完毕后应该返回的视图页面或结果页面。
<action name="myAction" class="com.example.MyAction">
<result name="success">/success.jsp</result>
<result name="input">/input.jsp</result>
</action>
在这个例子中,当用户访问 myAction
时,Struts2会查找并执行 com.example.MyAction
类中的 execute
方法。根据方法返回的结果,Struts2会返回 success.jsp
或 input.jsp
页面。
5.1.2 result标签的配置
<result>
标签定义了Action执行后可能出现的结果与返回页面之间的映射关系。每个 <result>
标签可以包含一个 name
属性和页面路径。
<result name="success" type="redirect">/someOtherPage.jsp</result>
这里,当 execute
方法返回 success
字符串时,用户会通过重定向跳转到 /someOtherPage.jsp
页面。注意, type
属性允许我们指定返回结果的类型,如 redirect
表示使用HTTP重定向。
5.2 配置参数传递
在Web应用程序中,参数的传递通常用于在用户请求和服务器响应之间传递数据。在Struts2中,参数传递可以通过不同的方式实现,如 param
标签和OGNL表达式。
5.2.1 配置param标签
<param>
标签允许我们在 <action>
配置中直接传递参数给Action类,或者在 <result>
页面中传递数据给JSP页面。
<action name="myAction" class="com.example.MyAction">
<param name="myParam">value</param>
<result name="success">/success.jsp</result>
</action>
在这个例子中, myParam
参数会在 MyAction
类的 execute
方法中作为参数自动注入。
5.2.2 使用ognl表达式传递参数
OGNL(Object-Graph Navigation Language)是一种强大的表达式语言,它允许在Struts2中通过属性路径访问对象图中的对象属性。
<action name="myAction" class="com.example.MyAction">
<result name="success" type="ognl">
"Welcome, " + (user != null ? user.getName() : "Unknown User")
</result>
</action>
这里,OGNL表达式在 <result>
标签中使用,根据用户对象 user
是否为空,动态地返回不同的欢迎信息。
配置示例
下面是一个完整的配置示例,它展示了如何结合 <action>
、 <result>
和 <param>
标签来配置Action映射,并使用OGNL表达式在结果页面中传递数据。
<struts>
<package name="default" extends="struts-default">
<action name="loginAction" class="com.example.LoginAction">
<param name="username">DefaultUser</param>
<param name="password">DefaultPass</param>
<result name="success">/welcome.jsp</result>
<result name="error">/error.jsp</result>
</action>
<!-- 更多Action配置 -->
</package>
</struts>
在这个配置中,当用户请求 loginAction
时,会自动注入 username
和 password
参数。如果登录成功,用户将被重定向到 welcome.jsp
页面,否则显示 error.jsp
页面。
通过这种方式,Struts2提供了灵活的配置选项,使得开发者能够根据应用需求定制请求与处理逻辑之间的映射关系。
在本章中,我们已经学会了如何配置Action映射以及参数传递。在下一章中,我们将进一步探索如何创建JSP视图页面,以及如何将其与Struts2框架整合,实现动态内容的展示和表单数据的提交与绑定。
6. 创建JSP视图页面
6.1 JSP基础知识回顾
JSP(Java Server Pages)是一种用于开发动态网页的技术,允许开发者将Java代码嵌入到HTML页面中。在与Struts2框架整合的过程中,JSP扮演了视图层的角色,负责展示数据和接收用户输入。
6.1.1 JSP标签库
JSP标签库包含了一系列的自定义标签,这些标签可以用于简化JSP页面中的代码。标准的JSP标签库(JSTL)提供了许多常用的标签,如条件判断、循环处理、国际化等。使用JSTL标签可以提高代码的可读性和可维护性。
<%@ taglib uri="***" prefix="c" %>
<c:if test="${not empty user}">
<p>Welcome, ${user.name}!</p>
</c:if>
在上述示例中,我们使用了JSTL的 <c:if>
标签来根据 user
对象是否存在来展示欢迎信息。这是一种简化的条件判断方式,避免了在JSP页面中直接嵌入Java代码。
6.1.2 JSP内置对象
JSP提供了多个内置对象,例如 request
, response
, session
, application
, 等。这些对象可以在JSP页面中直接使用,无需进行显式声明。例如,使用 request
对象获取请求参数,或者使用 session
对象来管理用户会话。
<%
String username = request.getParameter("username");
session.setAttribute("user", username);
%>
在上面的代码片段中,我们通过 request.getParameter
方法获取了客户端传递的 username
参数,并将其存储在session中,以便在应用的其他部分中使用。
6.2 JSP页面与Struts2整合
在Struts2框架中,JSP通常被用来显示数据和接收用户输入。Struts2提供了一个称为值栈(Value Stack)的机制来实现模型数据与视图的绑定。这使得在JSP页面中可以非常方便地访问模型数据。
6.2.1 表单提交与数据绑定
当用户提交表单时,Struts2框架会自动将表单数据放入值栈,并在JSP页面中通过表达式语言(EL)来访问这些数据。表达式语言是一种简单的查询语言,允许开发者在JSP页面中访问对象属性。
<form action="login.action" method="post">
Username: <input type="text" name="username" /><br />
Password: <input type="password" name="password" /><br />
<input type="submit" value="Login" />
</form>
在上面的表单中,用户可以输入用户名和密码。当表单提交后,Struts2会自动将 username
和 password
的值绑定到值栈中相应的Action对象上。
6.2.2 实现动态内容展示
在JSP页面中,除了显示静态内容外,还可以使用Struts2标签库来展示动态内容。Struts2标签库提供了丰富的标签用于操作值栈中的数据,如迭代、条件判断、国际化等。
<%@ taglib prefix="s" uri="/struts-tags" %>
<s:iterator value="userList" var="user">
<s:property value="name" /> - <s:property value="email" /><br />
</s:iterator>
上述代码片段展示了如何使用Struts2的 <s:iterator>
标签来迭代 userList
集合,并使用 <s:property>
标签来显示每个用户的姓名和电子邮件地址。这种方式使得内容的动态展示变得简单高效。
通过本章内容的介绍,我们已经掌握创建JSP视图页面的基础知识,并了解了如何与Struts2框架进行整合以实现动态数据展示和表单交互。这为构建交互式的Web应用奠定了基础。接下来的章节将介绍如何运行并测试Struts2应用,确保应用的稳定性和功能性。
7. 运行并测试Struts2应用
在本章中,我们将详细探讨如何部署Struts2应用以及进行功能测试与调试的步骤。这将涉及以下两个主要部分:
- 应用部署步骤
- WAR包的生成
- 应用的部署与启动
- 功能测试与调试
- 使用IDE进行测试
- 常见错误诊断与处理
7.1 应用部署步骤
7.1.1 WAR包的生成
在部署任何Java Web应用之前,首先需要生成WAR(Web Archive)包。以下是生成WAR包的步骤:
- 在Eclipse或IntelliJ IDEA等集成开发环境中,右键点击项目并选择“Export”。
- 在弹出的导出窗口中,选择“WAR file”选项。
- 确认源文件夹、输出目录和任何你想要添加的额外资源。
- 点击“Finish”按钮来生成WAR文件。
如果你使用的是Maven或Gradle作为你的构建工具,可以通过命令行来构建WAR包。例如,使用Maven,你可以在项目根目录下执行以下命令:
mvn clean package
这将把应用打包成WAR文件,通常在 target
目录下。
7.1.2 应用的部署与启动
部署WAR包的步骤依赖于你选择的Web服务器或Java应用服务器。这里以Tomcat为例:
- 下载并解压Apache Tomcat。
- 将生成的WAR文件复制到Tomcat的
webapps
目录下。 - 启动Tomcat服务器,可以通过命令行使用
startup.bat
(Windows)或startup.sh
(Unix/Linux)脚本。
服务器启动后,你可以在浏览器中通过输入Tomcat默认端口(如 ***
)加上WAR文件中的应用上下文来访问你的应用。
7.2 功能测试与调试
7.2.1 使用IDE进行测试
大多数现代IDE都内置了测试工具,可以让你在开发过程中轻松地对应用进行测试。以下是在IntelliJ IDEA中进行测试的基本步骤:
- 在IDE中,创建一个测试类并编写测试方法。
- 使用JUnit测试框架或其他测试工具,如TestNG。
- 使用IDE的运行按钮或快捷键来执行测试。
- 查看测试结果,IDE通常会提供详细的测试报告和失败原因。
确保你的测试覆盖了所有的业务逻辑和边界情况。这将有助于在应用发布前发现潜在的缺陷。
7.2.2 常见错误诊断与处理
在开发和测试过程中,你可能会遇到各种各样的错误。以下是一些常见的问题及其诊断方法:
- HTTP状态错误:查看服务器日志文件来诊断HTTP状态错误,例如404(未找到)或500(服务器内部错误)。
- 依赖冲突:使用Maven的
mvn dependency:tree
命令或Gradle的gradle dependencies
来检查项目依赖树,以发现和解决依赖冲突。 - 业务逻辑错误:使用调试器单步执行代码,检查变量值,并验证业务逻辑的正确性。
确保在部署应用到生产环境之前彻底测试并解决了所有错误。
请注意,本章内容是关于运行、测试和调试Struts2应用的介绍,实际操作可能会根据你的具体环境和需求有所不同。在实践过程中,你应该根据遇到的具体问题进行细致的调整和优化。
简介:Struts2是一个用于构建MVC架构Java Web应用的框架,通过本示例我们将学习Struts2的入门使用和核心概念。示例内容包括配置Struts2环境、创建Action类、定义Action配置、创建视图页面以及运行应用程序。通过这些步骤,读者将理解如何构建一个简单的“HelloWorld”应用,并可进一步探索Struts2的高级特性,以优化开发流程。