Struts in Action 中文修正版:深入Java Web框架实践

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

简介:《Struts in Action》是深入探索Apache Struts框架的经典教材,涵盖了从基础配置到高级应用的完整实践。该书由Mike Keith撰写,并由“铁手”翻译成中文修正版,方便国内读者学习。Struts基于MVC设计模式,简化了Java Web应用的开发流程。Action类作为核心组件,处理HTTP请求,并通过ActionForm进行数据交互,而struts-config.xml则定义了各种映射关系。本书不仅介绍了Struts框架的关键组件和配置,还包括了与JPA/Hibernate的数据库交互、DAO模式、与Spring框架的集成、JSP和FreeMarker模板技术、以及Struts标签库的使用等实际案例,旨在为Java Web开发者提供全面的学习资源。

1. Apache Struts框架概述

Apache Struts是一个开源的Java EE web应用框架,自2000年首次发布以来,已经成为了企业级应用开发的重要工具之一。Struts框架将Model-View-Controller(MVC)设计模式应用于构建动态web应用,有效地将业务逻辑、数据处理和页面展示分离,从而提高了项目的可维护性和可扩展性。本章将简要介绍Struts框架的起源、架构以及它在现代web开发中的重要性。我们将探究Struts如何帮助开发者更高效地构建交互式的、动态内容的web应用,并为深入学习Struts框架的其他章节打下坚实的基础。

graph LR
A[开始] --> B[Apache Struts概述]
B --> C[起源与发展]
C --> D[框架架构]
D --> E[MVC设计模式应用]
E --> F[项目重要性]
F --> G[结束]

通过上图的流程图,我们可以清晰地看到从Struts框架的基本概念到它在项目中的应用重要性的逐步深入过程。本章节的深入讲解将为读者揭示Struts框架背后的原理及其在企业级开发中的核心价值。

2. MVC设计模式在Struts中的实践

2.1 MVC设计模式的原理与组件

MVC(Model-View-Controller)设计模式是一种将应用程序的输入、处理和输出分离到三个不同对象中的软件架构模式。这种模式提高了代码的可维护性、可测试性和可扩展性,成为Web应用开发中非常流行的设计模式之一。

2.1.1 模型(Model)的职责与实现

在MVC架构中,模型代表了业务数据和业务逻辑。模型将核心功能和数据封装起来,并提供接口供控制器和视图调用。模型是应用中对真实世界对象的抽象,如在电商应用中,“商品”就是一种模型。

实现模型时,通常需要以下几个步骤:

  1. 定义数据结构 :根据业务需求设计数据结构,如商品可能需要包含商品ID、名称、价格、库存等属性。
  2. 业务逻辑 :实现数据处理的逻辑,如商品的库存管理、价格计算等。
  3. 数据访问 :提供接口与数据存储交互,可能是数据库、文件系统等。

以下是一个简单的模型实现代码示例:

public class Product {
    private int id;
    private String name;
    private double price;
    private int stock;
    // 构造函数、getter和setter省略
    public void updateStock(int amount) {
        stock += amount;
    }
    // 其他业务逻辑
}
2.1.2 视图(View)的构建与渲染

视图是用户界面,负责向用户展示信息,并允许用户输入数据。它只关注如何展示数据,而不涉及数据的处理。

在Struts中,JSP是视图层的主要实现技术。开发者需要关注如何编写JSP文件以展示数据,并通过标签库来简化数据绑定。比如使用 <s:property> 标签来显示模型中的属性值。

创建视图的基本步骤包括:

  1. 布局设计 :确定页面布局,使用HTML/CSS来定义样式和结构。
  2. 数据绑定 :使用Struts标签库或JSTL来绑定模型数据。
  3. 事件处理 :处理用户输入事件,如提交表单。
<html>
<head>
    <title>商品详情</title>
</head>
<body>
    <h2><s:property value="name"/></h2>
    <p>价格:<s:property value="price"/></p>
    <form action="buy" method="post">
        <input type="hidden" name="id" value="<s:property value='id'/>"/>
        <input type="submit" value="购买"/>
    </form>
</body>
</html>
2.1.3 控制器(Controller)的流程控制

控制器在MVC中起到桥梁的作用,它接收用户的输入,然后调用模型和视图去完成用户的请求。在Struts中,控制器主要由Action类来实现,它处理业务逻辑的控制流程。

实现控制器的步骤可能包括:

  1. 创建Action类 :继承自 Action ActionSupport ,实现业务逻辑处理。
  2. 处理用户请求 :接收用户输入(通常是表单数据),进行必要的验证和处理。
  3. 转发到视图 :根据处理结果选择要显示的视图。

以下是一个简单的Action实现代码示例:

public class ProductAction extends ActionSupport {
    private Product product;

    public String execute() {
        // 这里可以调用业务逻辑代码
        // ...

        // 返回逻辑视图名,Struts将解析并展示对应的JSP页面
        return SUCCESS;
    }

    // getter和setter省略
}

2.2 Struts框架对MVC的实现

2.2.1 Action类的角色与功能

在Struts中,Action类作为控制器组件的核心,提供了处理HTTP请求、与模型交互和决定视图渲染的方式。

2.2.2 Struts如何组织MVC组件

Struts通过配置文件 struts-config.xml 来组织和关联MVC的各个组件。这个配置文件指定了哪些Action类处理哪些请求,以及如何与视图层关联。

2.2.3 MVC模式在Struts中的应用场景

实际开发中,MVC模式可以用于多种场景,比如商品浏览、购物车管理等。在这些场景中,Struts通过MVC模式将表示层与业务逻辑层分离,提高了应用的可维护性和可扩展性。

通过以上分析,可以看出在MVC设计模式的实践中,Struts框架提供了丰富的组件和灵活的配置方式,使得开发者能够高效地实现复杂的应用需求。接下来的章节将详细介绍Action类的具体作用和编写规范,以及Struts核心组件的功能。

3. Action类与核心组件功能

3.1 Action类的作用与编写规范

3.1.1 Action类的基本结构与生命周期

在Apache Struts框架中,Action类是MVC架构中的控制器组件,负责接收用户的请求并执行相应的业务逻辑,最后返回一个结果给客户端。Action类通过实现 Action 接口或继承 ActionSupport 基类来定义其基本结构。开发者通常需要实现 execute 方法,在此方法中编写处理业务逻辑的代码。

下面是一个简单的Action类示例:

public class MyAction extends ActionSupport {
    private String message;

    public String getMessage() {
        return message;
    }

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

    @Override
    public String execute() throws Exception {
        // 处理业务逻辑
        message = "Hello, Struts Action!";
        return SUCCESS;
    }
}

在上述代码中, MyAction 类继承了 ActionSupport 基类,并实现了 execute 方法。该方法将作为Action类的生命周期的入口,它在请求到达时由Struts框架调用。

Struts框架处理Action类的基本生命周期如下:

  1. 用户提交请求到服务器。
  2. 根据请求的URI,Struts查找与之对应Action类及方法。
  3. 如果需要,Struts会自动填充Action类的属性(例如通过表单提交的数据)。
  4. 调用 execute 方法执行业务逻辑。
  5. 根据执行结果,Struts会选择相应的视图资源(例如JSP页面)进行显示。
  6. 请求生命周期结束,等待下一个请求的到来。

3.1.2 处理业务逻辑的Action实现

为了编写出结构清晰、易于维护的Action类,开发者需要遵循一定的编码规范和最佳实践。以下是编写Action类时的一些要点:

  • 单一职责原则 :每个Action类应当只负责一种类型的业务逻辑。如果Action类执行的操作过多,应当考虑将其拆分为多个细粒度的Action类。
  • 数据封装 :Action类中应该封装业务相关的数据,这些数据通常来源于请求参数,并通过setter和getter方法暴露给Struts框架。
  • 异常处理 :在执行业务逻辑时,应当合理处理可能出现的异常,以便进行日志记录或向用户返回错误信息。
  • 使用Result类型 :Struts提供了多种Result类型来处理视图返回,如 dispatcher redirect chain 等,根据业务需求选择合适的返回类型。

下面是一个遵循上述要点的Action实现示例:

public class LoginAction extends ActionSupport {
    private String username;
    private String password;

    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;
    }

    @Override
    public String execute() throws Exception {
        boolean isAuthenticated = authenticate(username, password);
        if (isAuthenticated) {
            return SUCCESS;
        } else {
            return INPUT; // 表示认证失败,返回input视图进行错误提示
        }
    }

    private boolean authenticate(String username, String password) {
        // 这里应该是一个真实的用户认证逻辑
        return "admin".equals(username) && "admin123".equals(password);
    }
}

LoginAction 类中,实现了用户登录认证逻辑,并根据认证结果返回不同的结果代码。这样的实现方式使得Action类的职责单一,易于理解和维护。

4. ActionForm与数据处理

4.1 ActionForm的创建与管理

4.1.1 ActionForm的作用与生命周期

ActionForm在Struts框架中扮演着重要的角色。它是一个简单的JavaBean,用于封装用户的输入数据和提供表单验证。当用户提交表单时,Struts将创建相应的ActionForm实例,并将请求参数填充到表单对象中。ActionForm的生命周期从请求开始,至请求结束,并在请求结束后销毁实例。

ActionForm的生命周期包含以下几个阶段:

  1. 初始化:在Struts配置文件中定义ActionForm类的实例,当需要使用时,Struts容器会根据配置文件创建相应的ActionForm实例。
  2. 数据封装:用户在视图层填写表单,提交请求后,Struts框架会自动调用ActionForm的setter方法将表单数据封装到ActionForm对象中。
  3. 验证:在数据封装后,通常会调用ActionForm的validate()方法进行数据验证。如果数据验证失败,则返回相应的错误信息。
  4. 作用域管理:ActionForm对象通常存放在request或者session作用域内,以便在Action类中访问和处理。
  5. 销毁:在请求处理完毕后,Struts框架负责销毁ActionForm对象,回收资源。

4.1.2 表单验证与错误处理

在Struts应用中,表单验证是确保用户输入数据有效性的关键步骤。ActionForm类通常会包含一个validate()方法,这个方法返回一个ActionErrors对象,其中包含了所有的验证错误。

实现表单验证的步骤通常如下:

  1. 在ActionForm类中重写validate()方法。
  2. 在validate()方法内部,使用ActionMessage和ActionMessages类来存储错误信息。
  3. 根据业务规则检查每个字段,如果发现错误,则创建一个ActionMessage实例,并将其添加到ActionMessages实例中。
  4. 最后,返回包含错误信息的ActionMessages对象。如果返回的是null或空的ActionMessages对象,则表示验证通过。

错误处理通常在Action类中进行。如果validate()方法返回了错误信息,Action类需要将这些信息传递回用户界面,以便用户能够了解需要修正的输入错误。

4.2 数据处理技巧与实践

4.2.1 数据绑定与类型转换

数据绑定是将用户提交的数据转换并绑定到ActionForm对象的过程。Struts框架提供了一套内建的类型转换器,能够处理从字符串到Java基本类型或其封装类的转换,例如将字符串"true"或"false"转换为Boolean对象。

当需要绑定的数据类型不在Struts提供的类型转换器范围之内时,可以通过实现自定义的TypeConverter类来创建新的转换器,或者通过覆盖struts-config.xml中的type-mappings元素来指定使用特定的转换器类。

4.2.2 数据传递与会话管理

在Struts应用中,数据传递和会话管理是确保状态和数据一致性的关键。ActionForm提供了简单的方式来进行页面间的数据传递。数据可以通过request作用域(仅限于单个请求)或session作用域(跨多个请求)来进行传递。

会话管理通常涉及到用户登录、用户信息存储以及超时控制等。在Struts中,可以通过ActionContext类来管理session中的信息。例如,可以通过ActionContext.fillRect(true)来清除session中的特定数据。

4.2.3 ActionForm的高级使用场景

在某些复杂的场景下,ActionForm的使用会更加灵活。例如,可以通过继承ActionFormBase类来创建一个可以包含多个ActionForm实例的表单。这种方式常用于需要将一个复杂的表单拆分成多个子表单处理的情况。

除此之外,还可以通过配置动态ActionForm来实现更灵活的数据绑定。动态ActionForm允许在配置文件中动态定义表单属性,而不需要在ActionForm类中进行硬编码。

在本章节中,我们深入探讨了ActionForm的创建、生命周期、表单验证、错误处理以及数据传递和会话管理等高级技巧。通过这些实践,开发者可以更好地理解和运用Struts框架中的数据处理机制,以构建出更加健壮和易于维护的Web应用。

// 示例代码:ActionForm验证方法实现
public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
    ActionErrors errors = new ActionErrors();
    // 示例:验证用户名是否为空
    String username = getUserName();
    if (username == null || username.trim().isEmpty()) {
        errors.add("username", new ActionMessage("error.username.required"));
    }
    // 其他字段验证...
    return errors;
}

以上代码展示了如何在ActionForm类中实现验证方法。该方法首先创建了一个ActionErrors对象,用于存储可能的验证错误。然后检查用户名字段是否为空,并添加相应的错误信息到ActionErrors对象中。需要注意的是,这里使用了ActionMessage来创建错误信息,并通过错误信息的键值与属性文件中定义的错误消息进行关联。

通过这种方式,Struts框架可以将ActionErrors对象中的错误信息展示给用户,从而达到用户友好的提示效果。

5. Struts配置详解

在本章节中,我们将深入探讨Struts框架的配置机制,特别是在 struts-config.xml 文件中的详细配置方法。通过理解这些配置,开发者可以更灵活地构建基于Struts的应用程序,优化应用程序的性能,并提供更佳的用户体验。

5.1 struts-config.xml的结构与配置

5.1.1 文件结构与元素解析

struts-config.xml 是Struts配置文件的核心,其中定义了整个Struts应用程序的配置信息。文件中的主要元素包括:

  • Global Forwards : 全局转发,用于在整个应用程序中共享URL路径。
  • Action Mappings : 行为映射,将请求映射到Action类。
  • Form Beans : 表单bean定义,用于表单数据的封装。
  • Global Exception Mappings : 全局异常映射,用于处理应用程序级别的异常。
  • Data Sources : 数据源配置,用于数据库连接管理。

配置文件应该遵循XML格式的严格规则,并保持良好的结构,便于阅读和维护。

5.1.2 配置文件的最佳实践与技巧

在配置 struts-config.xml 时,一些最佳实践和技巧能够帮助开发者提升配置的效率和质量:

  • 命名约定 : 为所有配置项使用清晰和一致的命名约定,以便于理解和管理。
  • 模块化 : 将相关的配置项分组到不同的模块中,可以提高可维护性。
  • 注释 : 添加详细注释,描述每个配置项的作用和配置原因。
  • 验证 : 定期验证配置文件的有效性,避免运行时错误。
  • 版本控制 : 使用版本控制系统管理配置文件的变化。

下面是一个简化的 struts-config.xml 配置示例:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN" "***">
<struts-config>
    <!-- Global forwards -->
    <global-forwards>
        <forward name="login" path="/login.do"/>
    </global-forwards>

    <!-- Action mappings -->
    <action-mappings>
        <action path="/login" type="com.example.LoginAction" name="loginForm" scope="request" validate="true" input="/login.jsp">
            <forward name="success" path="/welcome.do"/>
        </action>
    </action-mappings>

    <!-- Form beans -->
    <form-beans>
        <form-bean name="loginForm" type="com.example.LoginForm"/>
    </form-beans>
</struts-config>

5.2 关键组件的详细配置方法

5.2.1 ActionServlet的配置与应用

ActionServlet 是Struts框架的核心Servlet,负责请求的分发。在 web.xml 中进行配置,指定 struts-config.xml 的位置和初始化参数。

<servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
        <param-name>config</param-name>
        <param-value>/WEB-INF/struts-config.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>

5.2.2 ActionMapping的构建与功能

ActionMapping 用于定义请求到Action类的映射。它指定了请求URI、Action类的路径和一些属性,如是否需要验证和输入视图。

<action path="/login"
        type="com.example.LoginAction"
        name="loginForm"
        scope="request"
        validate="true"
        input="/login.jsp">
    <forward name="success" path="/welcome.do"/>
</action>

5.2.3 ActionForward的使用与重定向机制

ActionForward 表示一个转发的逻辑名称,用于在Action类中指定请求处理后应该重定向到的视图。

<forward name="success" path="/welcome.jsp"/>

在Action类中使用如下:

public ActionForward execute(ActionMapping mapping, ActionForm form,
                             HttpServletRequest request, HttpServletResponse response)
        throws IOException, ServletException {
    // Action logic
    return mapping.findForward("success");
}

5.3 扩展性与自定义配置

Struts允许开发者通过扩展 ActionServlet 和其他核心组件来自定义其行为。开发者可以实现自定义的 PlugIn 接口来在初始化时加载额外的配置或执行自定义代码。

public class MyPlugin implements PlugIn {
    @Override
    public void init窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒窒

# 6. Struts高级功能与视图层技术

## 6.1 国际化、异常处理与Tiles集成

### 6.1.1 国际化的实现与注意事项

实现国际化的第一步是在`struts-config.xml`中配置资源包。资源包通常包含一个`properties`文件,该文件包含需要翻译的文本。配置多个资源包时,Struts会根据用户的语言环境优先加载匹配的语言文件。开发时,需要确保资源文件的键值对准确无误,并且在不同语言版本中保持一致。

```xml
<struts-config>
    <!-- 定义资源包 -->
    <message-resources parameter="ApplicationResources" />
</struts-config>

ApplicationResources.properties 中定义基本文本:

welcome.text=Welcome

ApplicationResources_es.properties 中翻译文本:

welcome.text=¡Bienvenido!

注意事项: - 保持键的唯一性,确保不同语言的文本能够正确对应。 - 当键对应多个值时,考虑使用国际化框架如 ResourceBundle 来处理更复杂的翻译逻辑。 - 确保翻译文本的文化敏感性和准确性。

6.1.2 异常处理机制与自定义异常类

Struts框架提供了异常处理机制,它允许开发者定义异常映射到特定的错误页面。自定义异常类可以继承自 ActionException ,以便在Action层抛出更具体的异常信息。

定义异常映射:

<struts-config>
    <global-exceptions>
        <exception key="error.page" type="org.apache.struts.action.ActionException" path="/error.jsp"/>
    </global-exceptions>
</struts-config>

创建自定义异常类:

public class MyCustomException extends ActionException {
    public MyCustomException(String message) {
        super(message);
    }
    // 可以添加更多构造方法和处理逻辑
}

通过在Action中抛出自定义异常,Struts框架会根据配置的异常映射来处理错误页面的跳转。

6.1.3 Tiles模板的集成与应用

Tiles是Struts的一个可选组件,用于页面模板管理和布局。它通过定义布局模板和内容块来实现页面的模块化和重用。

首先配置Tiles插件:

<struts-config>
    <plug-in className="org.apache.struts.tiles.TilesPlugin">
        <set-property property="definitions-config" value="/WEB-INF/tiles-defs.xml" />
        <!-- 其他配置项 -->
    </plug-in>
</struts-config>

定义布局模板 tiles-defs.xml :

<tiles-definitions>
    <definition name="baseLayout" template="/layout/baseLayout.jsp">
        <put name="title" value="Welcome"/>
        <put-list name="headerContent" value="/header.jsp"/>
        <put-list name="bodyContent" value="/body.jsp"/>
        <put-list name="footerContent" value="/footer.jsp"/>
    </definition>
</tiles-definitions>

在Action类中使用Tiles布局:

public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) throws Exception {
    // 处理业务逻辑
    ActionForward forward = mapping.findForward("baseLayout");
    return forward;
}

6.2 数据库交互与自定义标签库

6.2.1 JPA/Hibernate集成与数据持久化

Struts可以与Java Persistence API (JPA)或Hibernate框架集成来实现数据持久化。首先,需要在项目中添加相应的依赖库。

对于Hibernate,通常使用 LocalSessionFactoryBean 来配置会话工厂:

<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="com.example.model" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
            <!-- 其他配置 -->
        </props>
    </property>
</bean>

然后,在Action中可以使用 Session 来执行数据库操作:

public ActionForward execute(ActionMapping mapping, ActionForm form,
    HttpServletRequest request, HttpServletResponse response) throws Exception {
    Session session = HibernateUtil.getSessionFactory().openSession();
    session.beginTransaction();
    // 执行CRUD操作
    session.getTransaction().commit();
    session.close();
    return mapping.findForward("success");
}

6.2.2 Spring框架的集成与依赖注入

Spring框架的集成提供了依赖注入(DI)功能,改善了代码的维护性和测试性。Spring整合Struts时,通常使用 ActionSupport 类或Spring的 Action 接口。

通过Spring的XML配置文件进行依赖注入:

<bean id="myAction" class="com.example.actions.MyAction">
    <property name="dependency" ref="dependency" />
</bean>

在Action类中接收注入的依赖:

public class MyAction extends ActionSupport {
    private Dependency dependency;
    public void setDependency(Dependency dependency) {
        this.dependency = dependency;
    }
    public ActionForward execute(ActionMapping mapping, ActionForm form,
        HttpServletRequest request, HttpServletResponse response) throws Exception {
        dependency.doSomething();
        return mapping.findForward("success");
    }
}

6.2.3 视图层技术与标签库的使用

Struts提供了大量的标签库,用于简化JSP页面中的数据展示和表单处理。使用Struts标签库可以减少脚本代码,提高代码的可读性和维护性。

使用Struts标签在JSP中展示数据:

<s:form action="submitForm">
    <s:textfield label="Name" name="name" />
    <s:textarea label="Comments" name="comments" />
    <s:submit value="Submit" />
</s:form>

自定义标签库允许开发者根据业务需求创建可复用的标签组件。创建自定义标签库需要定义标签处理器、TLD文件以及在JSP中使用自定义标签。

6.3 视图层技术实现

6.3.1 JSP技术在Struts中的应用

JSP是Java EE标准视图层技术,在Struts中使用JSP可以实现动态网页的生成。Struts通过标签库简化了JSP页面中对Java代码的使用。

6.3.2 FreeMarker模板引擎的优势与应用

FreeMarker是一个模板引擎,它可以用于生成文本输出。在Struts中,可以使用FreeMarker与Struts标签结合来创建更加灵活和强大的视图层。

6.3.3 标签库的应用与实例演示

Struts标签库提供了大量的内置标签,覆盖了表单元素、控制标签、迭代标签等多种场景,使得视图层的代码更加清晰和易于管理。下面是一个简单的Struts标签使用实例:

<s:form action="loginAction">
    <s:textfield name="username" key="username" />
    <s:password name="password" key="password" />
    <s:submit value="Login" key="submit" />
</s:form>

在上述代码中, <s:form> 表示一个表单, <s:textfield> <s:password> 用于生成文本输入框和密码输入框, <s:submit> 用于生成提交按钮。标签的 key 属性用于支持国际化。

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

简介:《Struts in Action》是深入探索Apache Struts框架的经典教材,涵盖了从基础配置到高级应用的完整实践。该书由Mike Keith撰写,并由“铁手”翻译成中文修正版,方便国内读者学习。Struts基于MVC设计模式,简化了Java Web应用的开发流程。Action类作为核心组件,处理HTTP请求,并通过ActionForm进行数据交互,而struts-config.xml则定义了各种映射关系。本书不仅介绍了Struts框架的关键组件和配置,还包括了与JPA/Hibernate的数据库交互、DAO模式、与Spring框架的集成、JSP和FreeMarker模板技术、以及Struts标签库的使用等实际案例,旨在为Java Web开发者提供全面的学习资源。

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

  • 24
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值