2012-01-16 19 views
3

Struts 2では、ルートネームスペースと同じ動作をしています。つまり、「すべてをキャッチ」として動作しています。私は、アプリケーション内のアクションがURLに名前空間のないものを含め、1つのURLからのみアクセスできるように制限する必要があります。私の理解はこれを行う必要がありますが、私はそれが動作するのを見ていないルート名前空間を使用しています。Struts 2:デフォルトネームスペースと同じ名前空間を持つ

この問題は、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を

を示しています。

今、私はストラット

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

以下のリンクの両方が(名前空間が定義されていないときと同じ)index.jspの結果を示したと言うためにXMLを変更した場合

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

名前空間のドキュメントを正しく理解していれば、 localhost:8080/Basic_Struts2_Ant/foo/index.actionは "namespace/fooとアクション名のインデックスにマッピングされたアクションはありません"と失敗します。

私はブラウザのキャッシュを可能性として排除するために、 "foo"を "alksdja"などに置き換えて、他のバリエーションを試しました。

私は、ルート名前空間が何をしているのか誤解しましたか? /foo/index.actionを/index.actionを許可しながら動作させないようにするには?

+0

私の答え[この質問](http://stackoverflow.com/a/8424913/438992)を参照し、それがあなたのために働くかどうかを見てください。 –

+0

はい、それは動作します。ありがとう! – Graham

+0

今、私はstruts.mapper.alwaysSelectFullNamespaceかstruts.enable.SlashesInActionNamesのいずれかの設定が読み込まれているので、URLの途中で余分なものを関連付けるかどうかによって問題を修正します。 – Graham

答えて

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バージョンのcozかもしれない?私はストラット2.3.16を使用しました。

関連する問題