Struts 2:根名称空间与默认名称空间相同

时间:2012-01-16 15:06:32

标签: namespaces struts2

在Struts 2中,我看到根命名空间提供与根命名空间相同的行为,即充当“全部捕获”。我需要限制我的应用中的操作只能从一个URL访问,包括URL中没有命名空间的URL。我的理解是使用root命名空间应该这样做,但我还没有看到它的工作。

我可以使用Struts 2教程的Eclipse的HelloWorld示例here重现此问题。

struts.xml包含

<package name="basicstruts2" extends="struts-default">
    ...
    <action name="index">
        <result>/index.jsp</result>
    </action>
    ...
</package>

因此,以下链接都显示了index.jsp结果

  • 本地主机:8080 / Basic_Struts2_Ant / index.action
  • 本地主机:8080 / Basic_Struts2_Ant /富/ index.action

到目前为止很好。

如果我将struts.xml更改为

<package name="basicstruts2" namespace="/foo" extends="struts-default">
  • localhost:8080 / Basic_Struts2_Ant / index.action失败 “没有映射名称空间/动作名称索引的动作。”
  • localhost:8080 / Basic_Struts2_Ant / foo / index.action显示 的index.jsp

也很好。

现在如果我改变struts xml说

<package name="basicstruts2" namespace="/" extends="struts-default">

以下链接均显示index.jsp结果(与未定义命名空间时相同)

  • 本地主机:8080 / Basic_Struts2_Ant / index.action
  • 本地主机:8080 / Basic_Struts2_Ant /富/ index.action

如果我已正确理解命名空间文档,我希望如此 localhost:8080 / Basic_Struts2_Ant / foo / index.action失败,“没有为namespace / foo和动作名称索引映射动作。”

我还尝试了其他变体,将“foo”替换为“alksdja”等,以消除浏览器缓存的可能性。

我是否误解了根命名空间的作用?以及在允许/index.action时如何禁用/foo/index.action?

2 个答案:

答案 0 :(得分:2)

您需要定义默认包和根包。 如果在您的包中找不到某个命名空间,那么逻辑是 “/ foo”,struts2将在默认包中搜索相同的操作名称。 如果默认包不存在,它将搜索根包。 所以你需要的是定义默认包和root包。

<package name="basicstruts2_default" extends="struts-default">
  <!--put actions that share in all namespace and global settings-->
</package>
<package name="basicstruts2_root" namespace="/"  extends="basicstruts2_default">
     <action name="index">
        <result>/index.jsp</result>
    </action>
</package>
<package name="basicstruts2_foo" namespace="/foo" extends="basicstruts2_default">
 <action name="show">
   <result>/foo/show.jsp</result>
 </action>
</package>

答案 1 :(得分:0)

我面对同样的事情。我通过定义默认和根命名空间进行了测试。它的工作方式如下:如果无法使用指定的命名空间找到操作,则首先搜索根命名空间,并仅在该操作未在根命名空间中退出后搜索默认命名空间。它与我读过的struts2文档不同。它可能是struts2版本的结果?我使用struts 2.3.16。