You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Struts2.5中通过result标签调用Servlet的实现(Struts1迁移场景)

Struts2.5 配置result转发到Servlet实现方案

Struts2默认的结果类型已经能覆盖转发到Servlet的需求,不需要额外修改核心逻辑,和Struts1的转发行为完全对齐,具体实现按场景选以下方案即可:


方案1:默认dispatcher类型(服务器端转发,和Struts1 forward行为完全一致,优先用)

只要你的Servlet已经在web.xml或通过@WebServlet注解配置好了访问映射,直接用Struts2默认的dispatcher结果类型写Servlet的映射路径就行,和转发到JSP的写法没有区别。
举个例子,假设你的Servlet映射路径是/servlet/OrderProcessServlet,struts.xml里的配置如下:

<action name="submitOrder" class="com.biz.action.OrderAction">
    <!-- type="dispatcher"是默认值可以省略,路径写Servlet的上下文绝对路径即可 -->
    <result name="success">/servlet/OrderProcessServlet</result>
</action>

这种实现的特性和Struts1里配置forward到Servlet完全一致:

  • 属于服务器内部转发,客户端地址栏不会变化
  • 请求参数、Action中存入request、session、ServletContext域的属性,目标Servlet可以直接获取
  • 需要传额外固定参数可以直接拼在路径后,比如/servlet/OrderProcessServlet?migrateFrom=struts2

方案2:redirect类型(客户端重定向场景使用)

如果需要用客户端跳转(比如避免表单重复提交、跳转到独立路径下的Servlet),把结果类型改成redirect即可,对应Struts1里的redirect转发配置:

<action name="submitOrder" class="com.biz.action.OrderAction">
    <result name="success" type="redirect">
        <param name="location">/servlet/OrderProcessServlet</param>
        <!-- 配置为false会自动把当前请求的所有参数带到重定向地址上 -->
        <param name="suppressParameters">false</param>
        <!-- 也支持OGNL取Action属性拼参数,比如取Action里的orderId字段 -->
        <param name="orderId">${orderId}</param>
    </result>
</action>

注意这个方案是302客户端跳转,request域存储的数据会丢失,需要传递的业务参数要么拼在URL上,要么存在session域里。


方案3:自定义结果类型(大规模转发Servlet场景可选)

如果项目里有大量需要转发到Servlet的配置,不想每次重复写路径前缀,可以自定义专用的结果类型,日常迁移用方案1完全足够,这个方案只适合统一规范的场景:

  1. 先写自定义结果类实现Result接口:
public class ServletForwardResult implements Result {
    private String targetServlet;
    @Override
    public void execute(ActionInvocation invocation) throws Exception {
        HttpServletRequest req = ServletActionContext.getRequest();
        HttpServletResponse resp = ServletActionContext.getResponse();
        req.getRequestDispatcher(targetServlet).forward(req, resp);
    }
    // 提供setter接收配置参数
    public void setTargetServlet(String targetServlet) {
        this.targetServlet = targetServlet;
    }
}
  1. 在struts.xml的包配置里注册自定义结果类型,后续就可以全局使用:
<package name="basePackage" extends="struts-default">
    <result-types>
        <result-type name="toServlet" class="com.biz.result.ServletForwardResult"/>
    </result-types>

    <action name="submitOrder" class="com.biz.action.OrderAction">
        <result name="success" type="toServlet">
            <param name="targetServlet">/servlet/OrderProcessServlet</param>
        </result>
    </action>
</package>

避坑提醒

如果配置完出现404或者请求被当成Action报找不到对应Action方法的错误,检查Struts2核心过滤器的拦截规则:如果过滤器配置了拦截FORWARD类型的请求,需要在Struts2常量里把Servlet所在的路径加入排除列表:

<constant name="struts.action.excludePattern" value="/servlet/.*"/>

内容的提问来源于stack exchange,提问作者Neha Pahuja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 21:33:44