Struts 2.0核心架构详解与实战应用

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

简介:Struts 2.0是一个广泛使用的Java Web框架,基于MVC设计模式,简化了Web应用开发流程。它包含多个关键组件,如Action类、配置文件、拦截器、OGNL表达式语言等,支持国际化、异常处理和Ajax集成。开发者可以通过继承ActionSupport类实现业务逻辑,并利用配置文件定义Action映射和拦截器链。Struts 2.0还支持注解配置,提高了开发效率和代码质量,适用于需要构建可扩展、易维护的Java应用程序的场景。本课程将深入讲解Struts 2.0核心包的使用,帮助学生掌握框架的核心概念和实战技巧。 Struts 2.0核心架构详解与实战应用_第1张图片

1. Struts 2.0 概述与MVC设计模式

1.1 Struts 2.0的起源与价值

Struts 2.0 是一个用于构建Web应用程序的开源框架,它是著名的Struts框架的后续版本,继承了MVC(模型-视图-控制器)设计模式的精神。通过清晰的分层架构,它简化了复杂的用户界面和业务逻辑之间的交互。Struts 2.0的出现,为Java开发者提供了一个更为灵活和强大的选择,使得Web开发更为高效和可维护。

1.2 MVC设计模式的精髓

MVC设计模式将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。模型代表了应用程序的数据结构,视图负责显示数据,控制器则处理输入并更新模型和视图。这种模式的优点在于,它能够将数据逻辑与展示逻辑分离,使得代码更加清晰且易于维护。Struts 2.0框架天然支持MVC设计模式,它通过Action类来充当控制器的角色,视图则依赖于JSP或其他模板技术,而模型则通常由普通的JavaBean或者POJO(Plain Old Java Object)来实现。

1.3 Struts 2.0与传统MVC的比较

与传统的MVC框架相比,Struts 2.0提供了一些独特的优势。首先,它支持拦截器(Interceptor)机制,这为开发者提供了强大的功能,比如日志记录、权限检查、数据验证等,可以在请求处理的不同阶段进行拦截和处理。其次,Struts 2.0引入了OGNL(Object-Graph Navigation Language),允许开发者以简单的方式访问对象图,并且这种语言比传统的EL表达式更加灵活和强大。最后,Struts 2.0也支持与Spring框架的集成,使得开发者能够在同一个项目中利用两种框架的优势,为开发提供了极大的灵活性。

2. Action类与业务逻辑实现

2.1 Action类的基本概念与结构

2.1.1 Action类的职责与特点

Action类在Struts 2框架中扮演着控制器的角色,它负责接收用户的请求并调用相应的业务逻辑方法,最后将结果返回给客户端。与传统的MVC框架中的控制器有所不同,Struts 2的Action类更偏向于服务层的职责,因为它并不直接操作视图层,而是通过返回的结果集来通知视图层如何渲染页面。

Action类的特点在于它将用户的请求处理逻辑封装起来,这使得代码更加模块化、易于管理和维护。它通常包括以下职责:

  • 处理请求 :接收并处理来自客户端的HTTP请求。
  • 调用业务逻辑 :根据业务需求调用服务层组件。
  • 传递数据 :在业务逻辑和视图层之间传递数据。
  • 返回结果 :基于业务处理的结果返回一个Action结果。

Action类通常不需要继承特定的类,但它们需要实现 Action 接口或继承 ActionSupport 类,后者提供了许多默认的实现和便利方法,例如国际化消息处理、类型转换和验证功能。

2.1.2 Action类与业务逻辑的绑定方式

Struts 2.0通过拦截器和值栈技术来实现Action类与业务逻辑的绑定。值栈提供了一个数据共享的空间,用于在Action类和其他组件之间传递数据。而拦截器则负责处理请求的生命周期和调用相应的Action方法。

绑定方式主要依赖于以下几个核心概念:

  • OGNL(Object-Graph Navigation Language) :Struts 2使用OGNL来实现数据的传递和访问,它是一个强大的表达式语言,用于存取对象的属性以及调用方法。
  • 值栈(Value Stack) :所有Action的属性都会被存储在值栈中,使得Struts 2可以轻松地将数据传递给视图层,并且从视图层接收数据。
  • 拦截器(Interceptor) :拦截器负责在Action执行前后进行各种预处理和后处理工作,例如数据验证、日志记录等。

一个典型的Action类绑定过程是这样的:

  1. 用户提交表单,请求到达Struts 2的过滤器。
  2. 过滤器将请求委托给拦截器链处理。
  3. 拦截器链中的拦截器会处理请求(如数据验证、转换等)并将处理结果放入值栈。
  4. 拦截器链执行完毕,最终调用Action类的 execute 方法(或其他命名方法)。
  5. execute 方法执行业务逻辑,并决定返回结果。

2.2 Action类的生命周期与状态管理

2.2.1 Action生命周期中的关键点

Action类的生命周期从一个HTTP请求的开始到结束,主要分为以下几个关键点:

  1. 实例化 :当有新的请求到来时,Struts 2框架负责创建Action类的一个实例。
  2. 设置属性 :使用值栈和OGNL,框架填充Action实例的属性。
  3. 执行业务逻辑 :通过调用Action类的 execute 方法来执行业务逻辑。
  4. 结果返回 :根据业务逻辑的处理结果,返回一个字符串,代表下一个视图的名称或一个特殊的逻辑处理结果。

整个生命周期中,Action类的实例在每次请求时都会被创建,并在请求结束时被销毁。这保证了Action类的状态不会在请求间发生干扰。

2.2.2 状态管理的实现与注意点

尽管Action类的实例在每次请求后都会被销毁,但在某些情况下,开发者可能需要保持状态信息,例如用户会话信息或请求范围的数据。这可以通过多种方式实现:

  • 请求范围属性 :通过ActionContext或值栈,可以轻松地管理请求范围的数据。
  • 会话范围属性 :将属性存储在用户的HTTP会话中,可以实现会话范围内的数据管理。
  • 应用范围属性 :将属性存储在应用上下文中,可以在整个应用范围内共享数据。

在实现状态管理时,应注意以下几点:

  • 性能问题 :存储大量的数据可能会导致性能问题,特别是在会话和应用范围内。
  • 线程安全 :如果Action类使用了共享资源,必须确保线程安全,否则可能会出现数据冲突或不一致的问题。
  • 资源释放 :确保在不再需要时释放所有资源,避免内存泄漏。

2.3 Action类与数据交互

2.3.1 数据封装与传递的方法

数据封装和传递是Action类的基本任务之一。Struts 2通过OGNL实现了一个灵活且强大的数据交互机制,OGNL可以轻松访问和操作Action的属性。

基本数据封装与传递的方法包括:

  • 通过表单标签传递 :Struts 2的表单标签可以与Action属性进行绑定,自动填充数据。
  • 通过OGNL表达式传递 :OGNL支持复杂的数据访问和操作,可以方便地读写对象的属性。

2.3.2 数据验证与错误处理技巧

在Web应用开发中,数据验证是保证数据质量的重要环节。Struts 2提供了一套内建的验证框架,使得数据验证变得简单而强大。

数据验证的实现方法包括:

  • 注解验证 :在Action类的属性上使用 @Validation 注解来指定验证规则。
  • XML验证 :通过在 struts.xml 中定义验证规则或使用 validate.xml 文件来实现验证。
  • 动态验证 :在Action的方法中动态地进行验证,根据业务逻辑的变化调整验证逻辑。

错误处理技巧:

  • 错误消息国际化 :使用Struts 2的国际化支持,为不同的用户提供错误消息。
  • 错误字段高亮显示 :通过返回特定的结果集,在JSP页面上高亮显示有错误的字段。
  • 友好错误提示 :确保错误提示对用户友好,便于理解和解决。
public class UserAction extends ActionSupport {
    private String username;
    private String password;
    private List errors;

    // Getter and setters

    public String execute() {
        // ...业务逻辑...
        if (/* some validation check */) {
            addFieldError("username", getText("error.username.exists"));
            return INPUT;
        }
        return SUCCESS;
    }
}

在上述代码中, addFieldError 方法用于添加字段级别的错误,这将使得在JSP页面上可以根据字段错误进行特别的显示处理。

3. Struts 2.0 配置文件及全局与局部配置

3.1 Struts 2.0配置文件概述

3.1.1 配置文件的核心元素解析

Struts 2.0配置文件是整个框架配置的核心,它定义了Struts应用程序的运行方式,包括如何处理请求、映射URL到Action类以及配置拦截器等。配置文件通常以XML格式编写,位于项目的 src/main/resources 目录下的 struts.xml 文件中。

配置文件的核心元素包括 根元素、 元素、 元素、 元素、 元素和 元素等。

  • 是根元素,它包含其他所有配置元素,如 , , , , 等。
  • 元素用于设置Struts2框架中使用的常量值,如日志级别、请求处理超时时间等。
  • 元素是 的容器,它定义了一组Action的逻辑分组。
  • 元素将一个请求映射到一个具体的Action类。
  • 元素定义了一个拦截器,可以在请求处理之前或之后执行特定任务。
  • 元素定义了一个Action执行后跳转到的结果页面或视图。

3.1.2 配置文件的继承与覆盖机制

Struts 2.0配置文件支持继承和覆盖机制,允许开发者将通用配置抽取到一个父 中,子 可以继承父 的配置,并通过 extends 属性指定其父

例如,你可以创建一个基础包 base-package 用于存放通用设置,然后其他包可以通过 extends="base-package" 继承这些设置。


    
    
        
    
    
        
    



    
    
        /success.jsp
        /error.jsp
    

在上述配置中, my-module 包继承了 base-package 包的配置,同时添加了特定的Action映射。

3.2 全局与局部配置的策略与实践

3.2.1 全局配置的范围与作用

全局配置是指影响整个Struts应用程序的配置,它通常定义在 元素之外或在根 元素中。全局配置适用于整个应用,除非在子包中被局部覆盖。

全局配置的一个常见用途是定义拦截器堆栈(interceptor stack),拦截器堆栈是一组拦截器的集合,它们可以被多个Action共享。定义全局拦截器堆栈可以简化Action的配置。


    
    
        
            
                
                
                
                
                
            
        
        
    

3.2.2 局部配置的优先级与灵活应用

局部配置是指仅对特定包或Action有效的配置。局部配置可以覆盖全局配置,提供灵活的定制能力。局部配置的优先级高于全局配置,确保了配置的灵活性和细粒度控制。

例如,你可以为特定包配置不同的拦截器或结果页面。


    
        
    
    
        /exampleSuccess.jsp
    

在上述配置中, my-module 包使用了自定义的拦截器堆栈 customStack ,并定义了特定的结果页面 exampleSuccess.jsp 。这些配置只在 my-module 包内有效,不会影响到其他包。

在进行配置时,应当注意以下几点:

  • 使用继承机制可以减少重复配置,保持配置的DRY(Don't Repeat Yourself)原则。
  • 在定义拦截器时,务必了解各个拦截器的作用,以避免不必要的性能开销。
  • 在配置结果页面时,应当考虑到不同结果页面的合理应用,以实现清晰的业务逻辑流程。

通过这种方式,Struts 2.0允许开发者以灵活的方式定制和优化应用程序的行为,以满足特定需求。

4. 拦截器(Interceptor)的作用与应用

拦截器(Interceptor)是Struts 2.0框架中的一个重要特性,它为开发者提供了一种灵活的机制来干预和修改Action的生命周期。通过拦截器,开发者可以在请求处理之前或之后插入自定义的处理逻辑,这使得代码更加模块化,有利于维护和重用。本章节将深入探讨拦截器的基础知识、自定义拦截器的创建过程以及在实际开发中的应用场景。

4.1 拦截器基础

拦截器在Struts 2.0框架中扮演着至关重要的角色。它本质上是一个实现了 Interceptor 接口的对象,能够在一个请求被处理之前或之后执行特定的逻辑。拦截器的工作原理和生命周期是理解其核心功能的基础。

4.1.1 拦截器的工作原理与生命周期

拦截器的工作原理与AOP(面向切面编程)的概念类似,它可以在方法执行前后添加额外的行为。Struts 2.0框架将请求传递给拦截器链,拦截器链按照定义的顺序处理请求,然后将请求传递给目标Action进行处理。处理完之后,响应沿着同样的链返回。

拦截器的生命周期包括以下几个步骤:

  1. 初始化(init):拦截器创建后,框架会调用 init 方法进行初始化。开发者可以在这个方法中进行资源的加载或初始化配置。
  2. 拦截(intercept):框架会在请求到达Action之前调用拦截器的 intercept 方法。这个方法决定了拦截器是否继续将请求传递给后续的拦截器或Action。
  3. 销毁(destroy):当拦截器不再使用时,框架会调用 destroy 方法进行清理工作。

4.1.2 标准拦截器的分类与作用

Struts 2.0框架提供了一系列的标准拦截器,它们被分为核心拦截器和用户拦截器。核心拦截器通常负责处理框架的基础设施任务,例如处理输入验证、文件上传、参数绑定等。用户拦截器则用于执行开发者自定义的逻辑,如安全检查、日志记录、性能监控等。

核心拦截器的一个常见例子是 ValidationInterceptor ,它在Action方法执行前调用验证器进行输入验证。 ParamsInterceptor 则负责将请求参数绑定到Action对象。

4.2 拦截器的自定义与使用场景

自定义拦截器允许开发者根据特定的业务需求来扩展或修改框架的行为。创建自定义拦截器的过程涉及实现拦截器接口并定义拦截器逻辑。下面将详细介绍自定义拦截器的创建步骤以及在实际项目中的应用实例。

4.2.1 创建自定义拦截器的步骤

  1. 实现拦截器接口:首先,需要实现 com.opensymphony.xwork2.interceptor.Interceptor 接口。通常,为了简便,可以继承 com.opensymphony.xwork2.interceptor.AbstractInterceptor 基类,这样只需实现 intercept 方法。 java public class MyCustomInterceptor extends AbstractInterceptor { @Override public String intercept(ActionInvocation invocation) throws Exception { // 自定义逻辑 return invocation.invoke(); } }

  2. 配置拦截器:在Struts 2.0的配置文件( struts.xml )中注册并配置拦截器。这包括为拦截器指定一个名称,并定义其属性(如果需要的话)。 xml

  3. 将拦截器添加到拦截器栈:定义拦截器栈,并将自定义拦截器添加到栈中。如果需要,还可以添加框架提供的标准拦截器。 xml

  4. 在Action配置中应用拦截器栈:最后,将定义好的拦截器栈应用到具体的Action中。 xml

4.2.2 自定义拦截器的应用策略与实例

自定义拦截器可以在Action执行前或执行后执行特定的业务逻辑,例如:

  • 安全检查 :在用户发起请求前,验证用户身份或权限。
  • 性能监控 :记录请求的处理时间和结果,用于性能分析。
  • 日志记录 :将用户的操作记录在日志文件中,便于后期审查或问题追踪。

以下是一个简单的安全检查拦截器实例:

public class SecurityInterceptor extends AbstractInterceptor {
    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        // 获取用户信息,例如从session中
        UserInfo user = (UserInfo) ServletActionContext.getRequest().getSession().getAttribute("user");

        // 检查用户是否登录以及权限是否足够
        if (user == null || !user.hasAccess(invocation.getAction().getClass())) {
            // 如果用户未登录或权限不足,抛出异常或重定向到登录页面
            return "login";
        }

        // 如果用户认证通过,则继续请求处理流程
        return invocation.invoke();
    }
}

配置文件和Action配置保持不变,只需要在 struts.xml 中添加该拦截器的声明,并在栈中引用即可。

以上内容详细介绍了拦截器在Struts 2.0框架中的作用和应用,包括拦截器的工作原理、标准拦截器的分类与作用,以及创建自定义拦截器的步骤和实例。通过实际操作,可以更好地理解拦截器的工作流程和在项目中的具体应用。

5. Struts 2.0核心包的实战应用技巧

5.1 OGNL表达式语言的实际应用

OGNL(Object-Graph Navigation Language)是Struts 2.0中用于访问和操作对象图的表达式语言。它能够让我们以非常简洁的方式获取和设置对象的属性,甚至执行更复杂的操作。

5.1.1 OGNL的基本语法与数据访问

OGNL的语法类似于EL表达式,但功能更为强大。OGNL支持直接访问对象属性、调用方法、访问静态方法和属性、以及支持集合操作等。

// 假设有一个User对象实例在值栈中
User user = new User();
user.setName("John");
user.setAge(30);
ActionContext.getContext().put("user", user);

在JSP页面,你可以使用OGNL访问这些值:

${user.name} // 输出 "John"
${user.age + 1} // 输出 "31"
${user.name.length()} // 输出 "4"

5.1.2 OGNL在Action与JSP中的高级应用

OGNL还可以用于类型转换、参数传递和执行简单的数据处理:

// 在Action中使用OGNL访问值栈中的值
String userName = (String) ActionContext.getContext().get("user.name");

// 在JSP页面执行更复杂的操作
${user.addresses[0].street}
${user.friends.?[age gt 25].size()}

5.2 Result类型与流程控制的最佳实践

Struts 2.0允许开发者根据实际需要选择和自定义Result类型,以控制Web应用的流程。

5.2.1 Result类型的选择与自定义

Struts 2.0提供了多种Result类型,如 dispatcher redirect redirectAction chain 等。针对不同的需求,开发者可以选择合适的Result类型。

/success.jsp
***

5.2.2 流程控制的逻辑与技巧

流程控制可以通过Action类中的逻辑判断实现,也可以利用Struts 2.0的拦截器栈进行控制。例如,在Action中执行条件判断并返回不同的结果:

if (condition) {
    return SUCCESS;
} else {
    return ERROR;
}

5.3 Tiles框架的布局模板整合技巧

Tiles是Apache的一个模板引擎,可以用来实现JSP页面的布局管理。

5.3.1 Tiles框架的基本概念与优势

Tiles框架允许开发者将页面分割成多个部分,每个部分可以单独设计和修改,提高页面的可维护性。


    
    
    

5.3.2 模板整合的实战案例分析

在实际应用中,可以通过定义多个Tiles模板来整合Struts 2.0应用:


    baseLayout

5.4 异常处理与国际化/本地化的实践策略

异常处理和国际化是构建Web应用时不可或缺的两个方面。

5.4.1 异常处理机制与日志记录

Struts 2.0中可以通过配置全局异常处理器来处理异常,并通过日志记录异常信息。


在Action中记录日志:

try {
    // business logic
} catch (Exception e) {
    LOG.error("Error in processing action", e);
    throw new Exception(e);
}

5.4.2 国际化/本地化的实现方法与工具

Struts 2.0支持国际化/本地化,开发者可以通过配置资源文件来实现。


在JSP页面引用国际化资源:

${getText('greeting')}

5.5 Ajax集成与json-plugin插件的实战应用

Ajax技术与Struts 2.0结合,可以为Web应用提供更加动态和交互式的用户体验。

5.5.1 Ajax在Struts 2.0中的集成方法

Ajax集成可以通过Struts 2.0的拦截器完成,例如使用 ajax/json 拦截器来处理Ajax请求:


    true

5.5.2 json-plugin插件的配置与使用技巧

json-plugin插件可以简化JSON数据的处理,开发者可以通过配置拦截器栈来使用它:


    never

5.6 注解配置的利弊与应用场景

注解配置为Struts 2.0提供了更加轻量级和便捷的配置方式。

5.6.1 注解配置的优势与使用限制

注解配置可以简化Action的配置,但过度使用可能会使代码难以阅读和维护。

@Action(value="example", results={
    @Result(name="success", type="dispatcher", location="success.jsp")
})
public class ExampleAction {
    // Action implementation
}

5.6.2 实际项目中的注解配置案例分析

在实际项目中,注解配置可以用于快速原型开发,但随着项目复杂度的增加,可能需要转向XML配置以保持清晰。

public class UserAction extends ActionSupport {
    private String username;
    private String password;
    @Action(value = "login", results = {
        @Result(name = "success", type = "dispatcher", location = "/welcome.jsp")
    })
    public String execute() {
        // login logic
        return SUCCESS;
    }
}

以上是对Struts 2.0核心包的实战应用技巧的详细介绍。开发者在使用时应该根据项目的具体需求选择合适的技术方案,并在实践中不断优化和调整。

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

简介:Struts 2.0是一个广泛使用的Java Web框架,基于MVC设计模式,简化了Web应用开发流程。它包含多个关键组件,如Action类、配置文件、拦截器、OGNL表达式语言等,支持国际化、异常处理和Ajax集成。开发者可以通过继承ActionSupport类实现业务逻辑,并利用配置文件定义Action映射和拦截器链。Struts 2.0还支持注解配置,提高了开发效率和代码质量,适用于需要构建可扩展、易维护的Java应用程序的场景。本课程将深入讲解Struts 2.0核心包的使用,帮助学生掌握框架的核心概念和实战技巧。

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

你可能感兴趣的:(Struts 2.0核心架构详解与实战应用)