
サーブレット&JSPの基本|サーブレットでHTMLを出力する
Javaの処理結果をHTMLにしてブラウザへ返す。サーブレット出力の基本形をしっかり身につけよう
サーブレットは、ブラウザからリクエストを受け取ったあと、Javaの処理を実行します。しかし、Javaの処理を実行しただけでは、ブラウザの画面には何も表示されません。
ブラウザに結果を表示するには、サーブレットからHTMLをレスポンスとして出力する必要があります。
前の記事で作成したWelcomeServlet.javaには、doGetメソッドの基本形が用意されていました。ここからは、そのdoGetメソッドの中にHTMLを出力する処理を追加していきます。
サーブレットでHTMLを出力するときの基本は、次の2つです。
| 処理 | 内容 |
|---|---|
| 処理① | レスポンスとして返すデータの種類と文字コードを指定する |
| 処理② | PrintWriterを使ってHTMLを出力する |
この2つの処理を正しい順番で書くことで、サーブレットからブラウザへHTMLを返せるようになります。
doGetメソッドの中にHTML出力を書く
doGetメソッドは、ブラウザからGETリクエストが届いたときに実行されるメソッドです。
サーブレットでは、このdoGetメソッドの中に、リクエストに応じて実行したい処理を書きます。どのような処理を書くかはWebアプリケーションの内容によって変わりますが、ブラウザに画面を表示する場合は、HTMLを出力する処理が必要になります。
HTMLの出力には、HttpServletResponseインスタンスであるresponseを使います。responseは、ブラウザへ返すレスポンスを作るための重要なオブジェクトです。
HTML出力の例
ファイル名: WelcomeServlet.java
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html; charset=UTF-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>サーブレットの確認</title>");
out.println("</head>");
out.println("<body>");
out.println("<h1>サーブレットからHTMLを出力しました</h1>");
out.println("</body>");
out.println("</html>");
}この例では、doGetメソッドの中でHTMLを出力しています。
最初にresponse.setContentTypeを使って、ブラウザへ返すデータがUTF-8のHTMLであることを指定しています。次に、response.getWriterでPrintWriterを取得し、out.printlnを使ってHTMLを1行ずつ出力しています。
プログラム内の処理の対応
| 記述 | 処理 |
|---|---|
| response.setContentType("text/html; charset=UTF-8"); | 処理① Content-Typeヘッダの設定 |
| PrintWriter out = response.getWriter(); | 処理② HTMLを出力するための準備 |
| out.println(""); から out.println(""); | 処理② HTML本文の出力 |
サーブレットでHTMLを出力するときは、まずレスポンスの種類を設定し、そのあとにHTMLを書き込む流れになります。
図1:doGetメソッドでHTMLを出力する基本手順

この図から分かること
サーブレットでHTMLを出力するときは、doGetメソッドの中に処理を記述します。
最初に、返す内容がHTMLであることと、文字コードがUTF-8であることをresponseに設定します。そのあと、PrintWriterを取得して、out.printlnでHTMLを出力します。
ブラウザに表示される内容は、サーブレットが直接画面を操作して作っているわけではありません。サーブレットがHTMLをレスポンスとして出力し、ブラウザがそのHTMLを読み取って画面に表示しています。
処理① Content-Typeヘッダを設定する
HTMLを出力する前に、レスポンスとして返すデータの種類をブラウザへ知らせます。
そのために使用するのが、HttpServletResponseのsetContentTypeメソッドです。
HTMLを返す場合は、次のように指定します。
text/html; charset=UTF-8
この指定には、2つの意味があります。
| 指定内容 | 意味 |
|---|---|
| text/html | レスポンス本文がHTMLであることを示す |
| charset=UTF-8 | HTMLをUTF-8の文字コードで送ることを示す |
ブラウザは、レスポンスを受け取るとContent-Typeヘッダを確認します。そこにtext/htmlが指定されていれば、本文をHTMLとして解釈します。
また、charset=UTF-8が指定されていれば、本文をUTF-8として読み取ります。日本語を正しく表示するためにも、文字コードの指定は大切です。
Content-Typeヘッダの役割
HTTPレスポンスには、ブラウザへ返すHTMLそのものだけでなく、そのHTMLをどのように扱うべきかを伝える情報も含まれます。
Content-Typeヘッダは、その代表的な情報です。
| レスポンス内の部分 | 内容 |
|---|---|
| ヘッダ | データの種類や文字コードなど、本文を扱うための情報 |
| 本文 | 実際にブラウザへ渡されるHTML |
たとえば、サーブレットがHTMLを返しているにもかかわらず、ブラウザへHTMLであることを伝えなければ、ブラウザが正しく処理できないことがあります。
そのため、HTMLを出力する場合は、response.setContentTypeを使って、HTMLを返すことを明確に指定します。
HTMLを出力するときの基本形
| 処理 | 基本形 |
|---|---|
| HTMLと文字コードの指定 | response.setContentType("text/html; charset=文字コード"); |
UTF-8のHTMLを返す場合は、文字コードの部分にUTF-8を指定します。
サーブレットから日本語を含むHTMLを返す場合は、UTF-8を指定しておくと扱いやすくなります。
処理② PrintWriterでHTMLを出力する
Content-Typeヘッダを設定したら、次にHTMLを出力します。
HTMLの出力には、HttpServletResponseのgetWriterメソッドで取得できるPrintWriterインスタンスを使います。
PrintWriterは、文字列を出力するためのクラスです。サーブレットでは、response.getWriterで取得したPrintWriterに文字を書き込むことで、その内容がブラウザへ返すレスポンス本文になります。
| 記述 | 内容 |
|---|---|
| PrintWriter out = response.getWriter(); | レスポンスへ文字を出力するためのPrintWriterを取得する |
| out.println("..."); | レスポンス本文へ文字列を出力する |
out.printlnは、System.out.printlnに似た感覚で使えます。
ただし、出力先が異なります。
| メソッド | 主な出力先 |
|---|---|
| System.out.println | Eclipseのコンソールなど |
| out.println | ブラウザへ返すレスポンス本文 |
ブラウザに表示したいHTMLは、System.out.printlnではなく、response.getWriterで取得したPrintWriterのprintlnで出力します。
PrintWriterを使うにはimportが必要
PrintWriterはjava.ioパッケージにあるクラスです。
そのため、サーブレットクラスでPrintWriterを使うには、java.io.PrintWriterをインポートする必要があります。
| 必要なクラス | 役割 |
|---|---|
| java.io.PrintWriter | レスポンス本文へHTMLを出力するために使用する |
EclipseでPrintWriterに赤い波線が表示された場合は、import文が不足している可能性があります。
Eclipseの修正機能を使うと、java.io.PrintWriterのimport文を追加できます。自分で追加する場合は、ほかのimport文と同じ場所に記述します。
図2:Content-TypeヘッダとHTML本文の関係

この図から分かること
HTTPレスポンスは、ヘッダと本文に分けて考えると理解しやすくなります。
response.setContentTypeで設定した内容は、レスポンスのヘッダとしてブラウザへ伝わります。ここでは、本文がHTMLであり、文字コードがUTF-8であることを知らせています。
一方、out.printlnで出力した内容は、レスポンスの本文として送られます。本文にはhtmlタグやbodyタグなど、実際にブラウザが表示に使うHTMLが入ります。
ブラウザはまずヘッダを見て、本文をどのように読み取るか判断します。そのため、HTMLを出力する前にContent-Typeヘッダを設定しておくことが重要です。
HTML出力はContent-Type設定のあとに行う
HTMLの出力は、Content-Typeヘッダを設定したあとに行います。
順番としては、次の流れを守ります。
| 順番 | 処理 |
|---|---|
| 1 | response.setContentTypeでContent-Typeヘッダを設定する |
| 2 | response.getWriterでPrintWriterを取得する |
| 3 | out.printlnでHTMLを出力する |
この順番を守る理由は、文字コードの設定が出力処理に関係するためです。
HTMLは、setContentTypeで指定した文字コードに基づいて出力されます。UTF-8を指定していれば、サーブレットから返すHTMLはUTF-8として扱われます。
そのため、PrintWriterを取得する前に、どの文字コードでレスポンスを返すのかを指定しておくことが大切です。
サーブレットクラスファイルの文字コードとの違い
HTMLを出力するときの文字コードは、response.setContentTypeで指定した文字コードに従います。
ここで注意したいのは、サーブレットクラスファイル自体の文字コードと、ブラウザへ返すHTMLの文字コードは別の考え方だという点です。
| 対象 | 文字コードの考え方 |
|---|---|
| サーブレットクラスファイル | Eclipse上でJavaソースを保存するための文字コード |
| HTMLレスポンス | ブラウザへ返すHTMLをどの文字コードで送るか |
Javaソースファイル自体が正しく保存されていても、レスポンスの文字コード指定が適切でなければ、ブラウザで日本語が正しく表示されない可能性があります。
そのため、サーブレットからHTMLを返すときは、response.setContentTypeで文字コードを明示しておきます。
out.printlnで出力されるHTML
out.printlnでは、HTMLタグを含む文字列を出力します。
Javaのプログラム上では、htmlタグやbodyタグは文字列として扱われます。しかし、その文字列がブラウザへ届くと、ブラウザはHTMLとして解釈します。
| サーブレット側 | ブラウザ側 |
|---|---|
| out.printlnでHTMLタグを文字列として出力する | 受け取ったHTMLタグを解釈して画面に表示する |
| h1タグを文字列として出力する | 見出しとして表示する |
| titleタグを文字列として出力する | ブラウザのタブ名として扱う |
サーブレットは、HTMLの見た目を直接描画しているのではありません。
サーブレットが行っているのは、HTMLをレスポンス本文として書き込むことです。そのHTMLをどのように画面へ表示するかは、ブラウザが担当します。
サーブレットでHTMLを出力するときの基本形
サーブレットクラスでHTMLを出力するときは、次の形を基本として覚えておくとよいでしょう。
| 処理 | 記述の形 |
|---|---|
| レスポンスの種類と文字コードを指定する | response.setContentType("text/html; charset=文字コード"); |
| PrintWriterを取得する | PrintWriter out = response.getWriter(); |
| HTMLを出力する | out.println("..."); |
responseは、doGetメソッドの引数として渡されるHttpServletResponseインスタンスです。
PrintWriterは、responseから取得します。PrintWriterを使うためには、java.io.PrintWriterのimportが必要です。
この3つの記述は、サーブレットからHTMLを直接出力するときによく使う基本形です。最初のうちは、お約束の形として覚えておくとスムーズです。
図3:サーブレット側の処理とブラウザ表示の対応

この図から分かること
サーブレット側では、response.setContentTypeでレスポンスの種類を指定し、response.getWriterでPrintWriterを取得し、out.printlnでHTMLを出力します。
Tomcatは、その内容をHTTPレスポンスとしてブラウザへ返します。レスポンスには、Content-TypeヘッダとHTML本文が含まれます。
ブラウザはContent-Typeヘッダを見て、送られてきた本文がUTF-8のHTMLであることを判断します。そして、HTML本文を解析して画面に表示します。
サーブレットでHTMLを出力する処理は、Javaの命令だけを見ると文字列を出力しているように見えます。しかし、HTTPレスポンスとしてブラウザへ届くことで、Webページとして表示されるようになります。
HTML出力の基本を確認する
サーブレットでHTMLを出力するときは、次の点を確認しながら書くと分かりやすくなります。
| 確認項目 | 内容 |
|---|---|
| responseを使っているか | レスポンスを作るためにHttpServletResponseインスタンスを使う |
| Content-Typeを設定しているか | HTMLと文字コードをブラウザへ知らせる |
| PrintWriterを取得しているか | レスポンス本文へ文字を出力する準備をする |
| out.printlnを使っているか | HTMLをレスポンス本文へ出力する |
| PrintWriterをimportしているか | java.io.PrintWriterが必要になる |
サーブレットからHTMLを出力する処理は、毎回細かく形が変わるものではありません。
response.setContentTypeでContent-Typeヘッダを設定し、response.getWriterでPrintWriterを取得し、out.printlnでHTMLを出力する。この流れを基本形として覚えておくと、このあとのサーブレット開発でも安心して処理を書けるようになります。
