Javaサーブレットのライフサイクルについての質問です。
まだJavaサーブレットの開発に携わってから間もないので、不足な点がありましたら申し訳ございません。

サーブレットは一度アクセスするとサーブレットコンテナ上で動作を続けますが(コンテナ上で実体が常駐する)、サーブレットがデータベースと接続しているという前提での文ですが、サーブレットの中のdoPostメソッド内でtry~catch~finally文のfinallyのところでデータベースの切断(close()メソッドで)等のリソースの開放を行い、それ以降はそのサーブレットにアクセスが無くなったとしたら、サーブレットはどの位の期間でライフサイクルが終了するのでしょうか。

サーブレットではdestroyメソッドでサーブレットの消滅がされると思いますが、サーブレットへのアクセスがそれ以降無かったりしても、もう一度アクセスされたりしても、ライフサイクルを考えるとdestroyを入れた方がよいのか、という事もどうすればよいのか分からなくて・・・。

是非、サーブレットのライフサイクルに関して詳しい方がいらっしゃいましたら、ご教授宜しくお願いします。

A 回答 (1件)

一言で言えばサーブレットエンジンの設定次第、でしょうか。


各社からWebアプリケーションサーバーが出ていますが、大体どれもDBのコネクションプールやスレッドプール機能を持っています。
またこれによりサーブレット自体が直接DBと接続するのではなく、リソースの管理はWebアプリケーションサーバーが行うことになります。
不要な(=未使用)のサーブレットは設定された時間やリソースに空きが無ければ古いものから順に捨てられて(=destroy)いきます。

詳しい設定方法やデフォルト値についてはお使いのアプリケーションサーバー製品のマニュアルをご覧ください。
    • good
    • 0
この回答へのお礼

MarrowGさん、こんにちは。詳しいご回答有難うございました。
ようやくサーブレットのライフサイクルについて、少しずつ分かってきました。
Webアプリケーションサーバがやはり関わりを持ってくるのですね。
後はWebアプリケーションサーバのマニュアル等を読んで、学習を進めていきたいと思います。
ご回答嬉しかったです。改めて有難うございました。

お礼日時:2001/11/02 09:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qサーブレット-サーブレットの通信で文字列を送りたいのですが

サーブレット間の通信で文字列(String)を送りたいのですが
うまく受け取れません。
URLEncoder.encodeをつかって変換して送り、
URLDecoder.decodeで受けとってます。お願いします。

Aベストアンサー

具体的に、どうなってしまうのかが分からないと、答え様がないですね。

(1)最初の文字列
(2)URLEncoder.encodeの結果
(3)URLDecoder.decodeの結果
が提示されていると、有力なヒントになるはず。差し支えなければご提示を。

Qサーブレットコンテナのメモリ解放について

お世話になっております。
今回質問させていただきたいのはサーブレットコンテナ上のメモリ解放についてです。サーブレットの動作フローとしては、

(1)クライアントからHTTPリクエストが投げられる。
(2)Webサーバがリクエストを受け取り、コンテナへリクエストを委譲する。
(3)サーブレットコンテナは、リクエストとレスポンスのラッパーオブジェクトを生成し、リクエストへリクエスト情報をマッピングする。
(4)(3)で生成したリクエスト/レスポンスオブジェクトをサーブレットへ参照渡しする。
(5)サーブレットが処理を実行する
(6)レスポンスを生成し、クライアントへ返す。

という流れかと思いますが、この際に(3)で生成されるラッパーオブジェクトや、ロードされたサーブレットが解放されるのは、レスポンスを返した後なのでしょうか。それとも次のリクエストに備え、オブジェクト本体は確保されたまま、次のマッピングに備えるのでしょうか。(サーブレットの解放はコンテナが終了した際?)
はたまた、やはりJava特有のガベージコレクションが働き、メモリ解放はガベージコレクションのタイミングで行われるのでしょうか、、

よろしくお願い致します。。m(._.)m

お世話になっております。
今回質問させていただきたいのはサーブレットコンテナ上のメモリ解放についてです。サーブレットの動作フローとしては、

(1)クライアントからHTTPリクエストが投げられる。
(2)Webサーバがリクエストを受け取り、コンテナへリクエストを委譲する。
(3)サーブレットコンテナは、リクエストとレスポンスのラッパーオブジェクトを生成し、リクエストへリクエスト情報をマッピングする。
(4)(3)で生成したリクエスト/レスポンスオブジェクトをサーブレットへ参照渡しする。
(5)サー...続きを読む

Aベストアンサー

サーブレット自体のアンロードは、明示的にサーブレットをシャットダウンしたとき以外は行われません。
基本的に、サーバが生きてる限りずーっとオンメモリです。

リクエスト/レスポンスのラッパーオブジェクトは基本的には(サーブレットでブールするような仕組みで作らない限り)破棄されると思います。
オブジェクトの破棄は、Javaの仕様通りにGCが行います。

Qサーブレットforward時の実行メソッドについて

初歩的な質問で失礼します。

サーブレットAに doGet, doPost, serviceメソッドを実装しています。
サーブレットBのdoPostメソッド内にて
サーブレットAにforwardを実行する場合に、
呼出されるのはサーブレットAのどのメソッドですか?

JSPへのforwardはできたのですが、
サーブレットへのforwardができず悩んでいます。

サーブレットのAPIを読んでもいまいちわかりません。
何かメソッドに関する制約があるのでしょうか?
上の質問は全くマト外れでしょうか?

追加ですが・・・
サーブレットからforwardされたサーブレットで、
そこからさらにJSPへforwardすることはできますか?

Apache2.0.43+tomcat4.1.12+Java1.4.0_01です。

Aベストアンサー

> サーブレットBのdoPostメソッド内にて
> サーブレットAにforwardを実行する場合に、
> 呼出されるのはサーブレットAのどのメソッドですか?

doPost() のはず。実際には、forward するときの HttpServletRequest#getMethod() で取得できる文字列に従うはず。

> JSPへのforwardはできたのですが、
> サーブレットへのforwardができず悩んでいます。

forward に関して、servlet と JSP の違いはないはず(というか、JSP は自動コンパイルされる servlet だし)。
getRequestDispatcher() してるパスが間違っているのだと思います。

> サーブレットからforwardされたサーブレットで、
> そこからさらにJSPへforwardすることはできますか?

コンテナの実装次第だけど、forward() は、サブルーチン呼び出しと変わらないはずなので、
回数に制限はないはず。

Qサーブレット(doGetメソッド内)でMySQLテーブル内を、

サーブレット(doGetメソッド内)でMySQLテーブル内を、
CSVファイルとしてクライアントへダウンロードする以下プログラムで、
UTF-16LE(BOM無し)でCSVファイルが正常に出力されております。

そこでご質問内容なのですが、このCSVを出力する際に、
BOM無しではなくて、
「BOM有り」でCSVファイル出力する(BOMを追加する)方法を教えてください。
  ↓
final ResultSetMetaData meta = rs.getMetaData();
(上記のrsは、MySQLテーブル内をSELECTしたレコードセットです)

response.setContentType("application/octet-stream;charset=utf-16le");
response.setHeader("Content-Disposition", "attachment; filename="
+ "KYOIKU.csv");
out = response.getWriter();

for (int i = 1; i <= meta.getColumnCount(); i++) {
out.print("\"" + meta.getColumnName(i) + "\"");
out.print(i < meta.getColumnCount() ? "\t" : "");
}
out.print("\r\n");

while (rs.next()) {
for (int i = 1; i <= meta.getColumnCount(); i++) {
out.print("\"" + rs.getString(i) + "\"");
out.print(i < meta.getColumnCount() ? "\t" : "");
}
out.print("\r\n");
}

} catch (final NumberFormatException e) {
(以下省略)

お世話になります
以上、宜しくお願い致します。

サーブレット(doGetメソッド内)でMySQLテーブル内を、
CSVファイルとしてクライアントへダウンロードする以下プログラムで、
UTF-16LE(BOM無し)でCSVファイルが正常に出力されております。

そこでご質問内容なのですが、このCSVを出力する際に、
BOM無しではなくて、
「BOM有り」でCSVファイル出力する(BOMを追加する)方法を教えてください。
  ↓
final ResultSetMetaData meta = rs.getMetaData();
(上記のrsは、MySQLテーブル内をSELECTしたレコードセットです)

response.setContentType("application...続きを読む

Aベストアンサー

> out = response.getWriter();
の後辺りで、BOMを出力したら良いんじゃないでしょうか。

out.print("\uFEFF"); // BOM 出力。

テストしていませんが、こんな感じで、如何でしょう。

Qサーブレットのアクセスルート

localhost:8080/親ファイル(プロジェクト)/

で、この次はweb.xml内のurl欄を記入するんですか?それともweb.xmlまでのルートも記入するんですか?

Aベストアンサー

基本は
http://ホスト:ポート/コンテキストルート/web.xmlで指定したurl-pattern
です。
コンテキストルートは、アプリケーションの配備方法で異なるのですが、
Eclipseからやっているのであれば、大抵はプロジェクト名です。

色々と前提条件が端折られていると、回答がつきにくいので

・使っているサーブレットコンテナとそのバージョン。
・アプリケージョンの配備方法
・Eclipseを使っているのであれば(プロジェクトって言ってるし)、
 動的Webプロジェクトなのか、Tomcatプロジェクトなのか
・差支えなければ、web.xmlにどう記述しているか

くらいは提示した方が良いですよ。


このカテゴリの人気Q&Aランキング

おすすめ情報