【问题标题】:Struts 2: root namespace acting same as default namespaceStruts 2:根命名空间与默认命名空间相同
【发布时间】:2012-01-16 15:06:31
【问题描述】:

在 Struts 2 中,我看到根名称空间的行为与根名称空间相同,即充当“包罗万象”的角色。我需要限制我的应用程序中的操作只能从一个 URL 访问,包括那些在 URL 中没有命名空间的操作。我的理解是使用根命名空间应该这样做,但我还没有看到它工作。

我可以使用 Struts 2 教程的 Eclipse 的 HelloWorld 示例来重现这个问题here

struts.xml 包含

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

所以以下两个链接都显示了 index.jsp 结果

  • localhost:8080/Basic_Struts2_Ant/index.action
  • localhost:8080/Basic_Struts2_Ant/foo/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 结果(与未定义命名空间时相同)

  • localhost:8080/Basic_Struts2_Ant/index.action
  • localhost:8080/Basic_Struts2_Ant/foo/index.action

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

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

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

【问题讨论】:

  • 查看我对this question 的回答,看看它是否适合您。
  • 是的,这行得通。谢谢!
  • 现在我正在阅读所有设置,似乎 struts.mapper.alwaysSelectFullNamespace 或 struts.enable.SlashesInActionNames 会根据您希望 URL 中间的额外内容来修复它相关联。

标签: namespaces struts2


【解决方案1】:

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

<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>

【讨论】:

    【解决方案2】:

    我也面临同样的情况。我已经通过定义默认命名空间和根命名空间进行了测试。它的工作原理如下:如果在指定的命名空间中找不到操作,则首先搜索根命名空间,然后仅在该操作未在根命名空间中退出后才搜索默认命名空间。它与我读过的 struts2 文档不同。可能是struts2版本的原因?我用的是struts 2.3.16。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-10
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      相关资源
      最近更新 更多