struts2第一个示例
Struts2 入门示例:从配置到请求处理的完整流程
Struts2 是一款经典的 Java Web MVC 框架,通过拦截器机制处理请求,将业务逻辑与视图展示分离。本文基于提供的示例代码,详细讲解 Struts2 的第一个应用如何搭建,包括核心依赖、配置文件、Action 类编写及请求访问流程。
环境准备与核心依赖
1. 导入 Struts2 核心包
使用 Maven 构建项目时,需在pom.xml中添加 Struts2 核心依赖:
<dependency>
<groupId>org.apache.struts</groupId>
<artifactId>struts2-core</artifactId>
<version>2.5.22</version> <!-- 版本需根据实际需求选择 -->
</dependency>
该依赖包含 Struts2 的核心类(如拦截器、Action 支持类)和默认配置文件(如struts-default.xml)。
Web.xml 配置:Struts2 拦截器的注册
Struts2 通过拦截器接收所有 Web 请求,因此需在web.xml中配置其核心过滤器StrutsPrepareAndExecuteFilter:
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<!-- 配置Struts2核心过滤器 -->
<filter>
<filter-name>struts2</filter-name>
<!-- Struts2.5+使用该类作为过滤器,旧版本可能为org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter -->
<filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<!-- 拦截所有请求(/*表示包括JSP、Servlet、静态资源等) -->
<url-pattern>/*</url-pattern>
</filter-mapping>
</web-app>
作用:StrutsPrepareAndExecuteFilter是 Struts2 的入口,负责初始化框架环境、解析请求并分发到对应的 Action。
Struts.xml 配置:请求与 Action 的映射
struts.xml是 Struts2 的核心配置文件,用于定义请求路径、Action 映射及结果页面。示例配置如下:
<struts>
<!-- 定义一个包(模块),继承struts-default以使用默认配置 -->
<package name="helloWorld" namespace="/userAction" extends="struts-default">
<!-- 第一个Action:无自定义类,使用默认ActionSupport -->
<action name="helloworld">
<!-- 结果页:请求成功后跳转至/pages/helloworld.html -->
<result>/pages/helloworld.html</result>
</action>
<!-- 第二个Action:关联自定义UserAction的test方法 -->
<action name="test" class="com.zhanghe.study.action.UserAction" method="test">
<result>/pages/helloworld.html</result>
</action>
</package>
</struts>
配置详解:
<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 处理请求的核心,负责接收参数、执行业务逻辑并返回结果标识。示例代码如下:
/**
* UserAction:处理用户相关请求的Action类
*/
public class UserAction {
// 接收请求参数(需遵循JavaBean规范,提供getter和setter)
private User user;
// getter和setter方法(Struts2通过OGNL表达式自动注入参数)
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
/**
* 自定义Action方法:处理test请求
* @return 结果标识(需与struts.xml中<result>的name匹配)
*/
public String test() {
// 业务逻辑:打印接收的参数
System.out.println("用户名:" + user.getName());
return "success"; // 对应struts.xml中<result>的默认name
}
}
// 实体类User(JavaBean)
class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Action 类的规范:
- 属性命名:遵循 JavaBean 规范(私有属性 + 公共 getter/setter),便于 Struts2 通过 OGNL 表达式注入请求参数;
- 构造方法:必须有无参构造器(Struts2 通过反射创建 Action 实例);
- 方法返回值:通常返回
String类型的结果标识(如"success"、"error"),对应struts.xml中的<result>标签; - 线程安全:Struts2 为每个请求创建一个 Action 实例,因此无需考虑线程安全问题。
请求访问与流程解析
访问示例:
通过以下 URL 访问test Action:
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中配置:<constant name="struts.action.excludePattern" value="/css/.*?,/js/.*?,/images/.*?" />Action 类规范:必须提供无参构造器和属性的 getter/setter,否则参数无法注入;
配置文件位置:
struts.xml需放在src/main/resources目录下(Maven 项目),确保编译后位于classes目录。
通过这个简单示例,我们了解了 Struts2 的基本工作流程:请求被拦截器捕获后,通过struts.xml映射到对应的 Action 处理,最终跳转至结果页面