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
相关产品推荐
相关产品推荐

