Struts2框架基础实践:HelloWorld

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:Struts2是一个用于构建MVC架构Java Web应用的框架,通过本示例我们将学习Struts2的入门使用和核心概念。示例内容包括配置Struts2环境、创建Action类、定义Action配置、创建视图页面以及运行应用程序。通过这些步骤,读者将理解如何构建一个简单的“HelloWorld”应用,并可进一步探索Struts2的高级特性,以优化开发流程。 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框架处理请求的过程可以分为以下几个主要步骤:

  1. 用户发送一个HTTP请求到服务器。
  2. 根据请求的URL,Struts2框架在 struts.xml 文件中查找对应的 <action> 配置。
  3. 如果存在匹配的 <action> 配置,框架将创建对应的Action实例。
  4. 根据配置,Struts2框架将创建并执行一组拦截器,这些拦截器负责处理预处理和后处理任务。
  5. 最后,执行Action类的 execute() 方法(或者自定义的其他方法)。
  6. 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的安装步骤:

  1. 访问Oracle官网或其他JDK提供商,下载适合当前操作系统的JDK版本。
  2. 运行下载的安装程序,并遵循安装向导完成安装。
  3. 配置环境变量:
  4. JAVA_HOME :指向JDK安装目录。
  5. PATH :添加JDK的bin目录路径,确保命令行工具如 java javac 可以全局访问。
  6. 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为例进行说明:

  1. 从Apache Tomcat官网下载Tomcat服务器的压缩包。
  2. 解压缩到目标文件夹,例如 C:\Tomcat
  3. 配置环境变量 CATALINA_HOME ,指向Tomcat的根目录。
  4. 配置环境变量 PATH ,添加Tomcat的 bin 目录到系统路径中。
  5. 启动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>
  1. <struts> 标签 :这是整个配置文件的根节点。
  2. <constant> 标签 :用于定义系统级别的常量,如开发模式、配置文件路径等。
  3. <package> 标签 :用于将多个Action组织在一起,其中 extends 属性指定了父包(通常是 struts-default ), namespace 属性定义了包的命名空间。

3.2.2 常用配置项及作用

Struts2框架提供了许多配置项,用于调整框架的行为。以下是一些常用配置项:

  1. 结果类型(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模板。

  2. 拦截器(interceptors) xml <struts> <interceptors> <interceptor name="myInterceptor" class="com.example.MyInterceptor"/> </interceptors> <!-- 其他配置 --> </struts> interceptors 标签用于定义自定义拦截器,可以用来扩展框架功能,如日志记录、数据校验等。

  3. 全局结果(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包的步骤:

  1. 在Eclipse或IntelliJ IDEA等集成开发环境中,右键点击项目并选择“Export”。
  2. 在弹出的导出窗口中,选择“WAR file”选项。
  3. 确认源文件夹、输出目录和任何你想要添加的额外资源。
  4. 点击“Finish”按钮来生成WAR文件。

如果你使用的是Maven或Gradle作为你的构建工具,可以通过命令行来构建WAR包。例如,使用Maven,你可以在项目根目录下执行以下命令:

mvn clean package

这将把应用打包成WAR文件,通常在 target 目录下。

7.1.2 应用的部署与启动

部署WAR包的步骤依赖于你选择的Web服务器或Java应用服务器。这里以Tomcat为例:

  1. 下载并解压Apache Tomcat。
  2. 将生成的WAR文件复制到Tomcat的 webapps 目录下。
  3. 启动Tomcat服务器,可以通过命令行使用 startup.bat (Windows)或 startup.sh (Unix/Linux)脚本。

服务器启动后,你可以在浏览器中通过输入Tomcat默认端口(如 *** )加上WAR文件中的应用上下文来访问你的应用。

7.2 功能测试与调试

7.2.1 使用IDE进行测试

大多数现代IDE都内置了测试工具,可以让你在开发过程中轻松地对应用进行测试。以下是在IntelliJ IDEA中进行测试的基本步骤:

  1. 在IDE中,创建一个测试类并编写测试方法。
  2. 使用JUnit测试框架或其他测试工具,如TestNG。
  3. 使用IDE的运行按钮或快捷键来执行测试。
  4. 查看测试结果,IDE通常会提供详细的测试报告和失败原因。

确保你的测试覆盖了所有的业务逻辑和边界情况。这将有助于在应用发布前发现潜在的缺陷。

7.2.2 常见错误诊断与处理

在开发和测试过程中,你可能会遇到各种各样的错误。以下是一些常见的问题及其诊断方法:

  • HTTP状态错误:查看服务器日志文件来诊断HTTP状态错误,例如404(未找到)或500(服务器内部错误)。
  • 依赖冲突:使用Maven的 mvn dependency:tree 命令或Gradle的 gradle dependencies 来检查项目依赖树,以发现和解决依赖冲突。
  • 业务逻辑错误:使用调试器单步执行代码,检查变量值,并验证业务逻辑的正确性。

确保在部署应用到生产环境之前彻底测试并解决了所有错误。

请注意,本章内容是关于运行、测试和调试Struts2应用的介绍,实际操作可能会根据你的具体环境和需求有所不同。在实践过程中,你应该根据遇到的具体问题进行细致的调整和优化。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

简介:Struts2是一个用于构建MVC架构Java Web应用的框架,通过本示例我们将学习Struts2的入门使用和核心概念。示例内容包括配置Struts2环境、创建Action类、定义Action配置、创建视图页面以及运行应用程序。通过这些步骤,读者将理解如何构建一个简单的“HelloWorld”应用,并可进一步探索Struts2的高级特性,以优化开发流程。

本文还有配套的精品资源,点击获取 menu-r.4af5f7ec.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值