Tomcat 6で実行されている2つのフォームがあるJSPページがあります。1つは登録フォーム、2つ目はログインフォームです。(コンテキストパスに注意してください。後で私を殺してしまいます)
(regis_and_login.jsp)
<% String path = request.getContextPath(); %>
//regis form
<form id="regis_form" name="register_form"
action="<%= path %>/servlet/process_register" method="post">
//login form
<form name="login_form" action="<%= path %>/servlet/login" method="POST">
ゴール
新しいユーザーを追加するための挿入ステートメントが失敗した場合、カスタムエラーが表示された状態でユーザーをregis_and_login.jspページにリダイレクトしたいと思います。
サーブレットの動作
(ログインサーブレット)
ログインに失敗すると、カスタムエラーメッセージがリクエストに追加されます(つまりrequest.setAttribute("error", "there is error!")
、ディスパッチャはページに戻ってregis_and_login.jsp
エラーメッセージを正しく表示しますが、これは転送であるため、URLはhttp:// localhost:8080/regis_and_login.jspからhttpに変更されます:// localhost:8080 / servlet / login
(RegisterServlet)登録サーブレットは同じように機能します。エラーが検出された場合は、リクエストに応じてsetAttribute()を呼び出し、RequestDispatcherのforward関数を呼び出して、カスタムエラーが表示された状態でユーザーをregis_and_login.jspページにリダイレクトします。
問題
各フォームは個別に正常に機能しますが、一緒に使用すると問題が発生します。
ログインフォームに無効な入力を入力すると、カスタムメッセージが正しく表示された状態でhttp:// localhost:8080 / servlet/loginにリダイレクトされます。
同じページ(http:// localhost:8080 / servlet / login)で、登録フォームに入力して送信します。
結果:
これで、URLがおかしくなりました。
The requested resource (/servlet/servlet/process_register) is not available.
私の推測では、これは、でregis_and_login.jsp
、contextPathを設定し、フォームのアクション値に連結するためです。action="<%= path %>/servlet/process_register
したがって、転送( http:// localhost:8080 / servlet / login )によってURLが変更された後、contextPathは「/ servlet /」に設定されるようになりました。そのため/servlet/servlet/process_register
、単にではなく要求してい/servlet/process_register
ますか?
私の頭の中にはいくつかの選択肢があります。
フォームのアクションパスに絶対パスを使用するだけです
転送する代わりに、response.sendRedirect(address)を使用してURLの変更を避けます(ただし、これにより、リクエストに応じて属性を設定できないため、JSPページにエラーメッセージを表示できなくなります。これは私の目標に反します)
絶対パスを使用する必要がありますか?
さらに詳しい説明が必要な場合はお知らせください。
アップデート
ヘルプデスクにマウントディレクティブを削除するように依頼したところ、すべての着信要求を受け入れるようになりました。web.xmlとフォームアクションのURLに「/servlet」との記載がなくなり、コードが正常に機能し始めました。「/servlet」が余分にある理由は、mountディレクティブによるものなのかと思います。