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

Struts2中设置Dispatcher为FORWARD后struts.actionMapping显示noActionMapping的解决方法

Struts2中FORWARD调度下获取ActionMapping显示noActionMapping的解决方法

方案一:自定义过滤器确保FORWARD请求保留ActionMapping

当配置FORWARD调度后,转发请求时Struts默认过滤器可能未将ActionMapping存入request,导致页面获取不到。可以通过自定义过滤器解决:

  • 继承StrutsPrepareAndExecuteFilter,重写doFilter方法,在FORWARD请求处理后将ActionMapping存入request:
public class CustomStrutsFilter extends StrutsPrepareAndExecuteFilter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        super.doFilter(request, response, chain);
        HttpServletRequest httpReq = (HttpServletRequest) request;
        if ("FORWARD".equals(httpReq.getDispatcherType().name())) {
            ActionMapping mapping = (ActionMapping) httpReq.getAttribute("struts.actionMapping");
            if (mapping == null) {
                ActionContext ctx = ActionContext.getContext();
                if (ctx != null) {
                    mapping = ctx.getActionMapping();
                    if (mapping != null) {
                        httpReq.setAttribute("struts.actionMapping", mapping);
                    }
                }
            }
        }
    }
}
  • 在web.xml中替换原Struts过滤器为自定义类:
<filter>
    <filter-name>struts2</filter-name>
    <filter-class>com.yourpackage.CustomStrutsFilter</filter-class>
</filter>

方案二:直接从ActionContext获取ActionMapping

ActionContext存储了当前请求的完整Action上下文信息,不受调度类型影响,可直接通过OGNL访问:

  • 在JSP中使用以下标签获取Action名称:
<s:property value="#actionContext.actionMapping.name"/>

或者通过静态方法直接获取:

<s:property value="@org.apache.struts2.StrutsActionContext@getActionMapping().name"/>

方案三:在Action/拦截器中提前存储Action信息

在Action执行过程中,将ActionMapping的关键属性(如名称、命名空间)存入request,供转发页面直接使用:

  • Action中示例代码:
public String execute() {
    ActionMapping mapping = ActionContext.getContext().getActionMapping();
    ServletActionContext.getRequest().setAttribute("currentActionName", mapping.getName());
    ServletActionContext.getRequest().setAttribute("currentNamespace", mapping.getNamespace());
    return SUCCESS;
}
  • JSP中直接获取属性:
<s:property value="#request.currentActionName"/>

内容的提问来源于stack exchange,提问作者Alireza Fattahi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 17:35:22