本文还有配套的精品资源,点击获取
简介:Struts2是一个功能强大的Java Web应用程序框架,它遵循MVC架构设计,提供了丰富的特性,包括动作调度、国际化、异常处理和插件扩展。本文将通过官方实例深入分析Struts2的核心概念和配置细节,包括 struts.xml 配置文件、Action类、JSP页面、结果类型和拦截器等组件的实现。掌握这些知识对于开发高效、可维护的Java Web应用至关重要。
1. Struts2框架基础介绍
Struts2框架概述
Struts2是一个用于构建Java EE Web应用的强大框架。它基于MVC架构模式,将业务逻辑和用户界面分离,从而简化了复杂应用的开发和维护。Struts2框架集成了众多功能强大的组件,提供了丰富的标签库和插件支持,使得Web应用开发更加高效和标准化。
Struts2的工作流程
在Struts2框架中,用户发起的每个请求都经过以下几个主要阶段: 1. 用户在浏览器端发出HTTP请求。 2. 请求被Struts2的过滤器接收,并传递给Struts2框架进行处理。 3. 框架根据 struts.xml 配置文件中的映射规则,找到对应的Action类。 4. Action类处理请求逻辑,并返回一个结果字符串,框架根据结果字符串找到相应的视图页面展示给用户。
Struts2的架构组件
Struts2框架主要由以下几个核心组件构成: - 控制器(Controller) :核心控制器是 FilterDispatcher (在Struts 2.0之后被 StrutsPrepareAndExecuteFilter 替代),用于拦截请求并分发到相应的Action。 - 业务逻辑层(Action) :Action类负责处理业务逻辑并返回结果。 - 模型(Model) :通常由JavaBean或POJO(Plain Old Java Object)表示,用于封装数据。 - 视图(View) :由JSP、Velocity或FreeMarker模板等技术实现,用于展示数据和接收用户输入。
Struts2的架构设计使得开发者能够专注于业务逻辑的实现,而将用户界面的构建交给框架来处理,从而提高开发效率和应用质量。
2. Struts2拦截器工作原理
2.1 拦截器的基本概念
2.1.1 拦截器的定义及其作用
拦截器(Interceptor)是Struts2框架中一个非常重要的组成部分,其作用类似于AOP(面向切面编程)中的切点(Pointcut)和通知(Advice)。拦截器可以在目标方法执行前后或者执行过程中插入自定义的操作,例如验证、日志记录、权限检查等。它提供了一个可插拔的机制,允许开发者在不修改业务代码的情况下,扩展和改变框架和应用程序的行为。
2.1.2 拦截器与过滤器的区别
拦截器和过滤器(Filter)都是在请求处理之前进行的预处理,但它们之间存在几个关键的区别: - 范围不同:拦截器只对Struts2框架处理的请求有效,而过滤器可以对所有Web请求进行拦截。 - 使用方式不同:拦截器是在框架内部使用的,而过滤器是在Servlet容器级别使用的。 - 细粒度不同:拦截器可以更加细粒度地控制请求处理过程,因为它可以在Action执行前后进行拦截,而过滤器一般只在请求进入和离开Web应用时执行。 - 实现机制不同:拦截器是基于Java的动态代理或者AOP实现的,而过滤器是基于Servlet API实现的。
2.2 拦截器的生命周期
2.2.1 拦截器的初始化过程
拦截器的初始化过程分为几个步骤: 1. 拦截器类必须实现 Interceptor 接口或者继承自 AbstractInterceptor 。 2. 在 struts.xml 配置文件中声明拦截器,并为其指定一个唯一的名称。 3. 配置拦截器栈,将拦截器放入栈中以便在请求处理时使用。 4. 当拦截器被调用时,Struts2框架会创建拦截器实例并调用 init() 方法,进行初始化操作。
2.2.2 拦截器的执行流程
拦截器的执行流程大致如下: 1. 用户发起请求。 2. 请求被Struts2的 FilterDispatcher (或在Struts2 2.3.16以后的版本中是 StrutsPrepareAndExecuteFilter )捕获。 3. 过滤器将请求转发给Struts2框架,框架根据 struts.xml 配置文件解析请求URL,找到对应的action。 4. 在action执行前,框架根据配置的拦截器栈顺序调用各个拦截器的 intercept() 方法。 5. 如果 intercept() 方法返回 false ,则中断执行流程;否则,继续执行下一个拦截器,直到最后一个拦截器。 6. 执行完所有拦截器后,执行action的实际业务逻辑。 7. 最后,逆序执行拦截器的 after() 方法,返回响应给用户。
2.2.3 拦截器的销毁过程
拦截器的销毁过程是这样的: 1. 当Struts2应用关闭或者重新加载时,Struts2框架会调用拦截器的 destroy() 方法。 2. 在 destroy() 方法中,开发者可以进行清理资源的工作,比如关闭数据库连接或者文件句柄等。 3. 调用完成后,拦截器实例将被垃圾回收器回收。
2.3 自定义拦截器的创建与应用
2.3.1 自定义拦截器的步骤
创建自定义拦截器的步骤: 1. 创建拦截器类并实现 Interceptor 接口或继承 AbstractInterceptor 。 2. 实现 intercept() 方法,这是核心方法,用于定义拦截逻辑。 3. 实现 init() 和 destroy() 方法,分别为拦截器的初始化和销毁过程提供扩展点。 4. 在 struts.xml 文件中声明拦截器,指定名称和类路径。 5. 将拦截器添加到拦截器栈中,配置好执行顺序。 6. 在需要使用拦截器的action标签中引用拦截器栈。
2.3.2 拦截器链的应用示例
以下是一个简单的拦截器实现示例:
public class MyInterceptor implements Interceptor {
private String message;
public void init() {
// 初始化时执行的代码
System.out.println("Interceptor initialized");
}
public String intercept(ActionInvocation invocation) throws Exception {
// 拦截逻辑
System.out.println("Intercepted before action is executed: " + message);
String result = invocation.invoke(); // 继续执行action和后续拦截器
System.out.println("Intercepted after action is executed: " + message);
return result;
}
public void destroy() {
// 销毁时执行的代码
System.out.println("Interceptor destroyed");
}
public void setMessage(String message) {
this.message = message;
}
}
在 struts.xml 中配置拦截器:
Hello World
在上述示例中,我们定义了一个简单的 MyInterceptor 拦截器,它在 intercept() 方法中输出了一条消息,并通过 struts.xml 配置将其加入到 myStack 拦截器栈中。然后在 exampleAction 的配置中引用了这个拦截器栈,从而使得每次执行 exampleAction 时都会执行 MyInterceptor 的拦截逻辑。
3. struts.xml配置文件详解
在本章节中,我们将深入探讨Struts2框架中的核心配置文件 struts.xml 。这个配置文件对于整个应用的执行逻辑和行为起到决定性的作用。它不仅负责定义Action映射和结果类型配置,还管理着整个应用中namespace和package的组织方式。在理解了拦截器和Action类之后,深入解析 struts.xml 配置文件,能够帮助开发者对Struts2框架的理解达到一个新的层次。
3.1 配置文件的基础结构
struts.xml 配置文件是整个Struts2应用配置的核心。它遵循XML格式标准,允许开发人员通过元素的嵌套关系定义应用的行为和视图之间的映射关系。
3.1.1 常见配置元素介绍
在 struts.xml 中,我们经常会遇到如下几种配置元素:
3.1.2 配置文件的基本组织方式
在 struts.xml 中,配置信息是通过元素之间的嵌套关系来组织的。通常情况下,我们会定义一个或多个
在上述配置中,我们定义了一个名为 default 的package,并继承了默认的 struts-default 包。然后我们创建了一个名为 hello 的Action,当该Action执行成功时,会返回 /helloWorld.jsp 页面作为结果。
3.2 namespace和package的作用与配置
在Struts2中,namespace和package的配置对于管理和组织Action的映射至关重要。它们为Action提供了命名空间,使得相同名称的Action可以在不同的namespace下独立存在。
3.2.1 namespace的作用和配置要点
Namespace是Struts2中用于区分不同Action映射的逻辑组的概念。它可以帮助开发人员将Action映射到不同的视图,实现模块化管理。配置namespace时,通常需要指定其 name 属性。
在上述配置中,我们为名为 admin 的package定义了一个 /admin 的namespace。这意味着所有在这个package下定义的Action都将以 /admin 为前缀。
3.2.2 package的配置和管理
在这个例子中,我们为用户模块定义了一个名为 user 的package,它拥有 /user 的namespace,并继承自默认的 struts-default 包。这样,它就拥有了继承的Action以及自己定义的Action。
3.3 action映射与结果配置
Action映射和结果配置是 struts.xml 中的核心部分,它们定义了用户请求与业务处理之间的关联关系以及处理结果的呈现方式。
3.3.1 action的配置方法
Action是Struts2处理用户请求的核心组件。每个Action都映射到一个URL上,当用户发起请求时,Struts2框架会根据 struts.xml 中的配置,将请求转发给相应的Action类进行处理。
在这个例子中,我们定义了一个名为 addUser 的Action映射,用户在提交 addUser 请求后,Struts2会创建 AddUserAction 类的实例,并根据执行结果,返回不同的结果视图。
3.3.2 结果类型(Result Type)的配置与应用
Struts2框架提供了多种结果类型(Result Types),允许开发人员以不同的方式呈现Action的执行结果。常见的结果类型包括 dispatcher 、 redirect 、 chain 等。
在上述配置中,我们定义了三种不同的结果类型。第一种使用 dispatcher ,表示页面会被分发到指定的JSP页面。第二种使用 redirect ,表示客户端会被重定向到指定的URL。第三种使用 chain ,表示执行另一个Action。
通过本章节的介绍,我们已经深入了解了 struts.xml 配置文件的结构、namespace和package的配置方法,以及Action映射与结果类型配置的使用。这为进一步深入学习Struts2框架提供了坚实的基础。在下一章节中,我们将学习如何通过Action类在Struts2框架中扮演的角色,并探索Action的生命周期以及异常处理机制。
4. Action类在Struts2中的角色
4.1 Action类的定义与作用
4.1.1 Action接口的介绍
在Struts2框架中,Action类扮演着应用程序逻辑的核心角色。一个Action类通常负责接收用户的输入,处理业务逻辑,并且返回一个结果,这个结果决定了下一个页面的跳转。Action接口是Struts2的核心接口之一,它的职责主要是提供一个执行点,用于拦截器调用执行业务逻辑。
一个典型的Action接口实现类会有如下特点:
实现Action接口,这要求实现一个 execute() 方法。 可能会实现 ModelDriven 接口,以便直接与模型对象进行交互。 可能会实现 ValidationAware 接口,以便在业务逻辑执行时可以添加验证消息。 可能会实现 TextProvider 接口,以便支持本地化消息的处理。
public class MyAction implements Action {
@Override
public String execute() throws Exception {
// 实现业务逻辑
return SUCCESS; // 或者其他结果字符串
}
}
4.1.2 ActionContext的作用与使用
ActionContext是Struts2中用于存储Action的运行环境的容器。它包括了请求、会话和应用程序范围的属性,以及一个值栈。ActionContext提供了一个线程安全的方式来访问和操作这些数据,它使得Action类在处理请求时能够共享数据。
要使用ActionContext,首先应该在Action类中通过 ActionContext.getContext() 获取实例。之后,可以通过 put 和 get 方法来向值栈中存取数据。
public class MyAction implements Action {
@Override
public String execute() throws Exception {
ActionContext context = ActionContext.getContext();
context.put("key", "value"); // 存入值
String value = (String) context.get("key"); // 读取值
return SUCCESS;
}
}
4.2 Action的生命周期
4.2.1 Action的创建与销毁过程
Struts2框架使用了拦截器模式来管理Action的生命周期。这意味着Action实例化发生在拦截器链执行的某个点上。具体来说,当用户提交请求时,Struts2的 ActionProxy 创建一个Action实例,并且通过拦截器链来处理请求。在请求处理结束后,如果Action实现了 Disposable 接口,那么会调用其 destroy() 方法进行清理。
通常,开发人员不需要手动管理Action的生命周期,这是由Struts2框架自动处理的。
4.2.2 在Action中获取和设置数据
在Struts2中,数据通常是在Action与视图之间传输的。Action中的数据通常通过属性的getter和setter方法来获取和设置。这些属性可以在表单提交时被框架自动填充,也可以在Action内部计算后存储。
为了使***2能够自动填充Action中的属性,通常需要使用注解 @Action 来指定请求参数与Action属性的映射关系。此外, @Attributest 注解也可以用来说明哪些属性需要从请求中自动填充。
public class MyAction implements Action {
private String myProperty;
public String getMyProperty() {
return myProperty;
}
public void setMyProperty(String myProperty) {
this.myProperty = myProperty;
}
@Override
public String execute() throws Exception {
// Action逻辑
return SUCCESS;
}
}
4.3 Action的异常处理
4.3.1 Struts2异常机制概述
Struts2框架提供了丰富的异常处理机制,使得开发者可以捕获并处理各种级别的异常。框架本身使用拦截器链来管理异常。当Action执行过程中抛出异常时,异常会沿着拦截器链回传,直到被某个拦截器捕获或者到达链的末尾。
在Struts2中,可以定义自己的异常处理器来拦截并处理异常。这些处理器可以自定义,也可以使用框架提供的默认处理器。
4.3.2 自定义异常处理器的实现
为了实现自定义的异常处理器,需要实现 ExceptionMapper 接口。这个接口有一个 handle() 方法,需要在其中编写异常处理逻辑。然后,需要在struts.xml配置文件中指定这个异常处理器。
public class MyExceptionHandler implements ExceptionMapper
@Override
public String handle(MyException e) {
// 处理异常逻辑
// 返回结果字符串
}
}
在 struts.xml 中配置异常处理器:
在上面的配置中,当 com.example.MyException 异常被抛出时,Struts2将会显示 errorPage 页面。
通过这种方式,Struts2提供了强大的异常处理能力,让开发人员可以灵活地处理程序中可能出现的各种异常情况。
5. 官方实例Struts2Test分析
5.1 实例Struts2Test的功能介绍
5.1.1 Struts2Test的功能概述
Struts2Test是一个官方提供的简单实例,用于演示Struts2框架的基本应用。它通常包含一个简单的登录功能,通过这个实例,我们可以了解Struts2框架如何处理HTTP请求、如何与后端逻辑交互以及如何将结果返回到前端视图。此外,Struts2Test也展示了如何使用Struts2的拦截器机制进行请求处理和数据校验。
5.1.2 代码结构和主要组件解析
实例的代码结构遵循了MVC设计模式,主要分为以下几个部分: - Model(模型) :代表应用程序的数据结构。在Struts2Test中,模型通常是一个JavaBean,例如用户实体(User)。 - View(视图) :负责展示数据和接收用户输入。对于Struts2Test,视图可能是JSP页面,用于显示登录表单和错误信息。 - Controller(控制器) :处理用户请求并调用相应的业务逻辑。这里的控制器主要是Action类,例如LoginAction。
5.2 实例中的配置解析
5.2.1 配置文件的关键配置点分析
在 struts.xml 配置文件中,关键配置点包括定义Action类,指定Result结果以及拦截器的使用。一个典型的配置示例如下:
5.2.2 Action与视图的对应关系
在Struts2Test中,Action与视图之间的对应关系是通过 struts.xml 文件中的
例如,在LoginAction中,如果登录成功,Action返回 "success" ,那么根据上述
5.3 实例的运行流程剖析
5.3.1 请求的处理流程
当用户在Struts2Test的登录页面提交表单时,请求首先由Struts2框架拦截,框架根据 struts.xml 中的定义查找对应的Action配置。请求参数被封装成一个Action实例,拦截器栈按顺序对请求进行处理,如参数校验、日志记录等。处理完毕后,Action执行业务逻辑,并根据业务逻辑返回相应的结果值。
5.3.2 数据的传递和展示逻辑
在登录场景中,用户提交的用户名和密码通常需要传递到后端进行验证。Struts2提供了一种称为OGNL(Object-Graph Navigation Language)的表达式语言来实现数据的绑定和传递。例如:
private String username;
private String password;
public String execute() {
// 此处省略验证逻辑
return SUCCESS;
}
在JSP视图中,可以通过OGNL表达式 %{username} 和 %{password} 来访问这些数据。如果登录失败,Action会返回 "input" 结果,请求将重新渲染登录页面,并将之前用户输入的用户名和密码值填充到表单中。如果登录成功,则会跳转到欢迎页面,并展示成功信息。
通过分析Struts2Test这个实例,我们可以更加深刻地理解Struts2框架的工作流程和配置方式,为开发复杂应用打下坚实的基础。
本文还有配套的精品资源,点击获取
简介:Struts2是一个功能强大的Java Web应用程序框架,它遵循MVC架构设计,提供了丰富的特性,包括动作调度、国际化、异常处理和插件扩展。本文将通过官方实例深入分析Struts2的核心概念和配置细节,包括 struts.xml 配置文件、Action类、JSP页面、结果类型和拦截器等组件的实现。掌握这些知识对于开发高效、可维护的Java Web应用至关重要。
本文还有配套的精品资源,点击获取