struts.xml是什么?如何用它来配置Struts2的Action?

来源:网站主作者:雪花头衔:草根站长
导读:本期聚焦于小伙伴创作的《struts.xml是什么?如何用它来配置Struts2的Action?》,敬请观看详情。Struts2框架启动时由核心过滤器加载struts.xml,把它当作路由表来匹配请求并调用对应Action。这个文件采用XML描述包、命名空间与结果映射,一旦写错就会导致404或找不到方法。常见误区是把Action的class写成完整路径却漏掉包名,或者result的name与Action返回值对不上。正确理解package的extends=struts-default含义,才能复用拦截器栈。实际配置时建议按模块拆分package,用namespace隔离接口,在Action节点里通过method指定执行函数,结果类型选dispatcher或json。掌握这些要点,就能用struts.xml稳定接管Web层请求分发。

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

struts.xml是什么?如何用它来配置Struts2的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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。