サーブレットでレスポンスが返る仕組み

このQ&Aのポイント
  • サーブレットでレスポンスが返る仕組みについて疑問があります。具体的には、PrintWriterの使い方やクライアントへのレスポンスの仕組みについて知りたいです。
  • クライアントにレスポンスを返すためには、PrintWriterを使用して文字列を出力する必要があります。
  • 具体的な仕組みについては公開されているソースコードを読むか、サーブレットの仕組みについてのリファレンスを参考にすることをおすすめします。
回答を見る
  • ベストアンサー

サーブレットでレスポンスが返る仕組み

※)回答いただける方は、自信のある方のみお願いします。   正しい内容を理解したいため、推測等での回答はお控えいただければ幸いです。 サーブレットでクライアント(ブラウザ)にレスポンスを返すとき、 PrintWriter out = response.getWriter(); //responseはHttpServletResponse out.println("Hellow World"); とコーディングします。 そこで疑問なのですが、なぜ、outに文字列をセットするとクライアントへの レスポンスが返るかです。 想像するに、getWriterの中で、responseのメンバー変数にもPrintWriterの 参照を持たせているのかなということです。 それであれば、outに文字列をセットしても、responseにセットしていることなるので、 クライアントに文字列が返されるが理解できます。 そこで質問です。 (1)この仮定は正しいでしょうか。 (2)上記の2行を書けばクライアントにレスポンスを返せるというのは、色んな本やWEBに  書いてあるのですが、どうして上記の2行を書けば、クライアントにレスポンスが  返るのかを書いた説明したものを見たことがないです。  クライアントにレスポンスを返すには、responseにセットしないといけないわけですから、  どういう仕組みで、outにセットするだけでクライアントに返るのかを理解しておかないと、  なぜか分からないけどこう書けば動く、というレベルの理解になってしまいます。  この手の仕組みを理解するには何を参考に勉強すればよいのでしょうか。  HttpServletReponseはサーブレットコンテナで実装されているので、サーブレットコンテナ  の実装クラスのソースを読めばいいのでしょうか?  もしそうであれば、サーブレットコンテナの実装クラスは公開されているのでしょうか・・・ よろしくお願いします。

  • Java
  • 回答数8
  • ありがとう数9

質問者が選んだベストアンサー

  • ベストアンサー
  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.4

3番回答者です。 <-> これは、単なる対比(ファイル入出力の場合<->サーブレットの場合)の意味で入れただけです。わかりにくかったですか済みません。 ファイル読み書きは、サーブレットでも使う基本処理だと思ったのだけど、まだ、その手前だとは思わず。。。たぶん、サーブレットの解説サイトも、ストリームの読み書き(そのためのクラスやインターフェース構成)は、理解済みとして話を進めてるせいで、あんまり詳しく書かれてないのでしょうね、きっと。 >簡潔に書くと、PrintWriterインスタンスにstreamインスタンスがあり、 >そのstreamに対して出力している(もしくはrequestオブジェクトを渡す)ような >イメージで実装されているから、クライアントに出力される おおむねその理解でよいと思います。 「ストリーム入出力」の中に、ファイル読み書きや、サーブレットのRequestとResponse、コマンドライン入出力(標準入出力)、などなどが含まれており、ファイル読み書きがもっとも具体性がある(他はかなりブラックボックス化されてる)と思ったので、前回のように回答しました。 「ストリーム入出力」で調べるとよいかも、と思ったけど、結局ファイル入出力の解説になってるサイト多いですね。 あ、ちなみに、サーブレットでは、wr.close() すべきではないとのこと。かなり古めの解説ソースをコピーしちゃったので、クローズの話も入れてしまいました。済みません。 http://www.igapyon.jp/igapyon/diary/2004/ig040317.html

taiyaki123
質問者

お礼

回答、ありがとうございます。 >ファイル読み書きは、サーブレットでも使う基本処理だと思ったのだけど、まだ、その手前だとは思わず。。。>たぶん、サーブレットの解説サイトも、ストリームの読み書き(そのためのクラスやインターフェース構成) >は、理解済みとして話を進めてるせいで、あんまり詳しく書かれてないのでしょうね、きっと。 そうでしょうか。ファイルの読み書きは基本処理とは思えません。 今まで仕事でJavaで数万ステップ程度ですがコーディングをしてきましたが、ファイル読み書きなど 一度も書いたことありません。 ファイルの読み書きが基礎で、それを学んだ人がサーブレットを学ぶというのは、万人共通ではないと思いますよ。mpro-gram様がそうであっても、他の人はそうでない人たくさんいます。 解説サイトでそういうことを書いてないのも、多くの方が「なぜ動くのか」を考えずに、 ただ単に「こう書けば動く」ということだけを主眼においている(読む人の大多数もそれを求めている) からだと思います。 リンクのURLはなんでしょうか・・・ 拝見したのですが、今回の質問との関連がわからないのですが。

その他の回答 (7)

回答No.8

なぜprintwriterに文字をセットすることが、サーブレットコンテナが持っているバイト列バッファにデータをセットすることになるのか?の質問に対し: 図8-7を見て頂く、あるいは参考URLからダウンロードしたServletResponse.javaソース・コードの107行目からを見ればわかるように、このPrintWriterは、左側は通常のPrintWriterのメソッド群を用意していますが、上からはsetCharacterEncoding(これはContent-Typeヘッダ行もセットする)で指定されたエンコーディングを受け付けるようになっており、また右側にはユーザには見えない応答ごとに作られるバイト列バッファ(デフォルトで8192バイト)が繋がっています。「printwriterに文字をセットする」ということではなく、テキスト・データからコード変換し、バイト列に変換し、つながったストリーム出力(ここではバッファ)にセットするのがPrintWriterです。この仕様をどう実装するかは実装者の自由です。基本的にはこのPrintWriterは、java.io.PrintWriterを加工して、バイト列バッファをラップし、getCharacterEncodingで文字エンコーディングを呼び出すようにし、そしてバッファの管理とネットワーク送出機能を持たすことになります。getWriterメソッドはこれをインスタンス化して戻します。printlnなどのメソッドは単にコード変換した後でバイト変換してバッファに書くだけでなく、所定の長さになればcontent-lengthヘッダ行つきあるいはチャンク形式でそれをネットワークに送出する仕事も含まれることになります。 responseオブジェクトとPrintWriterオブジェクトがどこでどう繋がっているか?の質問に関して: 要求スレッドが連れてくる応答オブジェクトごとにこのPrintWriter(およびバイト列バッファ)のインスタンスを生成することになるから、ServletResponseインターフェイスにgetWriterメソッドを持たせるのは至極当然な話でしょう。応答ごとにこのPrintWriterオブジェクトを用意しないと大変なことになってしまいます。

参考URL:
http://tomcat.apache.org/download-70.cgi
taiyaki123
質問者

お礼

ご回答ありがとうございます。 想像にするに非常にご聡明でよく理解されている方とお見受けしますが、 書かれている意味がよく分かりません。 8-7の図も意味がよく分かりません。これが何を言われようとしている図なのか。 もう少し、分かりやすい説明が不可能でしょうか。 不可能であれば、結構です。

回答No.7

サーブレット・コンテナが用意するPrintWriterオブジェクトに文字列をセットするということは、サーブレット・コンテナが持っているバイト列バッファにバイト・データをセットするということになります。それをどのようにネットワークに送出するかはサーブレット・コンテナの仕事になります。その要求スレッドがservice()を抜けた時点でそのバッファにデータがまだ残っていればそれをネットワークに送出します。 参考URLにあるチュートリアルの第8章に書いておきましたのでそちらを見てください。特に8.5.1項の図8-7を見れば分かりが早いでしょう。

参考URL:
http://www.cresc.co.jp/tech/java/Revised_Servlet_Tutorial/Revised_Servlet_Tutorial_About.htm
taiyaki123
質問者

お礼

ご丁寧にありがとうございます。 が、これをみても分からないというか、回答になっていません。 質問と回答がアンマッチしているためです。 知りたいのは、「printwriterに文字をセットすることがサーブレットコンテナが持っている バイト列バッファにデータをセットすることになる」ということではありません。 それは、動きをみればそんな感じあることは分かります。 質問は、「なぜprintwriterに文字をセットすることが、サーブレットコンテナが 持っているバイト列バッファにデータをセットすることになるのか」です。 言い方を変えると、responseオブジェクトとPrintWriterオブジェクトがどこで どう繋がっているかという質問です。

  • mintia007
  • ベストアンサー率59% (16/27)
回答No.6

No.5です。 >>そもそもsocket通信ってなんでしょうか? >>socketという言葉はありますが、socket通信という言葉はないようです。 http://www.ne.jp/asahi/hishidama/home/tech/socket/index.html http://e-words.jp/w/E382BDE382B1E38383E38388.html ・・・ インターネット検索すると沢山でてきますが。 >>socket(IPアドレス:ポート番号)で通信するということでしょうか。 全くもってその通りです。 >>またそれを、電話の例えることにより、余計わかりにくくなっています。 その人のツボにはまらないと当然、理解できませんよね。質問者様の的を得た他回答を永遠と お待ちください。 >>せっかくご回答いただいて申し訳なのいのですが、この説明ではよく理解できま >>せん。 ですから、そこまでえ言われるのでしたら、jakarta tomcatサイトにソースが掲載されてますので、 納得いくまでご勝手にお調べください。ソースにかかれている事が仕組みなのですから。 なんか、釣りっぽい質問なのか。

taiyaki123
質問者

お礼

回答どうもありがとうございます。 >>またそれを、電話の例えることにより、余計わかりにくくなっています。 その人のツボにはまらないと当然、理解できませんよね。質問者様の的を得た他回答を永遠と お待ちください。 せっかくご回答いただいて申し訳ないのですが、技術的にしっかり理解されていて、 自信をもって、なおかつ、相手に伝わるような説明・回答出来る方からのだけの回答を求めております。 その理由は、そうでない方からの回答だと、間違って理解をする可能性があり、 それは回答をいただけないことより、もっともっと困るためです。 >ですから、そこまでえ言われるのでしたら、jakarta tomcatサイトにソースが掲載されてますので、 >納得いくまでご勝手にお調べください。ソースにかかれている事が仕組みなのですから。 はい。そのとおりです。 ただ、それを言うと、どんな問題でもそういう回答になりますよね。 自分で調べることが難しかったり、調べたことの確証を得たいから、 ここで質問しているのであって、しっかり回答できない方は回答すべきではないと思っています。 質問やこういうサイトは、質問者のためにあるので、回答者のためにあるのではないと思っています。 ですから、回答者は正確で自信を持って分かりやすい説明が出来ないのであれば、 それは回答すべきではありません。 よく理解していなかったり、下手な説明しか出来ないのに説明をすることは、 単なる回答者の自己満足であり、質問者する側からすれば、説明してもらえないほうがまだましです。 もちろん、そういう考え方ではない人もいますが、私はそういう考え方なのです。 回答してくださった方を批判するための質問では決してなく、とにかく、「正しいことを」を 知りたいだけであり、そういう回答が出来るかたからだけの回答を待っています。 それが出来る方がいないのであれば、回答が永遠にゼロでもそれはそれでかまいません。

  • mintia007
  • ベストアンサー率59% (16/27)
回答No.5

先ずはsocket通信が基本となります。 サーバー(サーブレット)⇔クライアント(ブラウザ)と言っても所詮はsocket通信なんですね。 soket通信とはクライアントとサーバー(C/S)とデータのやり取りをするという、人間同士で例えると 言わば会話と言えます。会話は基本中の基本で、何言語(英語、日本語等)で話すかという決まりが あると思います。その会話というのがC/Sのsocket通信でいうHTTPという言語で話をする訳です。 ここで電話で人と話をする事を考えてみます。先ずは話したい相手の電話番号を押して電話をかけ ますよね。 で、相手の電話のベルが鳴って相手が電話に出ます。そこから「もしもし」等の会話が始まる 訳です。これをC/Sのsocket通信に置き換えると、相手の電話番号がURL(http://localhost:8080/ など)となります(細かく言うとIPアドレスです)。もし内線番号がある場合、8080とかが内線番号 となります。通常はHTTP通信(ブラウザとの通信)の場合、80にておこなっています。その場合、80は 決まりきっているので、通常はhttp://localhost:80/とか内線(ポート番号)は付けずhttp://localhost/でアクセスしますよね。 で、電話の話に戻りますが相手と話をする際「もしもし」という言葉をかけるかと思います。 socket通信の場合、これが面倒で、1文字づつ送りだしてやる必要があります。 「も」「し」「も」「し」という感じです。この1文字づつ出して通信を行うのをストリームといい ます。ただ、これでは面倒ですよね。「もしもし」と単語をいっぺんに送りたいですね。 これを実現しているのがPrintWriterです。PrintWriterのインスタンスを取得し、 out.print("もしもし")としたほうが当然便利です。 ストリームだと一文字づづおくるので、ちょい手間がかかります。 socket通信ではサーバーとクライアント間で手を結びます。手を結んだ後は、話をする(通信をする) ために、ストリームが用意されます。ストリームは相手から来るストリーム(人間の会話で例える と耳)と相手へ出すストリーム(人間の会話で例えると口)の2つ取得する事ができます。 HttpServletReponse(親インターフェイスのServletResponseも含め)には複雑なのですが、 出力のストリームのインスタンス(OutputStreamクラス系の)をメンバ変数に持っています。 このストリームからPrintWriterのインスタンスを生成できます。これで、out.print()を使う事が できるわけです。 ここまでをまとめますと、 ・サーバー(サーブレット)⇔クライアント(ブラウザ)は単にsocket通信なんです。 ・socket通信に使っている言語はHTTPプロトコルとなります。 ・ポート(内線番号)は通常では80ですが、tomcatのデフォでは8080となっています。 ・会話は一言一言話すのではなく、単語で話しています(PrintWriter) です。 >>この手の仕組みを理解するには何を参考に勉強すればよいのでしょうか。 先ずはsocket通信の仕組みを勉強されてください。 サーブレットはデフォでシングルインスタンスマルチスレッドモデルの管理等、単純なsocket通信 だけではなく、スレッド管理もしていますので複雑です。 また、もしよろしければjakarta tomcatサイトにtomcatのソースが無償で配布されていますので、 覗いてみるのも手かもです。 更にsocket通信の中身まで知りたいというのであれば、ネットワーク関連を勉強してみてください。 ちなみに、javaの場合、基礎的なsocket通信に必要なAPIが揃っています。 (Socketクラス、ServerSocketクラス等) その中身までというのであれば、JDKをインストールしたディレクトリの中にsrc.zipという ファイルがありますので、その中身を見る必要がありますね。

taiyaki123
質問者

お礼

詳しくご説明いただき、大変恐縮です。 真にありがとうございます。 でも、質問内容とsocket通信って関係ないですよね。 そもそもsocket通信ってなんでしょうか? socketという言葉はありますが、socket通信という言葉はないようです。 socket(IPアドレス:ポート番号)で通信するということでしょうか。 であれば、それは通信の上では、当然のことですよね。 一般に定義されてない言葉を使われることにより、どういう意味で使われているのかを すごく考えてしまいます。 またそれを、電話の例えることにより、余計わかりにくくなっています。 Javaを説明される多く方が、よく色んなたとえで説明されますが、例え話より 正確な話の方がよく分かります。 例え話と現実には共通部分もあれば違う部分もあり、また例えられる内容にもよって 人によって捕らえ方が違うため、返って理解の阻害になります。 ストリームには入力(耳)と出力(口)があるようですが、その出力(口)のインスタンスを メンバー変数としてHttpServletReponseは持っているのですよね。 そこまでは分かりますが、その出力(口)がPrintWriterインスタンスを生成できるとのことですが、 その出力(口)がPrintWriterインスタンスを生成できたら、なぜ、クライアントに出力できるのでしょうか。 せっかくご回答いただいて申し訳なのいのですが、この説明ではよく理解できません。

  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.3

ファイル書き込みと対比させてみるといいかも。HTTP通信にしてもファイル読み書きにしても、Streamでのやりとりなので、最終的に同じPrintWriterクラスから出力という形に統一されている。 1.ファイル open  <->  HttpServlet open = 接続の確立(クライアントからの1件の要求) OutputStream out = new FileOutputStream(outfile);  <-> HttpServlet継承クラスにおいて、メソッドの引数で、HttpServletResponse resとして出力ストリーム用インスタンスを受け取る ex. public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { } 2.ファイルstream から、PrintWriter取得 <->  送信用にPrintWriter 取得 PrintWriter wr = new PrintWriter(new BufferedWriter( new OutputStreamWriter( out,"EUC-JP" ) ));  <-> PrintWriter wr = res.getWriter(); /* ファイル書き込みでは、buffering用インスタンスを自分で用意しないといけないが、ServletResponseでは、既に設定済みのPrintWriterを返すメソッドがある。 getWriter メソッドの中で、PrintWriterインスタンスに現在の接続情報(Streamまたは、Writer継承インスタンス)を渡している。 よって、「responseのメンバー変数にもPrintWriterの参照を持たせている」ではなく、保持してるのは、PrintWriter側で、Streamインスタンスを保持。 */ 3.文字列出力  <->  同じクラス型になってるので、同じ構文で出力(=送信)可能になる wr.println("string"); /* PrintWriterインスタンスは、自分が保持しているStreamインスタンス経由で文字列をそれぞれの接続先へ出力。 */ 4.ストリームのクローズ。PrintWriterインスタンスが、Streamインスタンスを持ってるので、PrintWriterからファイルストリーム や HttpServletResponse をもclose出来る。 wr.close();

taiyaki123
質問者

お礼

ありがとうございます。 ただ、ファイル書き込みと比較することで、分かりにくくなっています。 ファイル書き込みを理解している人であればいいですが、そうでなければ、 まずファイル書き込みから理解し、それと比較して理解しないといけないので、 余計にわかりにくいです。 簡潔に書くと、PrintWriterインスタンスにstreamインスタンスがあり、 そのstreamに対して出力している(もしくはrequestオブジェクトを渡す)ような イメージで実装されているから、クライアントに出力されるということのようですね。 ちなみに、<-> はどういう意味でしょうか。通信を意味するのでしょうか・・・

noname#155524
noname#155524
回答No.2

(1).の仮説はまったくの見当はずれです。 (2).これを理解するには、 1.ソケット通信の仕組み 2.HTTPという仕組み の順で理解ができれば、自ずと回答が得られると思います。 >なぜ、outに文字列をセットするとクライアントへのレスポンスが返るかです。 まず、この考えは間違っています。 PrintWriter は、JavaBeans ではありません。 PrintWriter#println の引数に文字列を与えることが、インスタンス変数にセットする setter とは異なる意味をもつということを理解してください。

taiyaki123
質問者

お礼

せっかくご回答いただき申し訳ないのですが、 言われている意味がわかりません。 おのずから回答が得られるのであれば、わざわざ質問しませんし、 この回答であれば、回答してくださらないほうがありがたいです。

回答No.1

回答にはならないのですが考え方です。 JavaではHttpServletResponse(ServletResponse)をインターフェースとして定義しています。 ServletResponseの説明を読めば「文字データを送り返す場合は、getWriter() メソッドにより取得できる PrintWriter オブジェクトを使ってください。」とあります。 使う側に対してこのような説明をしているわけですから、このように使うのが正しいのです(もちろん使う側だけの理由で一方的に定義しているわけではないですが)。 さて、ServletResponseはインターフェースですからTomcatなどのサーブレットはこれを実装する必要があります。実装の仕方はTomcatに委ねられます。 よって、(1)の仮定は(2)にあるようにTomcatのドキュメント/ソース等を読まないと分からないというになります。 今回の場合はServletResponseで使い方が指定されているのでそれに従って使えばよいと考えます。 ただし、理解しようとすることは良いことだと思います。 私はその昔、1文字の文字列もStringのequalsを使ってコーディングし大失敗したことがあります。equalsが比較してくれると書いてあるからそのまま使いました。 ですがこのコードは全く不適切です。equalsの実行コストは途方もなく大きく実装されているからです(Stringでの実装は文字列のハッシュ値をまず算出し、マッチすればその後文字列比較を行います)。このような場合にはcharAtを使うべきでした。 仕様書に書いてあることは正しいのですがどのように使うかは使う側の問題です。 ServletResponseの場合には1通り(?確認していません)なのでこの通りに使えばよいと考えます。

taiyaki123
質問者

お礼

どうもありがとうございました。 ただ、考え方ではなく、結論が頂きたいです。

関連するQ&A

  • サーブレットについて

    こんにちは。 サーブレットに質問したいことがあります。 以下のサンプルソースで、 response.setContentType("text/html;charset=Shift_JIS"); の部分があるのですが、このようにすると日本語が文字化けしてしまいます。 ちなみにresponse.setContentType("text/html); とすると、日本語も文字化けせずに正しく表示されます。 ここで質問なのですが、 サーブレットの場合はJSPと違い、charsetを指定しなくてもよろしいのでしょうか? 何か分かることがありましたらご教授御願い致します。 ---------☆サンプルソース(HelloWorldExample.java)☆---------------- import java.io.*; import java.text.*; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorldExample extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { response.setContentType("text/html;charset=Shift_JIS"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>ハローワールド</title>"); out.println("</head>"); out.println("<body>"); out.println("<h1>HelloWorld ハローワールド</h1>"); out.println("</body>"); out.println("</html>"); out.close(); } } ---------------------------------------------------

    • ベストアンサー
    • Java
  • サーブレットのコンパイルについて

    はじめまして。 学校の課題の方でJSP/サーブレットをやっているのですが、サーブレットのコンパイルが通りません。 プログラムとエラーと環境変数は以下の通りです。 【プログラム】 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException { printWriter out = response.getWriter(); out.println("hello"); } } 【エラー】 HelloServlet.java:2: パッケージ javax.servlet は存在しません。 import javax.servlet.*; ^ HelloServlet.java:3: パッケージ javax.servlet.http は存在しません。 import javax.servlet.http.*; ^ HelloServlet.java:5: シンボルを解決できません。 シンボル: クラス HttpServlet 場所 : HelloServlet の クラス public class HelloServlet extends HttpServlet ^ HelloServlet.java:7: シンボルを解決できません。 シンボル: クラス HttpServletRequest 場所 : HelloServlet の クラス public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException ^ HelloServlet.java:7: シンボルを解決できません。 シンボル: クラス HttpServletResponse 場所 : HelloServlet の クラス public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException ^ HelloServlet.java:7: シンボルを解決できません。 シンボル: クラス ServletException 場所 : HelloServlet の クラス public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException ^ HelloServlet.java:9: シンボルを解決できません。 シンボル: クラス printWriter 場所 : HelloServlet の クラス printWriter out = response.getWriter(); 【環境変数】 CATALINA_HOME C:\servletbook\apache-tomcat CLASSPATH %CATALINA_HOME%\common\lib\jsp-api.jar;%CATALINA_HOME%\webapps\atmarkit\WEB-INF\classes;%CATALINA_HOME%\common\lib\servlet-jsp.jar; よろしくお願いします。

  • サーブレットで外部テキストファイルからの出力が文字化け

     サーブレットで、外部テキストファイルを読み込んで、それをHTMLとして出力すると、日本語部分が文字化けしてしまいます。 外部ファイルの文字コードはUTF-8Nになっていますし、ブラウザで他の文字コード(Shift-JIS、EUC-JP)で表示するように指定しても、文字化けするだけでした。 なお、環境は、 JDK:Java 6 Update 3 サーブレットコンテナ:GlassFish v2 OS:Windows XP Home SP2 開発環境:NetBeans 6.0 (+日本語言語パック) ソースコードは以下のとおりです。 private void printFile(String filePath, PrintWriter out) throws FileNotFoundException, IOException{  FileReader file = new FileReader(getServletContext().getRealPath(filePath));   BufferedReader bfile = new BufferedReader(file);   //一行の文字列   String line;   while(true){    //ファイルから一行読み取る。読み取れなかったらループ終了。    if((line = bfile.readLine()) == null){    break;   }   //一行出力(ここは日本語が文字化け)   out.println(line);  }  bfile.close();  file.close(); } protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {   response.setContentType("text/html; charset=UTF-8");   PrintWriter out = response.getWriter();   //中略   out.println("<meta http-equiv=\"Content-Type\" " + "content=\"text/html; charset=UTF-8\">");   //中略   out.print("ここは正常に表示される");   //中略   printFile("/file.txt",out);//ここで日本語が文字化け } ・・・よろしくお願いいたします。

    • ベストアンサー
    • Java
  • サーブレットの途中終了について

    サーブレットの勉強を始めたばかりですが、基本的なことで教えてほしいことがあります。 別のサーバーから複数のパラメータを伴って呼び出されて、いくつかの処理をした後結果を返すのですが、数値のパラメータが数値文字列でなかった場合や特定の範囲を超えていた場合、例外処理が発生しないように詳細なメッセージをエラー文として返すようにしています。 このとき public class TransformRect extend HttpServlet { public void doPost(HttpServletRequest req, HttpServletResponse res) throws IOExseption, ServletException { PrintWriter out = res.getWriter(); ....... float fl = GetFloatNumberFromParam(req.getParameter("length")); if (fl<0) { out.println("Error ....."); // (PrintWriter で詳細を出力) out.close(); return; } ......... } こうして途中でreturnしようと思うのですが、問題は起きないですよね。メソッドのreturnは理解していますが、メインのクラスの終了もこうして大丈夫だとは思っているのですが、マルチスレッドにも対応しないといけないので不安です。 Javaは初めてなのでどなたか教えていただきたいです。よろしくお願いいたします。

    • ベストアンサー
    • Java
  • サーブレットからBeanに

    こんにちは areaフォルダに AreaServlet 、GetterServlet beanフォルダに FirstBean ============================== package area; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class AreaServlet extends HttpServlet { private static final String CONTENT_TYPE = "text/html; charset=Shift_JIS"; public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { String info="滋賀県"; bean.FirstBean fiBe = new bean.FirstBean(); fiBe.setZip(info); response.setContentType(CONTENT_TYPE); PrintWriter out=response.getWriter(); out.println("<html>"); out.println("<head><title>BeanServlet</title></head>"); out.println("<body>"); out.println("FirstBeanにセットされたデータ:" + fiBe.getZip() ); out.println("<p><a href=\"/jspbean2/servlet/area.GetterServlet\">Bean確認用</a>"); out.println("</body></html>"); } } ============================== package area; import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class GetterServlet extends HttpServlet { private static final String CONTENT_TYPE = "text/html; charset=Shift_JIS"; public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException { response.setContentType(CONTENT_TYPE); PrintWriter out=response.getWriter(); bean.FirstBean fiBe = new bean.FirstBean(); out.println("FirstBeanにセットされたデータ:" + fiBe.getZip() ); } } ============================== package bean; public class FirstBean { private String zip; //Setterの定義 public void setZip(String newZip) { zip = newZip; } //Getterの定義 public String getZip() { return zip; } } ============================== AreaServlet ではきちんと bean へ文字列を setし、また文字列を getしているようです。 その後 AreaServlet から GetterServlet へと移ったとき GetterServlet にも bean から文字列をgetしたいのに、どうしてか null が返ってgetできません??? どのようにしたら良いでしょうか? よろしくお願いします。

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

    お世話になっております。 今回質問させていただきたいのはサーブレットコンテナ上のメモリ解放についてです。サーブレットの動作フローとしては、 (1)クライアントからHTTPリクエストが投げられる。 (2)Webサーバがリクエストを受け取り、コンテナへリクエストを委譲する。 (3)サーブレットコンテナは、リクエストとレスポンスのラッパーオブジェクトを生成し、リクエストへリクエスト情報をマッピングする。 (4)(3)で生成したリクエスト/レスポンスオブジェクトをサーブレットへ参照渡しする。 (5)サーブレットが処理を実行する (6)レスポンスを生成し、クライアントへ返す。 という流れかと思いますが、この際に(3)で生成されるラッパーオブジェクトや、ロードされたサーブレットが解放されるのは、レスポンスを返した後なのでしょうか。それとも次のリクエストに備え、オブジェクト本体は確保されたまま、次のマッピングに備えるのでしょうか。(サーブレットの解放はコンテナが終了した際?) はたまた、やはりJava特有のガベージコレクションが働き、メモリ解放はガベージコレクションのタイミングで行われるのでしょうか、、 よろしくお願い致します。。m(._.)m

    • ベストアンサー
    • Java
  • サーブレットPrintWriterについて

    Javaの初心者でこまってまして・・・ public void doPost(HttpServletRequest request, HttpServletResponse response){ try{ // コンテンツタイプの設定 response.setContentType("text/html; charset=Shift_JIS"); // 外部出力 PrintWriter out = response.getWriter(); out.println("<html>");・・・(1) out.println("<head><title>goo!</title></head>");・・・(2) エラーがおこるような処理・・・(3) out.println("</html>")・・・(4) }catch(エラー ex){ out.println("エラーが発生しました。")・・・(5) } } このようなプログラムがあり、(3)でエラーが出たときに catchした場合(5)のメッセージだけを出力したいのです。 いまは(1)(2)(5)という感じで出力されてしまいます。 flushしてみたりしたのですが うまくいきませんでした。 わかる方おしえていただけますでしょうか

    • ベストアンサー
    • Java
  • JavaBeansファイルとサーブレットファイルのコンパイルについて

    JavaBeansファイルをコンパイルして、クラスファイルを 作成したのですが、 サーブレットファイルから、JavaBeansのクラスファイルを importするところで、コンパイルが止まってしまいます。 普通のサーブレットファイルはコンパイル できるので環境設定&動作確認OKです。 コンパイル時のファイルの場所は JavaBeansファイル:「c:\java\javaBeans」フォルダに格納しています。 サーブレットは:「c:\java」に格納しています。 コンパイルできると思ったのですが、 「パッケージexpertBeans(javaBeansのフォルダ名)は存在しません。」と いうエラーが帰ってきてしまい、JavaBeansのクラスファイルが認識してくれなくて 困っています。 ■JavaBeansクラスファイルのコード package expertBeans; public class PointPool{ int point; public PointPool(){ point=20; } public void setPoint(int point){ this.point=point; } public int getPoint(){ return(this.point); } } ■サーブレットファイルのコード import expertBeans.PointPool; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ServletToBean extends HttpServlet{ public void doGet(HttpServletRequest request,HttpServletResponse response) throws IOException,ServletException{ int point = 70; PointPool pp = new PointPool(); pp.setPoint(point); response.setContentType("text/html;charset=Shift_JIS"); PrintWriter out = response.getWriter(); out.println("<title>ポイント</title>"); out.println("ポイント数<b>" + pp.getPoint() + "点"); } } 些細なアドバイスでもいいので、 よろしくお願い致します。m(__)m

  • サーブレットのログ出力先

    javaを勉強し始めて1ヶ月にも満たない初心者ですが助言を頂けないでしょうか? また、見当違いの事を質問しているかもしれませんが、その場合は指摘下さい。 現在、下記環境にて簡単なサーブレットを作成しています。 ・OS:WindowsXP ・JDK:1.6.0_24 ・Tomcat:7.0.8 ・HelloWorldServlet.java import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class helloWorldServlet extends HttpServlet { public void doGet (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html; charset=Shift_JIS"); PrintWriter out = response.getWriter(); out.println("<html><body>"); out.println("Hello World!!"); out.println("</body></html>"); log("HelloWorldServlet"); } } サーブレットが正常動作する事をログ上でも確認できればと思い、 logメソッドを使用してログの出力をしました。 ログはTomcatのルート配下にある[logs]というフォルダ内に、 [localhost.yyyy-mm-dd.log] というファイルが作成され、その中に記述されているところまでは確認できました。 できればアプリケーション毎に作成されるファイル名や作成されるファイルの保存場所を 明示的に指定したいと思うのですが、そうするにはどうしたら宜しいでしょうか?

    • ベストアンサー
    • Java
  • jsp/サーブレット

    jsp サーブレットを勉強しています。 jspに入力された値を サーブレットに投げます。 サーブレットからjavaクラスに値を投げて javaクラスで値が正しいかどうかを判断します。 その結果をサーブレットに投げて、 サーブレットからjspに投げて jspで結果を表示する。というのは理解できました。 しかし私が行いたいのは、 クライアントがjspにアクセスしたときに、 javaクラスにある値をjspに表示させたいというものです。 この場合はサーブレットに何も投げるものがないのですが、 jsp→サーブレット→javaクラス→サーブレット→jsp このようにサーブレットを使って表示させるには、 どのようなプログラムを書いたらいいのでしょうか。 わかりにくい説明で大変申し訳ないですが、 具体的なプログラムを教えていただけるとありがたいです。 また、参考になりそうなURLがありましたら教えてください。 よろしくお願いします。

専門家に質問してみよう