2012-01-16 211 views
3

在Struts 2中,我看到根名稱空間給出與根名稱空間相同的行爲,即充當「全部捕獲」。我需要限制我的應用中的操作只能從一個URL訪問,包括URL中沒有命名空間的操作。我的理解是使用root命名空間應該這樣做,但我沒有看到它的工作。Struts 2:根名稱空間的行爲與默認命名空間相同

我可以用Struts 2教程的HelloWorld示例爲Eclipse提供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 /foo/index.action

目前爲止還不錯。

如果我改變struts.xml中以

<package name="basicstruts2" namespace="/foo" extends="struts-default"> 
  • 本地主機:8080/Basic_Struts2_Ant/index.action失敗 「沒有映射爲命名空間/和動作名稱指數的行動。」
  • 本地主機:8080/Basic_Struts2_Ant /富/ index.action顯示 的index.jsp

也不錯。

現在,如果我改變支柱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失敗,並顯示「沒有爲命名空間/ foo和動作名稱索引映射的操作」。

我也嘗試了其他變體,用「alksdja」等替換「foo」,以消除瀏覽器緩存的可能性。

我誤解了根名稱空間的作用嗎?以及如何禁用/foo/index.action工作,同時允許/index.action?

+0

請參閱我對[此問題](http://stackoverflow.com/a/8424913/438992)的回答,看看它是否適合你。 – 2012-01-16 15:22:01

+0

是的,這有效。謝謝! – Graham 2012-01-16 16:28:24

+0

現在我正在閱讀有關所有設置,看起來struts.mapper.alwaysSelectFullNamespace或struts.enable.SlashesInActionNames將根據您想要的URL中間的額外東西來關聯它來修復它。 – Graham 2012-01-16 16:34:57

回答

2

您需要定義默認包和根包。 邏輯是,如果在你的包中找不到一個名稱空間爲 「/ 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> 
0

我面臨同樣的情況。我已經通過定義默認和根名稱空間進行了測試。它的工作原理如下:如果在指定的名稱空間中找不到動作,則它首先搜索根名稱空間,然後僅在該動作未在根名稱空間中退出後搜索默認名稱空間。它與我讀過的struts2文檔不同。它可能是struts2版本的呢?我使用了struts 2.3.16。