深入理解Struts2框架:API文档指南

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

简介:Struts2是Java Web开发领域中广泛使用的框架,旨在简化MVC架构实现并提供强大的控制层。开发者可以通过Struts2 API文档详细掌握其核心组件、接口及方法,包括Action类、ActionContext、Interceptor、Result、ValueStack等,以构建可扩展、表现力强的应用程序。文档还提供了关于拦截器、结果类型、配置文件等方面的详细信息,是掌握Struts2框架的必备资源。 Struts2帮助文档API

1. Struts2框架概述

Struts2作为一款流行的Java Web框架,它结合了MVC架构模式的优势,提供了一种简洁而高效的开发模式,极大地简化了基于Web的应用开发。从Struts1进化而来,Struts2不仅解决了早期版本中的许多缺陷,还引入了诸如拦截器(Interceptor)、值栈(ValueStack)等创新特性,使得Web应用开发更加模块化和可维护。

1.1 Struts2的架构特点

Struts2框架采用了WebWork框架的核心理念,引入了拦截器栈(interceptor stack)的设计,极大地提高了应用的灵活性和扩展性。它支持多种结果类型(Result types),方便了与JSP、FreeMarker、Velocity等模板引擎或直接生成HTML、XML等格式的响应。

1.2 Struts2的主要组件

Struts2的核心组件包括Action、Interceptor、Result、ValueStack等,每个组件都有其特定的角色和职责。Action作为MVC模式中的C(控制器),是处理请求和封装结果的主要承载对象;Interceptor则用于提供一种声明式的服务和横切关注点(cross-cutting concerns);Result负责将Action处理结果渲染到客户端。

1.3 Struts2与传统Struts1的区别

相比于传统Struts1,Struts2在设计上更加现代化,提供了更为灵活和强大的功能。Struts2支持POJO Action,无需继承任何框架特定的类;其拦截器机制也让开发者能够轻松地插拔功能模块。在性能方面,Struts2经过优化,在处理大型应用时表现更为出色。

Struts2的发展历程和架构设计,为Java开发者提供了一种高效的Web开发模式,成为了Java EE技术栈中的重要组成部分。了解和掌握Struts2的基本概念和核心组件,是深入学习该框架的基础,也是构建稳固Web应用的开端。

2. 深入理解Action类

2.1 Action类的角色和职责

2.1.1 Action类在MVC中的定位

Action类在Struts2框架中扮演了控制器(Controller)的角色,是MVC(Model-View-Controller)架构中的核心组件之一。它负责接收用户的请求,并根据请求内容调用相应的业务逻辑,最后将处理结果返回给客户端。Action类连接用户界面(View)和业务处理(Model),是两者之间数据交互的桥梁。

在MVC模式中,Action类的作用可以进一步细化为:

  • 请求分发 :Action类根据用户的输入决定执行哪一个业务逻辑。
  • 数据处理 :Action类负责处理从视图层接收的数据,包括验证数据的合法性、业务数据的封装等。
  • 结果呈现 :处理完毕后,Action类将结果返回给前端视图,完成业务逻辑与显示逻辑的分离。

2.1.2 Action类与业务逻辑的关联

Action类直接与业务逻辑代码紧密相关。在实际开发中,为了保持代码的可维护性和可测试性,应该遵循单一职责原则,将业务逻辑抽取到单独的Service类中。Action类仅作为业务逻辑与前端交互的接口。

Action类与业务逻辑的关联主要体现在:

  • 调用Service层 :Action类通常调用Service类(或其他业务层组件)来执行具体的业务逻辑。
  • 数据传输 :Action类负责将从视图层接收到的数据传递给业务层,并将业务处理结果封装回ActionContext或ValueStack供视图层使用。

2.2 Action类的实现细节

2.2.1 Action类的继承结构

Struts2框架中的Action类通常继承自 com.opensymphony.xwork2.ActionSupport 类,该类提供了许多默认的实现和方便的属性和方法,例如: execute() 方法用于执行业务逻辑, getText() 用于国际化文本获取等。

继承结构的好处在于:

  • 代码复用 :继承自ActionSupport类,Action类可以复用父类中已实现的功能,无需从零开始编写。
  • 统一API :Action类实现的接口或继承的基类可以为Struts2框架提供统一的API进行交互。

2.2.2 Action类的方法签名和返回类型

Action类中定义的方法需要符合一定的签名,以便Struts2框架能够正确地识别并调用。一个典型的Action方法签名如下:

public String execute() throws Exception {
    // 业务逻辑实现
    return SUCCESS;
}
  • 方法签名 :方法名为 execute ,但也可以是其他遵循命名规则的方法名,如 perform 等。
  • 返回类型 :方法返回类型通常是 String ,它代表了处理请求后的返回结果。返回值如 SUCCESS ERROR INPUT 等,都会被框架映射到具体的Result。

2.2.3 Action类中的数据封装

Action类中通常会定义多个属性,这些属性用于封装从前端视图传递过来的数据或传递给视图的数据。这些属性通过getter和setter方法与外部进行交互。

数据封装的作用包括:

  • 数据传递 :将从视图层获取的数据传递给业务逻辑层。
  • 状态保存 :保存业务逻辑处理过程中的状态,以便在不同阶段或结果页面中使用。
  • 表单验证 :利用Action类中的属性进行输入验证,并将验证结果反馈给视图层。

2.2 Action类在数据传递中的应用

Action类作为数据传递的中心,其属性不仅用于存储数据,还会在不同层级(如View和Model)之间传输数据。属性通过ActionContext和ValueStack机制实现数据的存取。

. . . 通过ActionContext传递数据

ActionContext是Struts2框架提供的一种上下文对象,它在Action类的生命周期内是唯一的。通过ActionContext,Action类可以访问框架提供的各种资源,例如ValueStack。

  • 数据访问 :ActionContext可以访问到Action类的属性值。
  • 线程安全 :在Struts2中,ActionContext并不是线程安全的。如果Action类中的某个方法会被多个线程同时访问,那么需要在Action类中手动进行线程同步。

. . . 通过ValueStack进行数据交互

ValueStack是一个值栈,它是一个数据结构,用于在Action类和其他组件之间共享数据。ValueStack在Action类中的作用主要体现在以下几个方面:

  • 数据共享 :ValueStack提供了一种机制,使得Action类中的属性可以被其他组件,如拦截器、结果页面等访问。
  • 操作便利性 :通过值栈可以进行数据的存取操作,如推入(push)、弹出(pop)等。

要使用ValueStack进行数据操作,可以在Action类中这样进行:

// 推入数据到ValueStack
ActionContext.getContext().getValueStack().push("data");
// 从ValueStack中弹出数据
Object data = ActionContext.getContext().getValueStack().pop();

代码逻辑分析

  • ActionContext.getContext() 获取当前Action的上下文对象。
  • getValueStack() 获取当前上下文关联的ValueStack对象。
  • push() pop() 方法实现了数据的存取操作。

通过上述方法,Action类可以灵活地在ValueStack中管理数据,实现数据在不同层间的共享和传递。这种方式在处理表单数据和封装业务逻辑结果时尤为有用。

3. ActionContext与数据传递

3.1 ActionContext的作用

3.1.1 ActionContext与线程安全

ActionContext作为Struts2框架中用于存储Action数据和请求属性的上下文,是实现Struts2框架线程安全的关键组件之一。在Struts2中,由于每个Action操作都是在独立的线程中执行的,因此ActionContext提供了一种方式来确保在多线程环境下用户请求数据的安全传递。通过ActionContext,Action可以安全地访问与特定请求相关联的属性,而无需担心数据在并发请求间出现冲突。

3.1.2 ActionContext中的属性传递

ActionContext负责管理和传递请求期间生成的数据。它持有请求相关的数据,如表单字段值、Action实例引用、结果消息、临时数据等,并将这些数据以Map的形式组织起来。开发者可以在此Map中存取数据,从而实现数据的传递。例如,在Action类中,可以直接通过ActionContext访问用户输入的数据,或者在拦截器中设置属性值供后续的Action处理。

3.2 ActionContext的实现机制

3.2.1 ActionContext的数据结构

ActionContext的内部实现采用了Map接口,它为开发者提供了一个键值对的集合来存储请求相关的数据。这些数据通过ActionContext被传递给ValueStack,后者是一个由Struts2框架管理的,用于在Action和视图之间共享数据的栈结构。因此,ActionContext中存储的数据可以被不同的组件在执行流程中访问和操作。

3.2.2 ActionContext与ValueStack的关系

ActionContext和ValueStack之间有着密切的联系。ValueStack作为存储和传递Action数据的核心结构,其内容实际上是从ActionContext中获取的。当Action执行完毕后,将数据压入ValueStack中,然后结果类型(Result)根据ValueStack中的内容来进行视图的渲染和跳转。因此,ActionContext在数据的传递和流程控制中起到了桥梁的作用。

3.3 数据传递的实践技巧

3.3.1 传递请求数据到ActionContext

在Struts2中,开发者可以通过OGNL(Object-Graph Navigation Language)表达式在配置文件中将请求数据绑定到ActionContext。例如,在 struts.xml 中配置Action时,可以使用 param 标签将请求参数映射到ActionContext中:

<action name="exampleAction" class="com.example.ExampleAction">
    <param name="exampleParam">value</param>
</action>

然后在Action类中,可以通过ActionContext访问这些参数:

public class ExampleAction extends ActionSupport {
    public String execute() {
        ActionContext context = ActionContext.getContext();
        String exampleParam = (String) context.get("exampleParam");
        // 使用exampleParam进行业务处理
        return SUCCESS;
    }
}

3.3.2 ActionContext与Action类数据交互

Action类可以直接操作ActionContext中的数据。在Action的执行流程中,例如在 execute 方法执行前,Struts2框架会将从请求中获取的数据和Action类的属性进行绑定。开发者可以利用这一点,在Action类中操作这些数据:

public class ExampleAction extends ActionSupport {
    private String exampleProperty;

    public String getExampleProperty() {
        return exampleProperty;
    }

    public void setExampleProperty(String exampleProperty) {
        this.exampleProperty = exampleProperty;
    }

    public String execute() {
        ActionContext context = ActionContext.getContext();
        context.put("exampleProperty", exampleProperty);
        // 在执行流程的其他部分中,可以通过context.get("exampleProperty")获取
        return SUCCESS;
    }
}

通过这种方式,ActionContext不仅保证了数据的安全性,还提供了一个高效的数据传递机制。

4. Interceptor的深入探索

拦截器(Interceptor)是Struts2框架中一个重要的特性,它允许开发者在请求处理的某个阶段插入自定义的处理逻辑。本章将探讨Interceptor的基本概念,自定义Interceptor的实践,以及内置Interceptor的原理和应用。

4.1 Interceptor的基本概念

Interceptor是Struts2框架中用于拦截请求处理链的组件。理解它们的概念对于开发一个高效、可维护的应用程序至关重要。

4.1.1 拦截器与过滤器的区别

在深入Interceptor之前,有必要理解它与Servlet过滤器(Filter)的区别。虽然它们都可以用于拦截请求,但它们在生命周期、使用方式和灵活性上有所不同。

  • 生命周期 :过滤器的生命周期与Web容器绑定,而Interceptor的生命周期与Struts2框架紧密相关。
  • 使用方式 :过滤器可以在所有URL请求中使用,而Interceptor仅在Struts2框架处理的请求中执行。
  • 灵活性 :Interceptor提供了更多的灵活性,允许在Action执行前后插入额外的处理逻辑。

4.1.2 拦截器的生命周期和执行顺序

Interceptor的生命周期从创建到销毁的每个阶段都定义了回调方法。主要的生命周期方法包括:

  • init() :Interceptor被创建时调用一次。
  • intercept() :当请求到达Action之前调用此方法。
  • destroy() :Interceptor被销毁时调用一次。

Interceptor的执行顺序基于它们在struts.xml中的声明顺序。在实际应用中,可以通过配置文件指定Interceptor的顺序,从而控制它们的执行流程。

4.2 自定义Interceptor的实践

开发自定义Interceptor可以实现业务逻辑的重用和分离关注点,提高代码的清晰度和可维护性。

4.2.1 创建自定义Interceptor类

首先,创建一个实现 com.opensymphony.xwork2.interceptor.Interceptor 接口的类。可以通过继承 com.opensymphony.xwork2.interceptor.AbstractInterceptor 类简化开发,因为 AbstractInterceptor 已经提供了默认的 intercept() 方法实现。

public class CustomInterceptor extends AbstractInterceptor {
    private String name;

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

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        // 在Action调用之前执行
        System.out.println("Interceptor before action: " + name);

        // 调用下一个Interceptor或Action
        String result = invocation.invoke();

        // 在Action调用之后执行
        System.out.println("Interceptor after action: " + name);

        return result;
    }
}

4.2.2 实现Interceptor接口的方法

intercept() 方法是Interceptor的核心,它接收一个 ActionInvocation 对象。通过这个对象,可以调用下一个Interceptor或Action,并获取返回的结果。

4.2.3 配置和使用自定义Interceptor

struts.xml 中注册并配置自定义Interceptor:

<interceptors>
    <interceptor name="customInterceptor" class="com.example.CustomInterceptor"/>
    <interceptor-stack name="customStack">
        <interceptor-ref name="customInterceptor"/>
        <!-- 添加其他Interceptor -->
    </interceptor-stack>
</interceptors>

<action name="myAction" class="com.example.MyAction">
    <interceptor-ref name="defaultStack"/>
    <interceptor-ref name="customStack"/>
</action>

上面的配置将 customInterceptor 添加到一个名为 customStack 的Interceptor栈中,然后在 myAction 上应用这个栈。

4.3 内置Interceptor的原理与应用

Struts2提供了许多内置Interceptor,它们各自实现了特定的功能,并且可以根据需要进行配置。

4.3.1 常见内置Interceptor的功能介绍

Struts2内置了诸如 params conversionError Prepare 等Interceptor。例如:

  • paramsInterceptor :处理请求参数到Action属性的映射。
  • conversionErrorInterceptor :处理类型转换错误。

4.3.2 内置Interceptor的配置方法

配置内置Interceptor和自定义Interceptor类似,但通常它们已经在框架的默认栈 defaultStack 中配置好了。

<interceptors>
    <interceptor-ref name="defaultStack"/>
</interceptors>

4.3.3 自定义Interceptor与内置Interceptor的协同工作

自定义Interceptor可以与内置Interceptor协同工作,以实现复杂的业务逻辑。通过在 struts.xml 中配置Interceptor栈,可以控制调用顺序。

<interceptor-ref name="myCustomStack">
    <param name="customInterceptor">value</param>
</interceptor-ref>

通过这种方式,开发者可以灵活地在请求处理过程中插入自定义逻辑,同时利用框架提供的便利性。

表格展示常用Interceptor的配置和功能

| Interceptor | 描述 | |----------------------|--------------------------------------------------------------| | params | 处理请求参数到Action属性的映射。 | | conversionError | 处理类型转换错误。 | |Prepare | 在Action执行前进行数据准备。 | | i18n | 管理多语言资源文件。 | | modelDriven | 处理实现了ModelDriven接口的Action中的模型对象。 | | timer | 记录Action执行时间。 | | staticParams | 添加静态参数到值栈。 | | scope | 在会话或应用程序作用域内共享Action实例。 | | servletConfig | 提供对原始HttpServletRequest和HttpServletResponse的访问。 | | execAndWait | 处理长时间运行操作的进度显示和等待。 |

通过本章节的介绍,我们理解了Interceptor的基本概念和作用,自定义Interceptor的创建和配置,以及如何与内置Interceptor协同工作。了解这些内容将帮助开发者有效地利用Struts2框架的功能,为Web应用的开发提供强大的支持。

5. Result类型与视图技术

在Struts2框架中,Result类型扮演着将业务逻辑处理后的数据呈现给用户的角色。一个Action执行完成后,需要将结果返回给客户端,这个过程中Result类型起到了关键作用。本章节将深入探讨Result的类型和用途,以及如何通过ValueStack实现数据共享。

5.1 Result的类型和用途

5.1.1 Result的基本类型介绍

Struts2框架为开发者提供了多种Result类型,以便以不同的方式返回结果。常见的Result类型包括:

  • dispatcher :默认的Result类型,用于转发请求到一个JSP页面或其他资源。
  • chain :用于将请求链式转发到另一个Action。
  • redirect :用于重定向到一个外部URL。
  • redirectAction :类似于 redirect ,但是它重定向到另一个Action。
  • stream :用于将文件流作为响应返回给客户端。
  • velocity :用于生成Velocity模板。

此外,Struts2允许开发者实现自定义Result类型,以满足特定的业务需求。

5.1.2 Result与视图技术的结合

Result类型通常与视图技术相结合,以呈现最终结果。例如,使用 dispatcher Result类型可以将用户请求转发到一个JSP页面,而 velocity Result类型则将处理结果通过Velocity模板渲染后呈现给用户。

在实现视图层时,可以利用Struts2的标签库,这是一组专门用于构建Web界面的标签,可以简化JSP页面的开发。

5.2 自定义Result类型

5.2.1 创建自定义Result类

要创建一个自定义的Result类型,首先需要实现 com.opensymphony.xwork2.Result 接口。例如,创建一个简单的JSON Result类型,可以这样开始:

public class JsonResult implements Result {
    @Override
    public void execute(ActionInvocation invocation) throws Exception {
        // 获取ActionContext和值栈
        ActionContext context = invocation.getInvocationContext();
        ValueStack stack = context.getValueStack();

        // 获取Action的结果对象
        Object result = stack.findValue("result");

        // 创建JSON响应
        String jsonResponse = new Gson().toJson(result);

        // 将JSON响应输出到响应流
        HttpServletResponse response = ServletActionContext.getHttpServletResponse();
        response.setContentType("application/json");
        PrintWriter out = response.getWriter();
        out.print(jsonResponse);
        out.flush();
        out.close();
    }
}

5.2.2 实现Result接口的方法

在上面的 JsonResult 实现中, execute 方法是核心,它负责获取Action的结果对象并将其转换为JSON格式,最后将结果输出到HTTP响应流中。

5.2.3 自定义Result在项目中的应用案例

假设有一个 ProductAction ,它返回一个 Product 对象。在 struts.xml 中配置自定义的 JsonResult ,如下:

<action name="getProduct" class="ProductAction">
    <result type="jsonResult">/product.jsp</result>
</action>

这样,当 ProductAction 执行完成时,它会使用 JsonResult 来输出一个JSON格式的产品信息,而不是跳转到一个JSP页面。

5.3 ValueStack与数据共享

5.3.1 ValueStack的工作机制

ValueStack是Struts2框架中用于存储和操作Action上下文数据的核心机制。它类似于一个栈结构,提供了操作数据的方法,比如 push pop findValue 等。

5.3.2 ValueStack与ActionContext的交互

ActionContext为ValueStack提供了一个代理,它提供了访问和操作ValueStack的方法。在Action执行过程中,所有的数据交互都是通过ActionContext与ValueStack协作完成的。

5.3.3 ValueStack在数据共享中的作用

ValueStack可以用于在不同的Action之间共享数据。例如,可以在一个Action中将数据推入ValueStack,然后在另一个Action中检索这些数据。

// 在Action中将数据推入ValueStack
ActionContext.getContext().getValueStack().push(someObject);

// 在另一个Action中检索数据
Object someObject = ActionContext.getContext().getValueStack().findValue("someObject");

ValueStack的使用大大增强了Action之间的通信能力,使得数据处理更加灵活。

以上内容详细介绍了Struts2框架中的Result类型及其用途,包括如何创建和应用自定义Result类型,以及ValueStack在数据共享方面的重要性。通过以上知识点,您可以更好地理解和掌握Struts2的高级特性,为开发复杂的Web应用提供更强大的支持。

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

简介:Struts2是Java Web开发领域中广泛使用的框架,旨在简化MVC架构实现并提供强大的控制层。开发者可以通过Struts2 API文档详细掌握其核心组件、接口及方法,包括Action类、ActionContext、Interceptor、Result、ValueStack等,以构建可扩展、表现力强的应用程序。文档还提供了关于拦截器、结果类型、配置文件等方面的详细信息,是掌握Struts2框架的必备资源。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值