微信优化

weixinyouhua

.do配置

2026-09-10 18:39:46

.do配置的核心答案是:它是Java Web项目中Struts2框架的URL路由规则,通常在web.xml里配置FilterDispatcher,再在struts.xml里写好Action映射就能生效。

很多开发者在做老项目维护时,打开web.xml看到一个.do后缀的servlet映射,或者新建的Struts2工程页面始终报404,问题都出在这两个配置文件上,今天把.do配置的来龙去脉讲透,从入口到落地,每一步都给出可直接抄走的写法。

.do配置核心:两个配置文件缺一不可

.do本身没有魔法,它只是一个URL后缀约定,真正干活的是web.xml中的过滤器struts.xml中的Action映射,这两个文件配合好,.do请求才能真正打到后端逻辑上。

web.xml里的过滤器声明是起点

Struts2从2.5版本开始,官方推荐用org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter来接管所有请求,在web.xml里需要这样写:

<filter>
    <filter-name>struts2</filter-name>
    <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>struts2</filter-name>
    <url-pattern>.do</url-pattern>
</filter-mapping>

关键是<url-pattern>这一行,它决定了什么样的请求地址会被Struts2拦截,写成.do,表示只有以.do结尾的请求才会进入框架处理,静态资源(比如.js.css.png)不受影响。

如果项目里既有.do又有.action,可以把url-pattern写成,让所有请求都走框架,但这样做会增加过滤器的负担,不推荐在性能敏感的项目里使用。

struts.xml里的Action映射决定走向

web.xml解决了“谁来接请求”的问题,struts.xml解决“接到请求后往哪儿发”的问题,一个最基础的配置长这样:

<package name="default" extends="struts-default" namespace="/">
    <action name="login" class="com.example.LoginAction">
        <result name="success">/loginSuccess.jsp</result>
        <result name="error">/loginError.jsp</result>
    </action>
</package>

访问http://localhost:8080/你的项目名/login.do时,Struts2会根据name="login"找到这个Action,执行LoginAction类的execute()方法,然后根据返回的字符串选择对应的JSP页面。

.do配置报错高频出在namespace上,如果namespace写成/user,那访问地址必须是/user/login.do,而不是/login.do,很多初学者在这里卡半天,记住一句话:namespace决定URL前缀,action name决定后缀名称

.do配置

完整操作步骤:从零搭建一个能跑的.do请求

按下面五步操作,十分钟内能验证整条链路是否通畅:

  1. 在IDEA或Eclipse里新建一个Dynamic Web Project,确保lib目录下有struts2-core、xwork-core、commons-lang3等几个必要jar包。
  2. 在src目录下新建struts.xml,复制上面那段package配置。
  3. 在WEB-INF目录下打开web.xml,填入过滤器声明,url-pattern设为.do
  4. 写一个简单的Action类,继承com.opensymphony.xwork2.ActionSupport,重写execute方法返回SUCCESS常量。
  5. 启动Tomcat,浏览器访问http://localhost:8080/项目名/login.do,能看到success字符串或对应的JSP页面就算成功。

这套流程做完,说明.do配置的基础环境已经跑通。

404排查清单:为什么你的.do请求找不到页面

.do配置看起来简单,但运行时报404的原因五花八门,90%的情况逃不出下面五个原因:

  • 过滤器url-pattern写错,写成了但没有排除静态资源,导致JSP页面也被拦截,反过来.do其实是最不容易出错的选择。
  • struts.xml文件名或路径不对,Struts2默认去classpath根目录找struts.xml,如果你把文件放进了WEB-INF下面,它根本读不到。
  • namespace和访问路径不匹配,这是最常见的低级错误,仔细核对<package>标签里的namespace值和浏览器地址栏的路径。
  • Action类没有无参构造方法,Struts2通过反射创建Action实例,如果类里写了带参数的构造器却没写无参的,直接抛异常。
  • jar包版本冲突,比如同时用了struts2-core-2.3和struts2-core-2.5,会出现NoClassDefFoundError之类的问题。

用日志快速定位问题点

遇到.do请求404,打开Tomcat的catalina.out日志文件,看最后几行异常堆栈,如果看到There is no Action mapped for namespace [/] and action name [login] associated with context path,基本可以断定是struts.xml里namespace或action name没对上,用grep命令在日志里筛关键词是个高效办法:

grep -i "no Action mapped" catalina.out

日志会直接告诉你哪个namespace下的哪个action name找不到,照葫芦画瓢去struts.xml里改就行。

Struts2版本差异对配置的影响

截至2026年,Struts2的2.5系列和3.x系列在配置上有个明显差异,2.5及以前版本,过滤器类名是org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter;2.5.2之后新版改成了org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter,很多老教程写的是旧包路径,直接拷贝到新项目里就会启动报错。

从Struts2 2.5开始,DMI(动态方法调用)默认是关闭的,也就是说,像

.do配置

login.do!add这样的写法默认不可用,需要在struts.xml里加<constant name="struts.enable.DynamicMethodInvocation" value="true" />才能开启,考虑到安全问题,不建议打开这个开关,改用semicolon分隔或配置多个action更稳妥。

struts2的.do和.action到底有什么区别

日常开发中,action是Struts2的默认后缀,do实际上是Struts1时代遗留的习惯,两者在Struts2框架里的处理机制完全相同都只是URL后缀,框架本身不关心你用哪个。

对比维度 .do .action
历史来源 Struts1推荐后缀 Struts2默认后缀
配置方式 url-pattern设为.do url-pattern设为.action
实际处理 同一套过滤器机制 同一套过滤器机制
运维习惯 老项目沿用,改动成本高 新项目默认,教程覆盖多
搜索引擎收录 不影响,动态URL本质相同 不影响,动态URL本质相同

选哪个的关键不在技术,在项目现状。 如果是维护2015年前后搭建的老系统,前端页面上写满了user.doorder.do这种链接,贸然改成.action意味着所有前端模板、JavaScript里的URL都要动,回归测试范围很大,不如沿用.do配置,如果是2020年后新建的项目,直接用.action默认后缀,少走弯路。

有不少开发者在知乎、CSDN上争论过“do配置怎么写更好”,行业共识认为,统一就好,混用才容易出问题,一个项目里别一部分接口用.do,另一部分用.action,配置混乱不说,排查问题时还得先看路径后缀猜框架行为。

两种后缀混用时的处理方案

如果历史包袱太重,确实存在.do.action共存的情况,web.xml里url-pattern改成,然后在struts.xml里加一条常量配置:

<constant name="struts.action.extension" value="do,action," />

这段配置让框架同时接受.do.action两种后缀的请求,注意末尾有个逗号,它代表空后缀允许URL不加任何后缀直接访问Action。

.do配置报错后的单步调试技巧

配置层面没问题但请求还是出错,需要进代码里看实际执行流程,这里分享一个省时间的排查路径:

  1. 在Action类的execute()方法第一行打上断点,用Debug模式启动Tomcat。
  2. 浏览器访问对应的.do地址,IDE命中断点说明请求已经成功进入Action,问题出在业务逻辑里。
  3. 如果断点没生效,说明请求根本没到Action,回过去查过滤器配置和struts.xml映射。

.do配置

多数情况下,.do配置报错都出在第二步之前的链路,也就是框架层的映射找不到,这时排查重点放在struts.xml语法上,比如标签是否闭合、class属性值是否写对类全限定名、是否存在两个相同name的action互相覆盖。

struts.xml的DTD校验隐患

复制网上的配置片段时,注意struts.xml文件头的DTD声明必须和jar包版本匹配,2.5版本的声明是:

<!DOCTYPE struts PUBLIC
    "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN"
    "http://struts.apache.org/dtds/struts-2.5.dtd">

如果jar包是2.5但文件头写着2.3,IDE虽然不报错,但运行时可能出现诡异的行为。IDE的XML校验经常和运行时不一致,遇到这种情况,用xmllint命令做一次语法检查能更快定位问题。

另外一种常见报错:ClassNotFound

这种情况本质上是依赖缺失,检查WEB-INF/lib目录有没有struts2-core的jar包,同时确认没有把多个冲突版本的jar包同时放进lib,用Maven管理的项目,在pom.xml里执行mvn dependency:tree,看看有没有传递依赖引入了旧版struts2-core,排除掉即可。

小结:.do配置的关键要点

无论新老项目,.do配置的核心逻辑是:web.xml负责请求入口,struts.xml负责路由分发,遇到问题先看日志,再对着两个文件检查namespace、action name、class路径三个核心属性,后缀选择上保持统一,维护老系统就用.do,新项目直接用.action,不必纠结。

Q&A:.do配置常见问题解答

.do配置404一定是过滤器的问题吗?

不一定是过滤器,但优先排查它,检查web.xml里的<url-pattern>是否包含.do,同时确认struts.xml文件在classpath根目录且命名正确,如果配置无误,下一步检查Action类的包名和类名是否与class属性完全一致,包括大小写。

为什么.do请求进入了Action但返回的是空白页?

进入Action说明框架链路正常,问题在Result配置,查看struts.xml里对应<result>标签的JSP路径是否存在、是否拼写错误,JSP页面本身如果发生编译错误,Tomcat默认会显示500而不是空白页,所以空白页大概率是返回的Result名称在配置里找不到,检查result name拼写与Action返回字符串是否完全一致。

新项目里要不要用.do后缀?

据工信部近年发布的Web应用安全报告提示,动态URL后缀本身不影响安全等级,重点是参数校验和SQL注入防护,新项目建议直接用.action,因为Struts2的官方文档、Stack Overflow上的最新问答、各大技术博客的示例几乎都默认.action,遇到问题时搜到的资料更多,解决方案也更成熟,如果是老项目改造,保持.do不变,减少无意义的排查成本。

相关文章

2024年,SaaS软件行业碰到获客难、增长慢等问题吗?

我们努力让每一次邂逅总能超越期待