Struts2 日本项目实战:Web应用开发指南

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

简介:Struts2是一个功能强大的Java web框架,采用MVC模式,适用于构建复杂的企业级Web应用程序。本项目展示了如何在日本的业务环境中使用Struts2框架,以及核心特性如Action类、拦截器、结果类型等的应用。此外,项目中涉及了使用JDOM解析XML数据,自定义Struts2标签进行分页以及页面上自动分页的实现。这些技术的结合提供了完整的Web开发实战经验,包含源码及所有资源文件,对于学习Struts2框架和Web开发流程的开发者来说,是一个宝贵的学习资源。 Struts2 完整的日本项目

1. Struts2框架简介

Struts2是一个用于开发Java EE Web应用的强大框架,它是Apache软件基金会的顶级项目,广泛应用于企业级应用的开发。Struts2框架在本质上继承了MVC(Model-View-Controller)设计模式,使得开发者能够更加高效地构建Web应用,并且更加容易维护和扩展。

1.1 Struts2的历史和发展

Struts2框架的前身是Jakarta Struts,最初由Craig McClanahan在2000年发起。Struts2是在Struts和WebWork框架的基础上发展起来的,它结合了两者的优势,提供了更加稳定和强大的功能。Struts2的最新版本是基于拦截器和过滤器的,它使用拦截器栈来处理请求和响应,这使得框架具有更好的可扩展性。

1.2 Struts2框架的核心组件

Struts2框架的核心组件包括模型(Model)、视图(View)和控制器(Controller)。模型代表业务对象和数据访问对象,视图是展示层,控制器是Struts2框架本身,负责接收用户请求、调用模型处理业务逻辑、选择视图展示数据。通过这样的设计,Struts2能够实现业务逻辑和用户界面的有效分离,简化了Web应用的开发。

1.3 Struts2框架的应用场景

Struts2框架适用于构建各种Web应用,特别是对于需要复杂业务逻辑和用户交互的应用程序。由于其对MVC模式的支持,Struts2能够帮助开发者将应用逻辑清晰地分为不同的层次,从而提高代码的可读性和可维护性。此外,Struts2还提供了丰富的插件和扩展,使得开发者能够轻松集成各种功能,如表单验证、日志记录、文件上传等。

2. MVC模式在Struts2中的应用

2.1 MVC模式的基本概念

2.1.1 模型(Model)的作用和实现

模型(Model)在MVC模式中扮演着数据处理的核心角色。它不仅负责数据的存储、访问和操作,还包括业务逻辑的处理。在Struts2框架中,模型通常由JavaBean实现,它封装了数据和操作数据的方法。模型层的设计需要遵循良好的编程实践,如单一职责原则,确保每个模型只负责处理一组相关的数据和业务逻辑。

public class UserModel {
    private String username;
    private String password;
    private String email;
    // Getters and Setters
    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 String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

在上述代码中, UserModel 类封装了用户的用户名、密码和电子邮件地址。通过定义getter和setter方法,我们确保了模型的封装性和可访问性。这种设计模式不仅有助于代码的维护,也使得模型层能够独立于视图层和控制器层存在,从而更容易进行单元测试。

2.1.2 视图(View)的角色和设计

视图(View)是用户界面的展示层,它负责将模型层的数据以一种直观的方式呈现给用户。在Struts2中,视图层通常由JSP或FreeMarker模板实现。视图的设计需要遵循MVC的分离原则,即视图层只负责展示逻辑,不包含任何业务逻辑或数据处理。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>User Profile</title>
</head>
<body>
    <h2>User Profile</h2>
    <p>Username: ${user.username}</p>
    <p>Password: ${user.password}</p>
    <p>Email: ${user.email}</p>
</body>
</html>

在这个JSP页面示例中,我们展示了如何使用EL表达式将模型层的数据动态绑定到视图层。这种绑定方式不仅简化了页面的开发,还增强了页面的可维护性。视图层的设计应该注重用户体验和界面的友好性,避免在视图层中嵌入过多的业务逻辑代码。

2.1.3 控制器(Controller)的职责和配置

控制器(Controller)是MVC模式中的协调者,它负责接收用户输入,调用模型层进行数据处理,并选择视图层进行数据展示。在Struts2框架中,控制器层主要由Action类实现。Action类作为控制器,负责接收请求参数,调用模型层的方法处理业务逻辑,并返回结果给视图层。

public class UserAction extends ActionSupport {
    private UserModel userModel;
    public UserModel getUserModel() {
        return userModel;
    }

    public void setUserModel(UserModel userModel) {
        this.userModel = userModel;
    }
    @Override
    public String execute() {
        // Business logic here
        return SUCCESS;
    }
}

在这个Action类的示例中,我们定义了一个 execute 方法,它是Action类的核心方法。当用户发起一个请求时,Struts2框架会创建一个Action实例,并调用其 execute 方法。在 execute 方法中,我们可以调用模型层的方法处理业务逻辑,并根据处理结果返回相应的视图。

2.2 Struts2中的MVC实现

2.2.1 模型层的构建和数据传递

在Struts2框架中,模型层的构建通常涉及到JavaBean的定义和业务逻辑的实现。Struts2提供了多种方式来传递数据和调用模型层的方法,其中最常用的是通过Action类的属性和setter方法。

public class UserAction extends ActionSupport {
    private UserModel userModel;
    public String getUserModel() {
        return userModel.getUsername();
    }

    public void setUserModel(UserModel userModel) {
        this.userModel = userModel;
    }
    public String saveUser() {
        // Save user logic
        return SUCCESS;
    }
}

UserAction 类中,我们定义了一个 userModel 属性,并通过getter和setter方法与之交互。在 saveUser 方法中,我们可以调用业务逻辑代码来保存用户信息。这种方式不仅使得数据传递清晰明了,还便于测试和维护。

2.2.2 视图层的设计和展示逻辑

视图层的设计和展示逻辑在Struts2中通常通过JSP或FreeMarker模板来实现。Struts2提供了一系列标签库,使得数据绑定和展示变得简单直观。

<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <title>User Form</title>
</head>
<body>
    <h2>User Form</h2>
    <s:url action="saveUser" var="saveUrl"/>
    <form action="<s:property value="#saveUrl"/>" method="post">
        Username: <s:textfield name="userModel.username"/>
        Password: <s:password name="userModel.password"/>
        Email: <s:textfield name="userModel.email"/>
        <s:submit value="Submit"/>
    </form>
</body>
</html>

在这个JSP页面中,我们使用了Struts2的 <s:url> 标签生成一个URL,使用 <s:textfield> <s:password> 标签来创建文本输入框和密码输入框,并绑定到 userModel 的相应属性。这种方式使得视图层与模型层的数据绑定变得简单和直观。

2.2.3 控制层的核心组件和流程控制

控制层的核心组件是Action类,它作为控制器负责处理用户请求并调用模型层的方法。在Struts2框架中,流程控制主要通过struts.xml配置文件来实现。

<struts>
    <package name="default" namespace="/" extends="struts-default">
        <action name="saveUser" class="com.example.UserAction" method="saveUser">
            <result name="success">/userForm.jsp</result>
        </action>
    </package>
</struts>

在这个配置文件中,我们定义了一个 saveUser 的Action映射,当用户请求 saveUser 时,Struts2框架会创建一个 UserAction 实例,并调用其 saveUser 方法。如果方法执行成功,用户将被重定向到 userForm.jsp 视图层页面。

在本章节中,我们介绍了MVC模式的基本概念,并详细探讨了Struts2框架中模型层、视图层和控制层的实现方式。通过实际的代码示例,我们展示了如何在Struts2框架中构建模型、设计视图和配置控制器。这些知识对于理解和应用MVC模式至关重要,也为我们后续章节的深入探讨奠定了基础。

3. Action类的使用和实践

Action类是Struts2框架的核心,它负责处理用户的请求并返回响应。在本章节中,我们将深入探讨Action类的作用、基本结构以及它的高级功能。

3.1 Action类的作用和基本结构

3.1.1 Action接口的定义和方法

Action接口是Struts2框架中所有Action类的基类。它定义了一系列的方法,这些方法在请求处理的不同阶段被框架调用。

public interface Action {
    String INPUT = "input";
    String SUCCESS = "success";
    String ERROR = "error";
    String NO_METHOD = "none";

    String execute() throws Exception;
}

execute() 方法是Action接口中最关键的方法,它在请求到达时被调用。此外,还有几个预定义的返回值,如 INPUT SUCCESS ERROR 等,这些返回值指示了处理流程的不同方向。

3.1.2 Action类的生命周期和工作原理

Action类的生命周期从创建实例开始,到请求处理结束,具体分为以下几个阶段:

  1. 实例化 :当请求到来时,Struts2框架会根据配置创建Action的实例。
  2. 设置属性 :框架通过setter方法注入请求参数。
  3. 调用execute :框架调用 execute() 方法处理请求。
  4. 返回结果 :方法返回的结果字符串决定了接下来的流程,例如返回 SUCCESS 通常意味着请求处理成功,页面将被转发到结果页面。
public class ExampleAction implements Action {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String execute() throws Exception {
        // 处理请求
        return SUCCESS;
    }
}

3.2 Action类的高级功能

3.2.1 参数传递和结果返回

在Struts2中,参数的传递通常是通过Action的setter方法自动完成的。你可以通过 @Param 注解或者XML配置来指定参数的来源。

public class ExampleAction implements Action {
    private String message;

    @Param("message")
    public void setMessage(String message) {
        this.message = message;
    }

    public String execute() {
        // 使用message变量
        return SUCCESS;
    }
}

结果返回不仅仅是返回一个字符串那么简单,Struts2提供了丰富的结果类型,如 dispatcher redirect redirectAction 等。

3.2.2 验证框架的集成和使用

Struts2提供了内置的验证框架,可以通过拦截器轻松集成到Action类中。你需要做的是在Action类中定义验证规则,并在验证失败时返回 input

public class ExampleAction implements Action {
    private String name;
    private int age;

    @RequiredFieldValidator(message = "Name is required")
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    @RequiredFieldValidator(message = "Age is required")
    @IntRangeFieldValidator(min = "0", max = "120", message = "Age must be between 0 and 120")
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String execute() {
        // 执行操作
        return SUCCESS;
    }
}

通过本章节的介绍,我们了解了Action类在Struts2框架中的核心作用,包括它的接口定义、生命周期以及如何实现参数传递和结果返回。同时,我们也探索了如何集成和使用Struts2的验证框架,以确保用户输入的有效性和安全性。在下一章节中,我们将深入探讨拦截器的实现和应用场景,了解如何在Struts2中进行更高级的请求处理和安全性控制。

4. 拦截器的实现和应用

拦截器(Interceptor)是Struts2框架中一个非常强大的特性,它允许开发者在请求到达Action之前或之后执行自定义的逻辑。本章节将深入探讨拦截器的基本概念、工作流程、应用场景以及如何设计和管理拦截器链。

4.1 拦截器的基本概念

4.1.1 拦截器的定义和工作流程

拦截器是一种设计模式,它用于在不修改原有代码的情况下,对方法的调用进行拦截和处理。在Struts2中,拦截器是在请求处理流程中的一个可选环节,可以在Action执行前后添加自定义的处理逻辑。

工作流程通常如下:

  1. 用户发出请求。
  2. 请求被Struts2框架捕获,并根据配置寻找匹配的拦截器链。
  3. 拦截器按照顺序执行,每个拦截器可以对请求进行预处理,决定是否继续传递给下一个拦截器或直接返回结果。
  4. 如果所有拦截器都正常处理完毕,则最终调用Action。
  5. Action执行完毕后,控制权返回给拦截器链,拦截器可以对结果进行后处理。
  6. 最终,响应返回给用户。

4.1.2 拦截器链的设计和管理

拦截器链是多个拦截器按照特定顺序组成的处理流程。在Struts2中,可以通过XML配置文件或者注解来定义拦截器链。

示例代码:XML配置拦截器链
<package name="default" namespace="/" extends="struts-default">
    <action name="example" class="com.example.ExampleAction">
        <interceptor-ref name="defaultStack" />
        <interceptor-ref name="myInterceptor" />
        <interceptor-ref name="anotherInterceptor" />
        <result name="success">/success.jsp</result>
    </action>
    <interceptor name="myInterceptor" class="com.example.MyInterceptor" />
    <interceptor name="anotherInterceptor" class="com.example.AnotherInterceptor" />
</package>

在这个例子中, example Action将会依次通过 defaultStack myInterceptor anotherInterceptor 三个拦截器。

表格:拦截器链的管理

| 拦截器名称 | 类路径 | 描述 | |----------------|---------------------------|--------------------------------| | defaultStack | struts-default-interceptors | Struts2默认的拦截器栈 | | myInterceptor | com.example.MyInterceptor | 自定义拦截器,用于特定逻辑处理 | | anotherInterceptor | com.example.AnotherInterceptor | 另一个自定义拦截器,用于其他逻辑处理 |

4.2 拦截器的应用场景

4.2.1 日志记录和性能监控

拦截器非常适合用于日志记录和性能监控。例如,可以在请求进入和退出Action时记录时间,计算处理耗时,或者记录请求的相关信息,如用户IP、请求URL等。

示例代码:日志记录拦截器
public class LoggingInterceptor implements Interceptor {
    @Override
    public void destroy() {
        // 清理资源
    }

    @Override
    public void init() {
        // 初始化拦截器
    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        long startTime = System.currentTimeMillis();
        String result = invocation.invoke(); // 继续执行链中的下一个拦截器或Action
        long endTime = System.currentTimeMillis();
        System.out.println("Action执行耗时:" + (endTime - startTime) + "毫秒");
        return result;
    }
}

4.2.2 安全控制和权限验证

拦截器还可以用于安全控制和权限验证。例如,可以在请求处理前检查用户是否登录、是否具有访问某资源的权限。

示例代码:权限验证拦截器
public class AuthorizationInterceptor implements Interceptor {
    @Override
    public void destroy() {
        // 清理资源
    }

    @Override
    public void init() {
        // 初始化拦截器
    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        ActionContext context = invocation.getActionContext();
        String actionName = context.get("actionName").toString();
        if (!isUserAuthorized(actionName)) {
            return ERROR; // 未授权,返回错误结果
        }
        return invocation.invoke(); // 授权成功,继续执行链中的下一个拦截器或Action
    }

    private boolean isUserAuthorized(String actionName) {
        // 实现权限验证逻辑
        return true;
    }
}

在本章节中,我们深入探讨了Struts2拦截器的基本概念、工作流程、应用场景以及如何设计和管理拦截器链。通过具体的代码示例和表格,我们展示了拦截器在实际开发中的应用方式。下一章节,我们将继续深入了解如何定义结果类型和构建页面动态内容。

5. 结果类型定义和页面构建

5.1 结果类型的基本定义

5.1.1 常用结果类型介绍

在Struts2框架中,结果类型 是定义Action执行完毕后如何处理响应的重要组成部分。它们决定了数据如何被转换和展示给用户。Struts2内置了几种常见的结果类型,每种类型都有其特定的用途和适用场景。以下是一些常用的内置结果类型:

  • dispatcher : 默认的结果类型,将响应转发到另一个资源(通常是JSP页面)。
  • redirect : 重定向到另一个URL,可以是外部的URL或框架内部的Action。
  • redirectAction : 类似于 redirect ,但是直接重定向到另一个Action。
  • stream : 用于将数据作为流直接发送到客户端,常用于文件下载功能。
  • velocity : 使用Velocity模板引擎来渲染响应。
  • freemarker : 使用FreeMarker模板引擎来渲染响应。

5.1.2 自定义结果类型的实现

除了内置的结果类型,Struts2还允许开发者根据需要自定义结果类型。自定义结果类型通常用于实现特定的逻辑处理或展示效果。创建一个自定义结果类型需要实现 Result 接口,并在 execute 方法中定义自定义的行为逻辑。

以下是一个简单的自定义结果类型的示例,我们将创建一个名为 CustomResult 的结果类型,它将简单地将数据作为JSON格式输出:

public class CustomResult implements Result {

    private Map<String, Object> data;

    public void setData(Map<String, Object> data) {
        this.data = data;
    }

    @Override
    public void execute(ActionContext context) throws Exception {
        HttpServletResponse response = context.getHttpServletResponse();
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        String json = new Gson().toJson(data);
        response.getWriter().write(json);
    }
}

在上面的代码中, CustomResult 类实现了 Result 接口,并重写了 execute 方法。在 execute 方法中,我们将数据转换为JSON格式并输出到响应流中。

要使用自定义的结果类型,你需要在struts.xml中进行配置:

<action name="customAction" class="com.example.MyAction">
    <result name="success" type="com.example.CustomResult">
        <param name="data">{"message":"Custom JSON Response"}</param>
    </result>
</action>

在这个配置中,我们指定了一个名为 customAction 的Action,当它返回 success 时,将使用我们自定义的 CustomResult 类型,并传递一个名为 data 的JSON字符串作为参数。

通过本章节的介绍,我们可以了解到如何在Struts2框架中使用内置和自定义的结果类型来控制Action的输出行为。这为开发者提供了强大的灵活性,以适应不同的业务需求和技术场景。

5.2 页面动态内容的构建

5.2.1 JSP和FreeMarker的集成

在Struts2中,JSP是一种常用的视图技术,用于构建动态网页。Struts2提供了与JSP紧密集成的能力,允许开发者在JSP页面中使用Struts2标签库来处理表单、显示数据等。

要使用JSP作为视图技术,你需要在struts.xml中配置Action的视图组件:

<action name="jspAction" class="com.example.MyAction">
    <result name="success">/jsp/result.jsp</result>
</action>

在上面的配置中,当 jspAction 返回 success 时,将使用 result.jsp 作为视图组件。

FreeMarker是一个模板引擎,它被设计用来生成文本输出(包括HTML),基于模板和数据模型。Struts2同样支持FreeMarker作为视图技术。要使用FreeMarker,需要在struts.xml中进行配置:

<package name="freemarkerExample" extends="struts-default">
    <action name="freemarkerAction" class="com.example.MyAction">
        <result name="success" type="freemarker">
            <param name="template">/freemarker/example.ftl</param>
        </result>
    </action>
</package>

在上面的配置中,当 freemarkerAction 返回 success 时,将使用FreeMarker模板 example.ftl

5.2.2 动态数据绑定和展示

在JSP或FreeMarker模板中,数据的绑定和展示是通过特定的语法实现的。对于JSP,通常使用Struts2标签库中的标签来访问Action的属性:

<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
    <title>Struts2 JSP Example</title>
</head>
<body>
    <s:property value="message" />
</body>
</html>

在上面的JSP示例中,我们使用 <s:property> 标签来展示名为 message 的属性值。

对于FreeMarker,数据绑定是通过在模板中嵌入特定的变量来实现的:

<html>
<head>
    <title>Struts2 FreeMarker Example</title>
</head>
<body>
    ${message}
</body>
</html>

在上面的FreeMarker示例中, ${message} 变量用于展示数据。

通过本章节的介绍,我们学习了如何在Struts2框架中使用JSP和FreeMarker作为视图技术,并了解了如何进行动态数据绑定和展示。这些知识对于构建动态交互式的Web应用程序至关重要。

6. Struts2标签、分页功能和开发资源

6.1 自定义Struts2标签和分页

Struts2框架提供了一个强大的标签库,这些标签不仅丰富了页面的表现能力,还能够简化JSP页面的代码。通过自定义标签,开发者可以创建可复用的UI组件,提高开发效率。

6.1.1 Struts2标签库的使用和扩展

Struts2标签库包含了许多内置标签,例如用于迭代、条件逻辑、输入验证等。例如,使用 <s:iterator> 标签来迭代集合:

<s:iterator value="users" var="user">
    <s:property value="user.name"/>
</s:iterator>

如果内置标签不能满足特定需求,我们可以创建自定义标签。自定义标签通常涉及以下几个步骤:

  1. 创建标签类:继承 SimpleTagSupport 类,重写 doTag 方法。
  2. 定义标签库描述文件(TLD):在 WEB-INF 目录下创建一个 .tld 文件。
  3. 在JSP页面中引用自定义标签。

6.1.2 分页功能的实现和优化

分页是Web应用中常见的功能,可以提高页面加载速度和用户体验。在Struts2中实现分页功能,可以使用拦截器或者编写自定义代码。

分页拦截器的使用

Struts2提供了一个 Pagination 拦截器,可以很方便地实现分页。首先,在 struts.xml 中配置拦截器:

<package name="default" extends="struts-default">
    <action name="listUsers" class="com.example.UserAction">
        <interceptor-ref name="defaultStack"/>
        <interceptor-ref name="pagination">
            <param name="input">/listUsers.jsp</param>
            <param name="output">/listUsers.jsp</param>
            <param name="listVar">users</param>
            <param name="pageSize">10</param>
        </interceptor-ref>
        <result name="success">/listUsers.jsp</result>
    </action>
</package>
分页逻辑的重用和扩展

为了重用分页逻辑,可以创建一个通用的分页服务类,该类封装了分页相关的逻辑。然后,在Action中调用这个服务类来处理分页请求。

6.2 自动化分页功能

自动化分页功能可以进一步简化分页的实现,减少代码量和提高代码的可维护性。

6.2.1 分页标签的自动化处理

可以创建一个自定义标签,该标签内部调用分页服务类,并将分页结果设置到request作用域中。这样,在JSP页面中只需要简单地使用这个标签即可实现分页。

<s:tag name="paginate">
    <!-- 自定义标签的内部逻辑 -->
</s:tag>

6.2.2 分页逻辑的重用和扩展

通过定义一个分页插件,可以在不同的Action之间共享分页逻辑。此外,可以为分页标签提供不同的属性,以支持更复杂的分页场景。

6.3 完整开发资源提供

为了确保开发过程的高效和项目的成功部署,提供完整的开发资源是必不可少的。

6.3.1 开发环境的搭建和配置

搭建Struts2开发环境需要配置Java开发工具包(JDK)、服务器(如Tomcat)和IDE(如IntelliJ IDEA或Eclipse)。在IDE中配置项目依赖,如Struts2库和数据库连接驱动等。

6.3.2 项目构建和部署的最佳实践

在项目构建过程中,推荐使用Maven或Gradle这样的构建工具,它们可以自动化依赖管理、编译、打包等任务。部署时,确保遵循最佳实践,如使用版本控制系统(如Git)、编写清晰的部署脚本等。

通过本章的介绍,我们可以看到Struts2框架在标签扩展、分页功能实现以及开发资源提供方面的强大能力。这些知识点不仅可以帮助开发者提升开发效率,还可以提高应用的性能和可维护性。

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

简介:Struts2是一个功能强大的Java web框架,采用MVC模式,适用于构建复杂的企业级Web应用程序。本项目展示了如何在日本的业务环境中使用Struts2框架,以及核心特性如Action类、拦截器、结果类型等的应用。此外,项目中涉及了使用JDOM解析XML数据,自定义Struts2标签进行分页以及页面上自动分页的实现。这些技术的结合提供了完整的Web开发实战经验,包含源码及所有资源文件,对于学习Struts2框架和Web开发流程的开发者来说,是一个宝贵的学习资源。

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

猜你喜欢

转载自blog.csdn.net/weixin_42126677/article/details/142907278