EDITを通過する間に:私はここにやや短く、改訂された質問を掲載している:JavaのWeb開発では、多かれ少なかれ、初心者としてJava web development: transfer control from one servlet to another while passing the request object (Version 2)のJava Web開発:別のサーブレットから転送制御要求オブジェクト
を、私は」フォームが送信されるときにサーブレット/ページ間のフローをどのように構造化すべきかについては不明です。それは初歩的な問題です、私はこれが専門家のために答えるのは簡単な質問かもしれないと思う。 (でも、私の本といくつかのグーグル・グーグルは明確な答えを出していませんでした。)私の質問は少し長いです。なぜなら、私はどこから来ているのかを明確にしたいからです。忍耐力ありがとう。
2つのサーブレットAとBがあり、それぞれに「独自の」.jspページがあるとします。それらのページをそれぞれa.jspとb.jspと呼ぶことにしましょう。いずれのページにもフォームがない限り(POSTメソッドは使用されていません)、物事がどのように進むべきかは明らかです。つまり、.jspページが表示される前に、対応するサーブレットがアクティブになり、関連するデータ要素(特にリクエストオブジェクトの属性として)を設定して、.jspページの準備を行います。要求オブジェクト(など)を.jspページに転送すると、実際にはそのページがデータとともに表示されます。たとえば、ページa.jspのリンクがサーブレットBにリンクし、そのリンクをクリックすると、サーブレットBのGETリクエストがトリガーされ、次にいくつかの準備(いくつかのリクエスト属性の設定)が行われ、自分の.jspページ(iebjsp)。
ここでは、ページa.jspが送信ボタン、メソッド= "POST"、およびアクション= "B"を含むフォームを表示すると仮定します。次に、サーブレットBがアクティブになり、このサーブレットは、ユーザーが入力したデータが有効かどうかを判断する必要があります。データが実際に有効であれば、b.jspに転送するだけで問題はありません。しかし、データが有効でない場合はどうなりますか?
この場合、明らかに最初に入力したデータがまだ残っている状態でa.jsp(フォームページ)を再度表示する必要があります。これを実現する1つの方法は、サーブレットBをa.jspに転送するだけです(サーブレットAをバイパスします)。しかし、大きな問題があります。アドレスバーのユーザーに表示されるURLは、「....../B」と表示されます。そのため、ユーザーには正しいページ(フォームを含むa.jsp)が表示されますが、間違ったURL(/ B)が表示されます。たとえば、 "A"と "B"の代わりに "Register"と "ThanksForRegistering"を取ると、ユーザーにはregister.jspが表示されますが、 "....../ThanksForRegistering"というURLが表示されます。良くない。
リクエストディスパッチャで 'forward()'の代わりに 'include()'を呼び出すと、どちらも機能しないようです。これを行うと、GETリクエスト(POST要求とは違って)が得られるだけでなく、実際には属性(必要な場合は、フォームを再入力します)。少なくとも、それは私自身の実験が示すようなものです。したがって、 'include()'を使用することは実行可能なオプションのようには思えません。
別の明白なアイデアは、送信に「action = A」(「action = B」ではなく)を使用することです。サーブレットA自体が検証を処理できます。検証が失敗した場合は、単にa.jspに転送するだけで問題はありません。しかし、検証が成功するとどうなりますか?次に、フォローアップページb.jspを表示したいが、そのページは元のrequest-objectの属性(form-submitから)を再度必要とするかもしれない。たとえば、入力されたデータが実際にすべて正しいことをユーザに確認させることができる。ですから、基本的には以前と同じ問題がありますが、AとB(とそれぞれの.jspページ)の役割が逆転しています。だから、これは本当の解決策のようには見えません。
他の選択肢はありません。
基本的には、1つのサーブレットで別のサーブレットに制御を戻すことができますが、要求オブジェクトは前者のサーブレットから後者のサーブレットに渡すことができます。または、それが不可能な場合は、私はサーブレットBからaに転送できるようにしたいと思います。直接と表示されたURLがユーザーに表示されます。または私が望むものを達成するための他の方法。
多くのありがとうございます。
実際に少し長く、問題を解決するのは難しいです。多分コードを投稿すると私たちが助けになるでしょう。 –
さらに、Webフレームワークを使用していませんか?彼らは、リダイレクト、フロー、...を作るためのソリューションを提案します。 –
私はあなたがリダイレクトを読む必要があると思います。あなたができることは、元のシナリオで、サーブレットBで検証が失敗した場合です。あなたはA.にリダイレクトを送信します。 Ref:http://stackoverflow.com/questions/6175722/redirect-from-servlet –