Struts2 入门示例:从配置到请求处理的完整流程
Struts2 是一款经典的 Java Web MVC 框架,通过拦截器机制处理请求,将业务逻辑与视图展示分离。本文基于提供的示例代码,详细讲解 Struts2 的第一个应用如何搭建,包括核心依赖、配置文件、Action 类编写及请求访问流程。
环境准备与核心依赖
1. 导入 Struts2 核心包
使用 Maven 构建项目时,需在pom.xml中添加 Struts2 核心依赖:
1 | <dependency> |
该依赖包含 Struts2 的核心类(如拦截器、Action 支持类)和默认配置文件(如struts-default.xml)。
Web.xml 配置:Struts2 拦截器的注册
Struts2 通过拦截器接收所有 Web 请求,因此需在web.xml中配置其核心过滤器StrutsPrepareAndExecuteFilter:
1 |
|
作用:StrutsPrepareAndExecuteFilter是 Struts2 的入口,负责初始化框架环境、解析请求并分发到对应的 Action。
Struts.xml 配置:请求与 Action 的映射
struts.xml是 Struts2 的核心配置文件,用于定义请求路径、Action 映射及结果页面。示例配置如下:
1 |
|
配置详解:
<package>标签:name:包的唯一标识,用于其他包引用(如extends="helloWorld");namespace:请求路径的命名空间,与 Action 的name共同组成完整访问路径(如/userAction/test.action);extends="struts-default":继承 Struts2 内置的struts-default包,该包定义了默认拦截器、结果类型等核心配置。
<action>标签:name:Action 的名称,是请求路径的一部分(如test对应请求/userAction/test.action);class:Action 类的全类名(默认值为com.opensymphony.xwork2.ActionSupport);method:指定调用 Action 类中的方法(默认调用execute()方法)。
<result>标签:- 定义 Action 方法执行后的跳转页面,
name属性匹配方法返回的字符串(默认name="success"); type:跳转类型(默认dispatcher表示转发,redirect表示重定向,stream用于文件下载等)。
- 定义 Action 方法执行后的跳转页面,
Action 类编写:处理业务逻辑
Action 类是 Struts2 处理请求的核心,负责接收参数、执行业务逻辑并返回结果标识。示例代码如下:
1 | /** |
Action 类的规范:
- 属性命名:遵循 JavaBean 规范(私有属性 + 公共 getter/setter),便于 Struts2 通过 OGNL 表达式注入请求参数;
- 构造方法:必须有无参构造器(Struts2 通过反射创建 Action 实例);
- 方法返回值:通常返回
String类型的结果标识(如"success"、"error"),对应struts.xml中的<result>标签; - 线程安全:Struts2 为每个请求创建一个 Action 实例,因此无需考虑线程安全问题。
请求访问与流程解析
访问示例:
通过以下 URL 访问test Action:
1 | http://localhost:8080/struts/userAction/test.action?user.name=张三 |
流程解析:
- 请求到达:客户端请求被
StrutsPrepareAndExecuteFilter拦截; - 解析请求:Struts2 根据请求路径
/userAction/test.action,匹配namespace="/userAction"和name="test"的 Action; - 创建 Action:通过反射实例化
UserAction,并调用setUser()方法注入参数(user.name=张三); - 执行方法:调用
UserAction的test()方法,执行业务逻辑(打印用户名); - 结果跳转:
test()返回"success",Struts2 根据<result>配置转发至/pages/helloworld.html。
关键知识点总结
- 核心组件:
- 过滤器
StrutsPrepareAndExecuteFilter:请求入口; - 配置文件
struts.xml:定义请求映射与结果跳转; - Action 类:处理业务逻辑,接收参数并返回结果标识。
- 过滤器
- 请求路径组成:
完整访问路径 = 项目上下文路径 + namespace + action 名称 +.action
(示例:/struts+/userAction+/test+.action) - 参数传递:
Struts2 通过 OGNL 表达式自动将请求参数注入 Action 的属性(如user.name=张三对应User对象的name属性)。 - 结果类型:
dispatcher(默认):服务器内部转发(地址栏不变);redirect:重定向到页面(地址栏变化);redirectAction:重定向到另一个 Action;stream:用于文件下载。
常见问题与注意事项
依赖冲突:Struts2 的
struts2-core可能与其他框架(如 Spring)存在依赖冲突,需注意版本兼容性;拦截器问题:
url-pattern="/*"会拦截所有请求(包括 JSP),如需排除静态资源,可在struts.xml中配置:1
<constant name="struts.action.excludePattern" value="/css/.*?,/js/.*?,/images/.*?" />
Action 类规范:必须提供无参构造器和属性的 getter/setter,否则参数无法注入;
配置文件位置:
struts.xml需放在src/main/resources目录下(Maven 项目),确保编译后位于classes目录。
通过这个简单示例,我们了解了 Struts2 的基本工作流程:请求被拦截器捕获后,通过struts.xml映射到对应的 Action 处理,最终跳转至结果页面