我想在Struts2 web应用程序中使用自己的ActionMapper实现某种url“fallback”。这意味着:如何检查Struts2中的命名空间中是否存在操作?
时
不存在,我想的ActionMapper尝试加载例如
代替。
解析URL并因此找到名称空间不是问题,但我不知道如何确定所需的操作是否存在于此名称空间中(如果不是,我必须修改它)。
是否有可能检查命名空间中是否存在某个操作(在本例中为/ foo/bar)?还是有另一种机制来执行我打算做的事情?
感谢,
格雷戈尔
我想在Struts2 web应用程序中使用自己的ActionMapper实现某种url“fallback”。这意味着:如何检查Struts2中的命名空间中是否存在操作?
时
不存在,我想的ActionMapper尝试加载例如
代替。
解析URL并因此找到名称空间不是问题,但我不知道如何确定所需的操作是否存在于此名称空间中(如果不是,我必须修改它)。
是否有可能检查命名空间中是否存在某个操作(在本例中为/ foo/bar)?还是有另一种机制来执行我打算做的事情?
感谢,
格雷戈尔
我解决了我的问题。这发生在自定义ActionMapper中:
为了找出一个动作是否存在,我首先构造一个所需动作的类名称(包括名称空间)的字符串。然后,我打电话
Class.forName("namespaceroot.foo.bar.myaction");
如果操作不存在,一个ClassNotFoundException
抛出异常,这是我能为您在一个try { ... } catch { ... }
块。在catch
块内,我可以将映射的名称空间更改为回退名称空间。这对ActionProxy
有一些影响:在getMappingFromActionName
中,名称空间也必须在那里更改。否则,ActionProxy
包含请求的名称空间,通常情况下这很好。 DefaultActionProxy
没有用于名称空间的setter,所以我将其分类并使用自定义AxtionProxyFactory
创建它。唷。
这不是优雅的imho,但只要我不提出更好的主意,它会保持这种方式。我很乐意听到更好的解决方案!
你必须为每一个配置的名称空间做到这一点:
<action name="*">
<result type="redirectAction">your fallback action here</result>
</action>
如果它不工作,设置struts.enable.SlashesInActionNames
到false
。
如果我理解正确,这将执行备用操作。我需要的是一个后备/命名空间/。 但是,我使用自定义的ActionMapper解决了它,并在getMapping()方法中根据需要更改了命名空间。 ActionProxy也必须获得新的名称空间,所以我通过为名称空间添加一个setter来扩展它。希望这不会让你想起http://xkcd.com/763/ :) – grefab 2010-08-11 22:38:07