サーブレット&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-8HTMLを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.printlnEclipseのコンソールなど
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ヘッダを設定したあとに行います。

順番としては、次の流れを守ります。

順番処理
1response.setContentTypeでContent-Typeヘッダを設定する
2response.getWriterでPrintWriterを取得する
3out.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を出力する。この流れを基本形として覚えておくと、このあとのサーブレット開発でも安心して処理を書けるようになります。