- ベストアンサー
シンク
初心者の質問で申し訳ありません。サーブレットとJavaBeansもしくは普通のJavaファイルで作るプログラムを考えているのですが、ふときずいたことがありますので質問してください。 サーブレットはコントローラーの部分をやっていて、基本的には、クライアントのリクエストをまっていてリクエストに応じてif elseで場合わけをして、別々のJavabeansを呼んでいくのだと思います。 ということはサーブレットはJavaBeansに比べて極端に数がすくないのではないのでしょうか?1つのシステムに一個とまではいかなくても、サーブレットは少量で、 実際の開発現場ではサーブレットより量の多いJavaBeans の開発がメインで、時間のかかる部分なのでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
視点をもっと後ろに引いてください。 POSTとGETの場合分けは、同一サーブレット(サーブレットインスタンス)内での話でしょう? 複数のサーブレットインスタンスを、さらにそれを統括するサーブレットコンテナ親分をイメージしてください。 クライアントのリクエストをサーブレットコンテナが受け取ります。このリクエストのターゲットは /AAA。 /AAAがマップされているのは、Class org.AAA_Servlet。そこで、サーブレットコンテナは org.AAA_Servletのサーブレットインスタンスへ処理を移します。 さて、ここでリクエストのターゲットが /BBB だった場合はどうなりますか? 恐らくは、別のClass org.BBB_Servletにマップされることでしょう。 サーブレットコンテナがリクエストに応じて、処理分岐を行っている為、このようなことが可能になります。 つまり、少量サーブレットと多数サーブレットの話は、乱暴に単純化すると、 サーブレットインスタンスが処理分岐をする サーブレットコンテナが処理分岐をする この違いだけです。 前回の「すでに場合わけした存在だ」というのは、この「サーブレットコンテナが処理分岐」を行っているという意味です。
その他の回答 (4)
- onosuke
- ベストアンサー率67% (310/456)
>No.1 >サーブレットのインスタンスは >singleThreadModelインターフェースが実装されて >なければ、必ず一つだと理解していたのですが。 >違いますか? 全く正反対です。 以下、J2EEのHttpServletクラスの解説からの抜粋 --------------------------------------------- サーブレットは通常マルチスレッド化された サーバ上で実行されるので、サーブレットは 要求を平行的に処理しなければならず、… --------------------------------------------- Java Web環境はそれ自体一つの大きなシステムです。 その開発手法も、システムの動作を理解した上で 習得できれば、全く異なる環境にも臨機応変に 対応できる、本当の実力が付くはずです。 面倒だとは思いますが、システム動作の理解という 観点での情報収集も行ってみてください。
お礼
URLまでつけていただきありがとうございました
- onosuke
- ベストアンサー率67% (310/456)
いろいろな情報を漁るとき、 開発の話と ランタイム(実行時)の話と は、ちゃんと区別して取り込まないと、頭が混乱しますよ。 1.ランタイム(実行時)の話 まず、最初にクライアントのリクエストを受け付けるのは、サーブレットコンテナです。サーブレットコンテナは、リクエストに対応したサーブレットインスタンスを起動します。 ちなみに、サーブレットコンテナは、TOMCATのような基本システム側の仕組みで、サーブレットインスタンスは開発したサーブレットプログラムの実行時の形です。 つまり、開発したサーブレット自体、すでにif elseで場合分けされた存在だという認識をひとつ忘れないでください。 後、少々話が変わりますが。 JSPは、実行時にサーブレットへ変換され、実行されます。 2.開発の話 難しい話は置いておいて、 (大昔) サーブレットで全部処理 ↓ (小昔) サーブレットの画面部分⇒JSP サーブレットの処理部分⇒JavaBeans JSPで面倒臭い部分⇒今まで通りサーブレット という時代の変遷があったとだけ伝えれば、 全部分かってもらえるのではないかと(笑)
補足
>つまり、開発したサーブレット自体、すでにif else >で場合分けされた存在だという認識をひとつ忘れな >いでください。 お返事ありがとうございます。 HTMLのformからのリクエストは大体が、POSTかGETですよね。この二つで場合わけはできると思いますが、それ以外は、同じ処理を通るとおもいます。(例えば、もし2つの異なるGETリクエストは、両方doGetメソッドの中の処理を行う). なぜこれですでに場合わけした存在だといえるのでしょうか?お忙しいと思いますが、再度説明いただけませんか?
開発の話なのでソースの数ですよね? そうです。 例えば有名なWebアプリケーションフレームワークであるstrutsを使った開発ではActionServletというサーブレットがはじめから用意されおり、必要がなければ全くサーブレットを作成しません。 (やったとしてもカスタマイズするぐらい) 作成するのは ・画面(つまりView)であるJSP ・画面のデータを保持する(つまりモデル)のActionForm ・submitに対応するAction ・Actionで実行されるビジネスロジック です。(細かく分けるともっと分類できますが、大まかにはこんな感じ) Webアプリケーションを作るときにサーブレットを直にいじることは少ないと思います。(私はむか~~~しに一度やったきり)
お礼
ありがとうございます。参考になりました。
- CXI00554
- ベストアンサー率27% (57/205)
私の理解では… スレッドがプールされている状態で、クライアントのリクエストが来ると サーブレットにスレッドがひとつ割り当てられてそれを処理します。です からサーブレットのインスタンスは個々のリクエストの処理が終わるまでの 間、同時並行に走れる分だけ複数存在します。
補足
サーブレットのインスタンスはsingleThreadModelインターフェースが実装されてなければ、必ず一つだと理解していたのですが。違いますか?
お礼
複数のサーブレットクラスが存在し、クライアントの操作によって、呼び出すクラスを変えるということですね。経験からくるアドバイスをありがとうございます。参考になりました。