Struts2 ActionContext setName 方法不起作用

Posted

技术标签:

【中文标题】Struts2 ActionContext setName 方法不起作用【英文标题】:Struts2 ActionContext setName method not working 【发布时间】:2014-04-04 13:47:18 【问题描述】:

我正在尝试在 Struts2 中编​​写一个拦截器,它根据某些条件将请求重定向到不同的操作。我的拦截器工作正常,如下所示。

public String intercept(ActionInvocation actionInvocation) throws Exception 
        ActionContext actionContext=actionInvocation.getInvocationContext();
        String actionName=actionContext.getName();
        String actionResult=null;
        if(actionName.equals("admin"))
        
            System.out.println("admin");
            //if(based on some condition)
            actionContext.setName("ErrorPageForLinkAccess");
                    System.out.println(actionContext.getName());
        
        actionResult = actionInvocation.invoke();   
        return  actionResult;
    

Struts 配置

<action name="other">
<result>Jsp/other.jsp</result>
</action>
<action name="admin" class="com.example.Admin" method="adminDemo">
<result name="success">Jsp/admin.jsp</result>
</action>
<action name="ErrorPageForLinkAccess">
    <result name="success">Jsp/ErrorPageForLinkAccess.jsp</result>
</action>

每当我调用管理操作时,控制台输出

admin
ErrorPageForLinkAccess

但它仍然没有调用ErrorPageForLinkAccess 操作,而是调用admin 操作。 为什么我会遇到这个问题?

【问题讨论】:

设置名称不会改变执行的动作。而是从拦截器返回一些不同的结果,并在 struts.xml 中配置此结果。 在你不覆盖默认行为之前你试图设置什么无用 Struts 会为你设置动作名称。 @Aleksandr 你的建议很好,但我的要求不同。我想调用不同的操作,而不仅仅是返回结果。因为我需要为每个动作配置结果名称。 @Roman 你可能是对的,我需要找到一些解决方案 您可以为此配置全局结果。 【参考方案1】:

您正面临这个问题,因为动作已经被调度程序解析并调用,因此在动作上下文中更改动作名称是没有用的。 Struts 在过滤器中做到了这一点

ActionMapping mapping = prepare.findActionMapping(request, response, true);
if (mapping == null) 
    boolean handled = execute.executeStaticResourceRequest(request, response);
    if (!handled) 
        chain.doFilter(request, response);
    
 else 
    execute.executeAction(request, response, mapping);

【讨论】:

那他们为什么提供 setName() @mahesh 将name 设置为bean 的setter。而且 Struts 并不关心你将如何使用它。

以上是关于Struts2 ActionContext setName 方法不起作用的主要内容,如果未能解决你的问题,请参考以下文章

struts2ActionContext与ServletActionContext

Struts2 和 Hibernate - 在 Servlet 外部访问 ActionContext.getContext().getSession()

struts2中 ServletActionContext与ActionContext区别

struts2中 ServletActionContext与ActionContext区别

Struts2中ActionContext及ServletActionContext介绍(转载)

struts2入门---ActionContext