やさしいJava活用編で勉強しているのですが、
サーブレットコンテキストの説明が書いてなく、ネットで調べても意味不明です。
サーブレットコンテキストは、
javax.servlet.ServletContextインタフェースを実装するクラスのインスタンスで、そのアプリケーションに一つあるとのことですが、
そのサーブレットコンテキストの意味がわからなくて困っています。
HttpSessionのようなもので、クライアントではなく、そのアプリケーションに対して1つあるということですが...
ServletContextオブジェクトは、具体的に何の情報を持っているのですか?
また以下のソースですが、
なぜ指定されたパスにあるリソースを、ラッパーとして機能するRequestDispatcherオブジェクトを返してから、
forwardで転送するのですか?
ServletContext sc = getServletContext();
sc.getRequestDispatcher("/thanks.html").forward(request, response);
No.3ベストアンサー
- 回答日時:
そうですねぇ。
例えて言えば、contextはナースコールみたいなものだとおもいます(「情報を持っている」というだけでなく、用事も頼めるので)。現代のアプリは、心臓や肺など、基本的な機能をアプリケーションサーバにやってもらっているので、いわば寝たきりの人みたいなものです。
自分で勝手に立って、いろいろやる力がないので、ナースコールを押してサーバにきてもらって、いろいろ助けてもらわないといけない局面があるのですね。
RequestDispatcherは、リモコンみたいなものです。看護士さんは忙しいので、患者がいちいちチャンネルを変えたいときに、毎回テレビをいじりにいく余裕がありません。
ですから、患者が「6チャンネルに変えたい」といったら、「電池を入れて、テレビのほうに向けて、ハイ」という風にセットして、さっさと自分の仕事に戻ってしまいます。
そういうことをしたいので、RequestDispatcherオブジェクトを返してからforwardをやらせる設計にしたんじゃないかと思います。
No.2
- 回答日時:
コンテキストは一般的に、「コンテナに対するリファレンスである」と考えると分かりやすいかもしれません。
コンテナとは、tomcatやjettyなどのアプリケーションサーバとほぼ同義語と考えてかまいません。
つまり、アプリが、アプリケーションサーバに何かお願いしたいときに使用される参照というわけです。
具体的には、サーブレットが初期化されるときに、コンテナから「僕に用事を頼みたいときにはこれを使ってね」と渡されているはずです。
RequestDispatcherに関しては、http://www.docjar.com/html/api/org/apache/catali …に実装コードがあります。
まずコンストラクタをみると、
/**
157 * Construct a new instance of this class, configured according to the
158 * specified parameters. If both servletPath and pathInfo are
159 * <code>null</code>, it will be assumed that this RequestDispatcher
160 * was acquired by name, rather than by path.
161 *
162 * @param wrapper The Wrapper associated with the resource that will
163 * be forwarded to or included (required)
164 * @param requestURI The request URI to this resource (if any)
165 * @param servletPath The revised servlet path to this resource (if any)
166 * @param pathInfo The revised extra path information to this resource
167 * (if any)
168 * @param queryString Query string parameters included with this request
169 * (if any)
170 * @param name Servlet name (if a named dispatcher was created)
171 * else <code>null</code>
172 */
173 public ApplicationDispatcher
174 (Wrapper wrapper, String requestURI, String servletPath,
175 String pathInfo, String queryString, String name) {
176
いろいろコンテナから情報をもらう必要があるようです。これが、直接インスタンスをユーザに作らせるのではなく、コンテキストのgetRequestDispatcher()メソッドを使う所以と考えられます。
つまり、どうしてもユーザにしか分からない情報("/thanks.html")だけは引数でもらい、あとはコンテナが必要な情報を使ってこのコンストラクタを実行し、RequestDispatcher型のオブジェクトを返してくれる、という設計です。
そこのforwardメソッドを見ると、かなり複雑なことをやっていますね("public void forward"で検索)
セキュリティをチェックしたり、エラーチェックしたり、ログを書いたり、、、
このような処理を、コンテキストの実装クラスにに直接書くことももちろん不可能ではありません。しかし、他にもたくさんある処理を、全部コンテキストの実装クラスに書いたら、そのうちの1つの処理についてコードを変えただけで、クラス全部の処理について、バグが導入されなかったか調べなければいけません。
RequestDispatcherとして分離しておけば、このクラスだけを改変してテストできるので(まぁ、システムテストも結局必要にはなりますが、リスクはかなり小さくなる)、変更や改善がしやすくなります。
オブジェクト指向の基本を抑えた設計ですね。
この回答への補足
tomcatのリファレンスみたいなものですか。
サーバの情報を参照するのですか?
具体的には、サーブレットが初期化されるときに、コンテナから「僕に用事を頼みたいときにはServletContextを使ってね」ということですか?
APIを良く見たら RequestDispatcher オブジェクトを作ることでしか、forwardメソッドを使えませんね。
No.1
- 回答日時:
> そのサーブレットコンテキストの意味がわからなくて困っています。
サーブレットコンテキストというのは「1つのまとまったWebアプリケーション」のことを言います。
Tomcatを例にして具体的に言うと、通常新規にWebアプリケーションを作成する場合 [TOMCAT_HOME]/webapps ディレクトリ配下に新たにディレクトリ(sample)を作成してその配下にHTML・JSPファイルを、[TOMCAT_HOME]/webapps/sample/WEB-INF/classes ディレクトリ配下にServletで使用する各クラスファイルを置き、[TOMCAT_HOME]/webapps/sample/WEB-INF/web.xml ファイルに設定を記述します。
これで初めてWebアプリケーションが実行できます。
このときの "sample" というのが1つのコンテキストになります。
もしも [TOMCAT_HOME]/webapps ディレクトリ配下に別のディレクトリ(sample02)を作成してWebアプリケーションが実行できる環境を整えれば、これは別のコンテキストになります。
> ServletContextオブジェクトは、具体的に何の情報を持っているのですか?
ServletContextインタフェースは、実体はTomcatなどのServletエンジン側で実装されています。Webアプリケーションの開発者側はServletContextインタフェースに書かれたメソッドを通して各情報を取得します。
参考URLにServletContextインタフェースのAPIリファレンスを載せておきます。
なお通常はこの "sample"や"sample02" という名前を「コンテキスト名」と言います。
> なぜ指定されたパスにあるリソースを、ラッパーとして機能するRequestDispatcherオブジェクトを返してから、
forwardで転送するのですか?
こちらの質問は「HTMLというリソースに対して、なぜわざわざforward()メソッドで転送するのか?」ということでしょうか?
参考URL:http://mergedoc.sourceforge.jp/tomcat-servletapi …
この回答への補足
つまり、その1つのWEBアプリケーションにある、URL、ファイル、パスや、その他様々な情報がつまっているのですね。
APIの方を見たのですが、解説がさっぱりわかりませんでした。
やはり一つ一つ理解するには経験が必要ですね。
どうしてもわからないところとして、
RequestDispatcher オブジェクトです。これを作る理由は
つまり一言で言うとパスを取得するためなのでしょうか?
ラッパーで動作する? の意味がわかりません。
ラッパー: あるプログラムの返り値を別のプログラムに渡すためのプログラムのこと。
つまり、これを作らないと、forwardで転送できないってことだけのことなのでしょうか?(インタフェースRequestDispatcherにforwardメソッドがあるわけですが)
// それぞれ意味を調べてみました。
ServletContext sc = getServletContext();
// これはServletContext()への参照を渡しているだけですね。
sc.getRequestDispatcher("/thanks.html")
/* 指定されたパスに位置するリソースのラッパーとして動作する RequestDispatcher オブジェクトを返します。
クライアントからリクエストを受け取り、さらにそのリクエストをサーバ上の(Servletや HTML ファイル、JSP ファイルのような)リソースに転送するオブジェクトを定義します。
このオブジェクトは特定のパスか、指定された名前で参照できるサーバ上のリソースのラッパーとして使われます。
.forward(request, response);
// RequestDispatcherオブジェクトを使用して、Servletからサーバ上の他のリソース(Servlet, JSP, HTMLファイル)へとリクエストをフォワード(転送)する。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- ネットワーク OSI参照モデルの各層の役割がわかりません。 3 2023/04/21 21:12
- Java 問題作成のWebアプリの作り方を教えてください 1 2022/11/26 22:01
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
- 日本語 意味とは何か? どこにあるのか?(Ⅱ) 4 2022/04/21 13:35
- 教育ソフト・学習ソフト Chat GPTさんは、意図的にウソを付けるのでしようか?間違い、ミスではなく… スレッドの最後にご 4 2023/05/18 12:18
- Java 複数TBLのオブジェクトを1つの変数(オブジェクト)でまとめて管理したい 1 2022/12/17 00:12
- Excel(エクセル) エクセル VBAの構文について 2 2023/02/10 18:26
- 日本語 意味とは何か、どこにあるのか? 16 2022/04/09 11:44
- Excel(エクセル) テキストの背後にあるオブジェクトとは 3 2023/01/03 20:22
このQ&Aを見た人はこんなQ&Aも見ています
-
あなたの「必」の書き順を教えてください
ふだん、どういう書き順で「必」を書いていますか? みなさんの色んな書き順を知りたいです。 画像のA~Eを使って教えてください。
-
これ何て呼びますか
あなたのお住いの地域で、これ、何て呼びますか?
-
初めて自分の家と他人の家が違う、と意識した時
子供の頃、友達の家に行くと「なんか自分の家と匂いが違うな?」って思いませんでしたか?
-
この人頭いいなと思ったエピソード
一緒にいたときに「この人頭いいな」と思ったエピソードを教えてください
-
【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
【お題】 ・このサンタクロースは偽物だと気付いた理由とは?
-
JSPのクラスをコンパイルできない問題
Java
-
フォーム上で押されたボタンによってサーブレットの処理を変えたい
Java
-
ServletからServletへの値渡し
Java
-
-
4
getParameterで値が取得できず、困ってます
HTML・CSS
-
5
jasper.exceptionとは?
Java
-
6
JSPやサーブレットでSystem.out.println()などでコンソールに出力できますでしょうか?
Java
-
7
正しいURL指定しているにもかかわらずJSPファイルにアクセスできず「404エラー」が発生
Java
-
8
jspからServletを呼び、元のjspページに戻るにはどうしたらよいですか?
Java
-
9
リクエストに応じたselectedの初期値設定方法
Java
-
10
変数名の付け方
Java
-
11
データ数をカウントしたいのですが
Java
-
12
count(*)で取得した値をJAVAの変数に代入するには?
Java
-
13
Eclipseで、プロジェクト名のところに赤いバッテンのエラーマークが
Java
-
14
JavaServletデバッグってどうやるの?
Java
-
15
サーブレットからパラメータをPOST形式で送信するには。
Java
-
16
CSVファイルの中で、「 , 」カンマを使いたい
その他(コンピューター・テクノロジー)
-
17
フォームで同じ複数のnameで違うvalueの送信
Java
-
18
SQLローダーCSV取込で、囲み文字がデータ中に入っている場合について
Oracle
-
19
JSPからJSPへ情報を渡せる?
Java
-
20
DBを10件毎に表示ページング処理方法
Java
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAでの[]
-
サーブレットコンテキストの意...
-
エクセルVBA 画像を貼り付ける...
-
Excel VBA 定数にオブジェクト...
-
System.Collections.SortedList
-
VB.netでメソッドからコントロ...
-
C++/CLIでの画像情報(RGB)の取得
-
getHeigth,getWidthについて
-
VB.netのコレクションについて
-
抽象クラスのオブジェクトを生...
-
VB.NETでのnothing の意義について
-
VBからアクセスを実行したい!
-
PrintFormを使用してのプリント
-
Javaでブラウザ判定
-
C#のクラスで値渡しをする
-
C#で親にイベントを投げる方法
-
カレントmdbをopenする宣言
-
VBスクリプトでテキストファイ...
-
Vba ListViewの行挿入に関して...
-
「タイプ初期化子が例外をスロ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA 画像を貼り付ける...
-
VBAでの[]
-
Excel VBA 定数にオブジェクト...
-
サーブレットコンテキストの意...
-
C#のクラスで値渡しをする
-
javaで、、、
-
servletからjspへオブジェクト...
-
VB.netでメソッドからコントロ...
-
VB.NETでのnothing の意義について
-
Vba ListViewの行挿入に関して...
-
String型からlong型への変換は...
-
VBスクリプトでテキストファイ...
-
JSPでのArrayListの表示につい...
-
Dispose()は、どんな時に使うの...
-
MessageBox.Show(Me,…の「Me」...
-
C#で親にイベントを投げる方法
-
vectorの内容をString型に変換...
-
オブジェクトの参照渡しについて
-
UTF-8のテキストファイルを開く...
-
エクセルVBA/SpecialCellsで特...
おすすめ情報