2016-12-30 11 views
0

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がユーザーに表示されます。または私が望むものを達成するための他の方法。

多くのありがとうございます。

+1

実際に少し長く、問題を解決するのは難しいです。多分コードを投稿すると私たちが助けになるでしょう。 –

+0

さらに、Webフレームワークを使用していませんか?彼らは、リダイレクト、フロー、...を作るためのソリューションを提案します。 –

+0

私はあなたがリダイレクトを読む必要があると思います。あなたができることは、元のシナリオで、サーブレットBで検証が失敗した場合です。あなたはA.にリダイレクトを送信します。 Ref:http://stackoverflow.com/questions/6175722/redirect-from-servlet –

答えて

1

私は、サーブレットごとに1ページがなければならないという前提が問題を引き起こしていると思います。入力リダイレクト、転送、または特定のページを含む1つのサーブレットがあります。あるページに対して別のサーブレットを呼び出す場合は、コンビネーションがページにリダイレクトまたは転送されるビューリゾルバを持つ単一のフロントコントローラを持つことができます。

+0

+ 1つのサーブレットをルータとして使用することを提案します。これはあなた自身のルータを実装するようなものです。しかし、私はあなたの目的がこの目的のために単一のサーブレットを実装することであるならば、それは常に前方のルータの背後にあるように行動し、何も処理しないことだと主張します。 –

+0

ありがとう@phrasant、はい私はあなたが何かになるかもしれないと思う。ただし、検証が成功した場合は、ホームページに戻り、入力したデータの一部をホームページに表示したい(つまり、依然としてリクエストオブジェクトの属性が必要です)とします。確かに、アドレスバーに登録ページ(すなわち、フォームページ)のURLが表示されたホームページ(.jsp)を持つことは奇妙なことです。しかし、単にRegisterサーブレットからhomepage.jspに転送した場合に起こります。 – Holland

+0

@MukulGoel正しいmukul ...すべてのビジネスロジックは、サーブレットから呼び出されたサービスによって実装されるべきです...そして、サービスレスポンスに基づいて...サーブレットは、表示リゾルバを使ってどのビューを表示するかを決定します。 。 – prashant

-1

妥当性検査が成功した場合、フィルタを使用してHttpSessionの属性を設定したり、必要に応じてすべてのページでデータを取得したりすることができます。 session.setAttribute( "object"、object);

私はこれがあなたが探していることを望みます。

関連する問題