namespaces - 支柱 2 : root namespace acting same as default namespace

标签 namespaces struts2

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

我可以使用 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 显示 索引.jsp

也不错。

现在,如果我将 struts xml 更改为 say

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

最佳答案

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

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

关于namespaces - 支柱 2 : root namespace acting same as default namespace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8881867/

相关文章:

namespaces - 无法让 pprint 在 clojure 中工作

java - OGNL 数组和列表索引

java - Struts 2 和 Chrome 扩展之间的不兼容性

c# - 参数序列化——指定命名空间

c++ - 匿名命名空间中的变量声明和其他地方的定义

python - 为什么函数可以改变外部的对象?

PHP DateTime 类命名空间

java - 异常启动过滤器struts2 :NoSuchMethodError

java - SessionMap 与 Map 哪个更适合 Session?

java - 在 Struts2 中的一个操作类本身中创建多个方法?