我想在Struts2 Web应用程序中使用自己的ActionMapper实现某种URL“后备”。这意味着:
何时
不存在,我希望ActionMapper尝试加载,例如
代替。
解析URL并因此找到命名空间不是问题,但我不知道如何确定此命名空间中是否存在所需的操作(如果不是,我必须修改)。
是否有可能检查命名空间中是否存在某个操作(在这种情况下为/ foo / bar)?或者是否有其他机制来执行我打算做的事情?
谢谢,
格里
答案 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,但只要我没有想出更好的主意,它就会保持这种状态。我很想听听更好的解决方案!