如何在Struts2中检查命名空间中是否存在动作?

时间:2010-08-04 09:11:27

标签: struts2 namespaces action

我想在Struts2 Web应用程序中使用自己的ActionMapper实现某种URL“后备”。这意味着:

何时

  

http://server/webapp/foo/bar/myaction

不存在,我希望ActionMapper尝试加载,例如

  

http://server/webapp/foo_fallback/bar/myaction

代替。

解析URL并因此找到命名空间不是问题,但我不知道如何确定此命名空间中是否存在所需的操作(如果不是,我必须修改)。

是否有可能检查命名空间中是否存在某个操作(在这种情况下为/ foo / bar)?或者是否有其他机制来执行我打算做的事情?

谢谢,

格里

2 个答案:

答案 0 :(得分:0)

您必须为每个已配置的命名空间执行此操作:

<action name="*">
    <result type="redirectAction">your fallback action here</result>
</action>

如果不起作用,请将struts.enable.SlashesInActionNames设置为false

答案 1 :(得分:0)

我解决了我的问题。这发生在自定义ActionMapper中:

要确定是否存在某个操作,我首先构造一个所需操作的类名(包括命名空间)的字符串。然后我打电话给

Class.forName("namespaceroot.foo.bar.myaction");

如果该操作不存在,则抛出ClassNotFoundException异常,我可以在try { ... } catch { ... }块中检查该异常。在catch块中,我可以将映射的命名空间更改为回退命名空间。这对ActionProxy有一些影响:名称空间也必须在getMappingFromActionName中更改。否则ActionProxy包含请求的命名空间,通常很好。 DefaultActionProxy没有命名空间的setter,因此我将其子类化并使用自定义AxtionProxyFactory创建它。呼。

这不是优雅的imho,但只要我没有想出更好的主意,它就会保持这种状态。我很想听听更好的解决方案!