この記事ではWebアプリケーションの出力結果に影響する「コンテンツタイプ」の設定について説明する。
目次
コンテンツタイプの設定の仕方
コンテンツタイプの設定とは、クライアントサーバー間のコンテンツの種類を設定することである。コンテンツの種類には次のようなものがある。実際に設定する時は、MIMEタイプを使用して設定を行う。
コンテンツの種類 |
MIMEタイプ |
HTML文章 |
text/html |
JPEG画像 |
image/jpeg |
PDF文書 |
application/pdf |
このコンテンツタイプは、HttpServletResponse.オブジェクトのメソッドを呼び出すことにより設定できる。
書き方の基本は簡単だ。
HttpServletResponseオブジェクト.setContentType(java.lang.String type);
実際のコードはこうなる。
response.setContentType("text/html");
また、コンテンツの中で使われる文字コード(Shift_JISやUTF-8など)も、日本語を表示させる場合に設定する。
response.setContentType("text/html; charset=Shift_JIS");
文字コードをsetCharacterEncoding()メソッドで単独で設定するとこともできる。
HttpServletResponseオブジェクト. setCharacterEncoding (java.lang.String type);
注意点として、サーブレットは、レスポンスのgetWriterメソッドを呼び出す前に、また、レスポンスをコミットする前にsetContentTypeメソッドを呼び出さなければならない。そうしないとsetContentTypeメソッドによる設定は無効になってしまう。
setContentTypeのAPI仕様
setContentTypeのAPI仕様をここに示しておこう。
setContentType(java.lang.String type)
戻り値の型 |
void |
内容 |
もしレスポンスがまだコミットされていないならば、クライアントに送るレスポンスのコンテンツタイプを設定する。 与えられたコンテンツタイプは、設定をコード化する文字列、例えば、「text/html; charset=UTF-8」といった文字列を含むかもしれない。getWriterメソッドが呼び出される前にこのメソッドが呼び出された時だけ、レスポンスの文字コードは与えられたコンテンツタイプに設定される。 このメソッドは、コンテンツタイプと文字コードを変えるために繰り返し呼び出されるかもしれない。もしレスポンスがコミットされた後に呼び出されるならば、このメソッドは無効になる。 もし、getWriterメソッドが呼び出された後かもしくはレスポンスがコミットされた後に、呼び出されるならば、それはレスポンスの文字コードを設定しない。 もしプロトコルがそうする方法を提供するなら、コンテナはサーブレットのレスポンスのライターのために使われるコンテンツタイプと文字コードを、クライアントへ知らせなければならない。HTTPの場合は、コンテンツタイプヘッダーが使われる。
引数:type - コンテンツのMIMEタイプを指定する文字列
参照:setLocale(java.util.Locale), setCharacterEncoding(java.lang.String), getOutputStream(), getWriter() |
setContentTypeを使用しないサンプルプログラム
このサンプルプログラムは、setContentTypeを使わずに半角英数字と日本語を表示する。この場合、文字コードが設定されていないので、日本語が正しく表示されない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/NotSetContentType")//[1] public class NotSetContentType extends HttpServlet {//[2] protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//[3] PrintWriter out = response.getWriter();//[4] out.println("<html><head></head><body>");//[5] out.println("<p>abcdefABCDEF</p>");//[6] out.println("<p>あいうえおかきくけこ</p>");//[7] out.println("</body></html>");//[8] } } |
実行結果
ブラウザにURL:http://localhost:8080/Servlet/NotSetContentTypeを入力し、Enterを押す。
表示されるブラウザ画面:
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [1] アノテーションの宣言をする。
- [2] HttpServletを継承して、NotSetContentTypeクラスを定義する。
- [3] doGet()メソッドをオーバーライドして定義する。
- [4] HTMLを出力するためのPrintWriterオブジェクトを取得する。
- [5]-[8] PrintWriterオブジェクトに「abcdefABCDEF」と「あいうえおかきくけこ」を表示するHTMLコードを出力する。
setContentTypeを使用したサンプルプログラム
このサンプルプログラムは、setContentTypeを使ってMIMEタイプと文字コードの設定を行い、半角英数字と日本語を表示する。この設定は、レスポンスのgetWriterメソッドを呼び出す前に行われている。この場合、日本語も正しく表示される。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/SetContentType")//[1] public class SetContentType extends HttpServlet {//[2] protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//[3] response.setContentType("text/html; charset=Shift_JIS");//[4] PrintWriter out = response.getWriter();//[5] out.println("<html><head></head><body>");//[6] out.println("<p>abcdefABCDEF</p>");//[7] out.println("<p>あいうえおかきくけこ</p>");//[8] out.println("</body></html>");//[9] } } |
実行結果
ブラウザにURL:http://localhost:8080/Servlet/SetContentTypeを入力し、Enterを押す。
表示されるブラウザ画面:
サンプルプログラムの説明
それでは簡単にプログラムの解説をしてゆこう。
- [1] アノテーションの宣言をする。
- [2] HttpServletを継承して、SetContentTypeクラスを定義する。
- [3] doGet()メソッドをオーバーライドして定義する。
- [4] Content Typeを設定する。
- [5] HTMLを出力するためのPrintWriterオブジェクトを取得する。
- [6]-[9] PrintWriterオブジェクトに「abcdefABCDEF」と「あいうえおかきくけこ」を表示するHTMLコードを出力する。
まとめ
この記事では実際にsetContentTypeを使用するか、しないかで出力結果が大きく異なることを確認した。サンプルプログラムを実際に動作させて確かめてみよう。