struts.xml是Struts2框架最核心的配置文件之一,它以XML格式定义了Action、拦截器、结果类型以及包结构之间的映射关系。当Web容器接收到请求,Struts2的核心过滤器StrutsPrepareAndExecuteFilter会解析这个文件,根据URL找到对应的Action类和方法,执行后依据返回字符串跳转到指定视图或数据结果。

一、struts.xml的基本结构
一个标准的struts.xml文件以<struts>为根节点,内部可以包含多个<package>。每个package相当于一个配置模块,通过name唯一标识,借助namespace实现URL路径隔离,extends属性则用于继承框架自带或自定义的公共配置。绝大多数情况下,我们会令package继承struts-default,从而直接使用Struts2提供的拦截器栈和结果类型。
在package内部,使用<action>节点声明具体请求处理器。该节点通常包含name(与namespace拼接成访问路径)、class(Action全限定类名)以及method(指定调用的方法)。结果映射通过<result>给出,name属性对应Action方法返回的字符串,type决定跳转方式。下面展示一个最小可用的配置片段:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
"https://ipipp.com/dtds/struts-2.5.dtd">
<struts>
<package name="user" namespace="/user" extends="struts-default">
<action name="login" class="com.demo.UserAction" method="login">
<result name="success">/pages/welcome.jsp</result>
<result name="error">/pages/error.jsp</result>
</action>
<package>
</struts>
上述配置表示访问/user/login时,框架实例化com.demo.UserAction并调用其login方法。若方法返回success则转发到welcome.jsp,返回error则转到error.jsp。这种声明式映射让请求分发与Java代码解耦,修改流程往往只需调整XML而不动类文件。
二、如何配置Action的常用属性
在<action>中,name值不要带斜杠,它只是namespace之后的相对路径段。class必须写全限定名,很多初学者写成UserAction而遗漏包名,启动时会报ClassNotFoundException。如果同一个Action类中有多个业务方法,可以用method属性切换,也可以采用动态方法调用(需在常量中开启),但显式method更利于维护。
当Action需要处理表单提交,可配合<interceptor-ref>引入params拦截器自动封装字段。若方法未指定,默认执行execute()。以下示例演示带拦截器与通配符的配置,通配符能减少重复节点,但会降低可读性,团队项目中应权衡使用:
<action name="*User" class="com.demo.UserAction" method="{1}">
<interceptor-ref name="defaultStack"/>
<result name="success">/pages/{1}_ok.jsp</result>
</action>
这里访问/addUser会调用UserAction的add方法,访问/delUser则调用del方法。结果路径中的{1}被替换为方法名。要注意通配符顺序,Struts2按文件中的声明先后匹配,更具体的action应写在前面以免被泛化规则覆盖。
三、结果类型与全局配置
除默认的dispatcher(服务端转发JSP)外,struts.xml还支持redirect、redirectAction、stream、json等结果类型。JSON结果常借助json-default包与JSON插件返回异步数据,配置时需要引入对应依赖并继承json-default。全局结果可用<global-results>定义在package内,供该包下所有Action共用,例如统一错误页。
我们还可以在<struts>根下用<constant>设置全局参数,如编码、开发模式、动态方法开关。这些常量影响整个框架行为,与Action配置形成互补。示例如下:
<constant name="struts.i18n.encoding" value="UTF-8"/>
<constant name="struts.devMode" value="true"/>
<package name="base" extends="json-default">
<global-results>
<result name="exception">/error.jsp</result>
</global-results>
</package>
将通用设定抽取到父package,业务package继承它即可获得一致的行为。这样在多人协作时,struts.xml虽体积增长却层次清晰,不会出现每个Action重复写拦截器的情况。
四、常见错误与排查思路
配置完Action却始终404,优先检查namespace与name拼接是否和请求URL完全一致,末尾斜杠也会被严格比对。其次确认class路径在编译后存在于classes目录。若进入Action但结果报No result defined,说明方法返回的字符串没有对应<result>,或拼写大小写不一致。
另一个隐蔽问题是package的extends漏写struts-default,导致默认拦截器全失,参数无法注入、验证不生效。遇到这类情况,可临时开启devMode,框架会在页面打印详细配置加载信息。保持XML格式良好、标签闭合,也是避免解析失败的基础。理清struts.xml的装载机制与节点语义,就能把它变成稳定可靠的Web层路由中心。
struts_xmlStruts2Action配置修改时间:2026-08-09 18:39:28