0%

struts2第一个示例

Struts2 入门示例:从配置到请求处理的完整流程

Struts2 是一款经典的 Java Web MVC 框架,通过拦截器机制处理请求,将业务逻辑与视图展示分离。本文基于提供的示例代码,详细讲解 Struts2 的第一个应用如何搭建,包括核心依赖、配置文件、Action 类编写及请求访问流程。

环境准备与核心依赖

1. 导入 Struts2 核心包

使用 Maven 构建项目时,需在pom.xml中添加 Struts2 核心依赖:

1
2
3
4
5
<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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0" encoding="UTF-8"?>
<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 映射及结果页面。示例配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.5.dtd">

<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>

配置详解:

  1. <package>标签
    • name:包的唯一标识,用于其他包引用(如extends="helloWorld");
    • namespace:请求路径的命名空间,与 Action 的name共同组成完整访问路径(如/userAction/test.action);
    • extends="struts-default":继承 Struts2 内置的struts-default包,该包定义了默认拦截器、结果类型等核心配置。
  2. <action>标签
    • name:Action 的名称,是请求路径的一部分(如test对应请求/userAction/test.action);
    • class:Action 类的全类名(默认值为com.opensymphony.xwork2.ActionSupport);
    • method:指定调用 Action 类中的方法(默认调用execute()方法)。
  3. <result>标签
    • 定义 Action 方法执行后的跳转页面,name属性匹配方法返回的字符串(默认name="success");
    • type:跳转类型(默认dispatcher表示转发,redirect表示重定向,stream用于文件下载等)。

Action 类编写:处理业务逻辑

Action 类是 Struts2 处理请求的核心,负责接收参数、执行业务逻辑并返回结果标识。示例代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
/**
* 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 类的规范:

  1. 属性命名:遵循 JavaBean 规范(私有属性 + 公共 getter/setter),便于 Struts2 通过 OGNL 表达式注入请求参数;
  2. 构造方法:必须有无参构造器(Struts2 通过反射创建 Action 实例);
  3. 方法返回值:通常返回String类型的结果标识(如"success""error"),对应struts.xml中的<result>标签;
  4. 线程安全:Struts2 为每个请求创建一个 Action 实例,因此无需考虑线程安全问题。

请求访问与流程解析

访问示例:

通过以下 URL 访问test Action:

1
http://localhost:8080/struts/userAction/test.action?user.name=张三

流程解析:

  1. 请求到达:客户端请求被StrutsPrepareAndExecuteFilter拦截;
  2. 解析请求:Struts2 根据请求路径/userAction/test.action,匹配namespace="/userAction"name="test"的 Action;
  3. 创建 Action:通过反射实例化UserAction,并调用setUser()方法注入参数(user.name=张三);
  4. 执行方法:调用UserActiontest()方法,执行业务逻辑(打印用户名);
  5. 结果跳转test()返回"success",Struts2 根据<result>配置转发至/pages/helloworld.html

关键知识点总结

  1. 核心组件
    • 过滤器StrutsPrepareAndExecuteFilter:请求入口;
    • 配置文件struts.xml:定义请求映射与结果跳转;
    • Action 类:处理业务逻辑,接收参数并返回结果标识。
  2. 请求路径组成
    完整访问路径 = 项目上下文路径 + namespace + action 名称 + .action
    (示例:/struts + /userAction + /test + .action
  3. 参数传递
    Struts2 通过 OGNL 表达式自动将请求参数注入 Action 的属性(如user.name=张三对应User对象的name属性)。
  4. 结果类型
    • dispatcher(默认):服务器内部转发(地址栏不变);
    • redirect:重定向到页面(地址栏变化);
    • redirectAction:重定向到另一个 Action;
    • stream:用于文件下载。

常见问题与注意事项

  1. 依赖冲突:Struts2 的struts2-core可能与其他框架(如 Spring)存在依赖冲突,需注意版本兼容性;

  2. 拦截器问题:url-pattern="/*"会拦截所有请求(包括 JSP),如需排除静态资源,可在struts.xml中配置:

    1
    <constant name="struts.action.excludePattern" value="/css/.*?,/js/.*?,/images/.*?" />
  3. Action 类规范:必须提供无参构造器和属性的 getter/setter,否则参数无法注入;

  4. 配置文件位置struts.xml需放在src/main/resources目录下(Maven 项目),确保编译后位于classes目录。

通过这个简单示例,我们了解了 Struts2 的基本工作流程:请求被拦截器捕获后,通过struts.xml映射到对应的 Action 处理,最终跳转至结果页面

欢迎关注我的其它发布渠道