プロが教える店舗&オフィスのセキュリティ対策術

struts関連 web.xmlに複数の<servlet-mapping>を記述する方法について

初歩的なことなのかもしれませんが質問させてください。
Struts1.3.5での質問なのですが、web.xmlにURLパターンを複数記述している場合に
servlet-mapping の記載位置が後の方のURLパターンが、
JSPのFormタグで生成されるパスに設定されてしまい、原因が分からず困っています。

現象としては、
例えば、web.xmlの<servlet-mapping>にそれぞれ異なる
URLパターンを[/abc/*]→[/xyz/*]の順で記述している場合、

web.xml(抜粋)----------------------------------------------
<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/abc/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>TestServlet</servlet-name>
<url-pattern>/xyz/*</url-pattern>
</servlet-mapping>
----------------------------------------------------------

URLパターンが[/abc/*]となる以下のURLをブラウザで表示した所、
[https:/localhost/{コンテキストルート}/abc/LoginAction]

表示されたJSP内で指定しているformタグのアクションパスが
web.xmlで記載したURLパターンのパスではなく、
web.xmlで後の方に記載した別のURLパターンのパス(/xyz/)が設定されてしまいます。

・表示されるJSP内で指定しているアクションパス
<html:form action="/LoginAction">
上記で生成されるHTML
<form name="LoginForm" method="post" action="/コンテキスト名/xyz/LoginAction">
     
web.xmlでURLパターンを[/xyz/*]→[/abc/*]の順で記述した場合は、
正しくURLパターンで記述したパスが設定されます。

<form name="LoginForm" method="post" action="/コンテキスト名/abc/LoginAction">

ただし、この場合はURLパターンが[/xyz/*]のURLを表示した場合に
<form ~ action="/{コンテキストルート}/abc/LoginAction">となってしまいます。

どなたかこうした現象について回避策をご存知の方はいらっしゃらないでしょうか?

A 回答 (2件)

<servlet>


<servlet-name>TestServlet</servlet-name>
<servlet-class>servlet.TestServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>


<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>init</servlet-name>
<url-pattern>/abc/*</url-pattern>
</servlet-mapping>

<servlet-mapping>
<servlet-name>reference</servlet-name>
<url-pattern>/xyz/*</url-pattern>
</servlet-mapping>


このように、サーブレット名を切り分けてみてはどうでしょうか?
web.xml内の他の要素からも参照されるため、
サーブレット名は他と重複しない名前をつけないとだめです。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

Apacheのユーザガイドに複数の<servlet-mapping>要素を定義した場合にはフレームワークが正しく動作しない恐れがある旨の記述がされていました。(struts に限った事では無い様ですが。。)

http://struts.apache.org/1.3.5/userGuide/configu …
(1.2.9の同ユーザガイドには、strutsと明記されていました。)

どうやら、strutsでは複数の<servlet-mapping>には対応していないようです。

お礼日時:2010/06/29 22:58

単純にservlet-nameが被っているからじゃないでしょうか?

    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

補足です。サーブレットを分けて見ましたが、やはり後に書いた方のservlet-mappingが有効になってしまいます。
strutsを使用する場合は、複数のservlet-mappingを定義する事は出来ないと言う事なのでしょうか?

お礼日時:2010/06/29 08:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!