2010-08-04 98 views
0

我想在Struts2 web应用程序中使用自己的ActionMapper实现某种url“fallback”。这意味着:如何检查Struts2中的命名空间中是否存在操作?

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

不存在,我想的ActionMapper尝试加载例如

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

代替。

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

是否有可能检查命名空间中是否存在某个操作(在本例中为/ foo/bar)?还是有另一种机制来执行我打算做的事情?

感谢,

格雷戈尔

回答

0

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

为了找出一个动作是否存在,我首先构造一个所需动作的类名称(包括名称空间)的字符串。然后,我打电话

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

如果操作不存在,一个ClassNotFoundException抛出异常,这是我能为您在一个try { ... } catch { ... }块。在catch块内,我可以将映射的名称空间更改为回退名称空间。这对ActionProxy有一些影响:在getMappingFromActionName中,名称空间也必须在那里更改。否则,ActionProxy包含请求的名称空间,通常情况下这很好。 DefaultActionProxy没有用于名称空间的setter,所以我将其分类并使用自定义AxtionProxyFactory创建它。唷。

这不是优雅的imho,但只要我不提出更好的主意,它会保持这种方式。我很乐意听到更好的解决方案!

0

你必须为每一个配置的名称空间做到这一点:

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

如果它不工作,设置struts.enable.SlashesInActionNamesfalse

+0

如果我理解正确,这将执行备用操作。我需要的是一个后备/命名空间/。 但是,我使用自定义的ActionMapper解决了它,并在getMapping()方法中根据需要更改了命名空间。 ActionProxy也必须获得新的名称空间,所以我通过为名称空间添加一个setter来扩展它。希望这不会让你想起http://xkcd.com/763/ :) – grefab 2010-08-11 22:38:07

相关问题