2

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ページにリダイレクトします。

問題

各フォームは個別に正常に機能しますが、一緒に使用すると問題が発生します。

  1. ログインフォームに無効な入力を入力すると、カスタムメッセージが正しく表示された状態でhttp:// localhost:8080 / servlet/loginにリダイレクトされます。

  2. 同じページ(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ますか?

私の頭の中にはいくつかの選択肢があります。

  1. フォームのアクションパスに絶対パスを使用するだけです

  2. 転送する代わりに、response.sendRedirect(address)を使用してURLの変更を避けます(ただし、これにより、リクエストに応じて属性を設定できないため、JSPページにエラーメッセージを表示できなくなります。これは私の目標に反します)

絶対パスを使用する必要がありますか?

さらに詳しい説明が必要な場合はお知らせください。

アップデート

ヘルプデスクにマウントディレクティブを削除するように依頼したところ、すべての着信要求を受け入れるようになりました。web.xmlとフォームアクションのURLに「/servlet」との記載がなくなり、コードが正常に機能し始めました。「/servlet」が余分にある理由は、mountディレクティブによるものなのかと思います。

4

1 に答える 1

1

ただし、これは転送であるため、URLはhttp:// localhost:8080 / regis_and_login.jspからhttp :// localhost:8080 / servlet/loginに変更されます。

このフレーズは少し奇妙です。転送はURLをまったく変更しません。転送は、現在のHTTPリクエストの処理を続行するために、別のリソース(サーブレットまたはJSP)を指すだけです。フォームアクションのURLが元のリクエストURLと異なるため、URLが変更されます。このURLで同期POSTリクエストを実行しています。ブラウザのアドレスバーのURLがフォームアクションURLになります。

これで、URLがおかしくなりました。
要求されたリソース(/servlet/servlet/process_register)は利用できません。

したがって、最初はコンテキストパスが"/"あり、フォームを送信すると次のようになり"/servlet"ますか?申し訳ありませんが、問題の原因は他にあります。WebアプリケーションはROOTとしてデプロイされていますか?実行していると思われるコードを実行していますか?


ただし、この問題に別の方法でアプローチする方法について2つの推奨事項があります。

  1. サーブレットを/servlet/process_registerとにマップするのではなく、と/servlet/loginだけにマップします。/process_register/login

    <form action="process_register" method="post">
    ...
    <form action="login" method="post">
    
  2. または、JSPファイルをフォルダに隠し、GETとPOSTの両方/WEB-INFに単一のサーブレットを使用して、押されたボタンに応じてサーブレットに目的のアクションを実行させます。/register_and_loginこのようにして、URLは常にhttp:// localhost:8080/register_and_loginのままになります。

于 2010-09-08T11:50:43.750 に答える