java-beginner.com ブログ

プログラミングを学習するブログ(Javaをメインに)

サーブレットで日本語を出力する

投稿日:

最終更新日:2016年09月21日

アイキャッチ

こんにちは。「Javaを復習する初心者」です。

サーブレットで日本語出力をしてみました。

Javaにはサーブレットというアプリケーションサーバで動くプログラムを書くことができます。今回はサーブレットで日本語出力をしてみました。

Eclipse all in oneの全部入りを使っているため、簡単にサーブレットを試すことができます。プロジェクトを新規作成するときに「動的Webプロジェクト」を選べば必要な設定がされたプロジェクトが作られます。また、サーブレットを動かすためのサーバとしてtomcatが同梱されているため、サーバの追加も簡単にできます。

サーブレットを作る

ファイルの新規作成でサーブレットを選択することができます。クラス名をHelloにすると次のような内容のjavaファイルが作られます。

Hello.java

package test;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class Hello
 */
@WebServlet("/Hello")
public class Hello extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Hello() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}

HttpServletを継承したクラスを作ることでサーブレットを作成することができます。

アノテーションの記述「@WebServlet(“/Hello”)」はサーブレットを呼び出すためのURLを指定するための記述です。このように記述することにより、「http://localhost:8080/[プロジェクト名]/Hello」というURLでサーブレットを呼び出すことができます。このURLをブラウザのアドレス欄に入力するとdoGetメソッドが呼び出されます。このメソッドはHttpServletで定義されていて、オーバライドするのが一般的のようです。

文字を出力

最初にHelloWrite.javaを作って、文字を出力させてみました。response.getWriterメソッドで取得できるオブジェクトに対して、printlnメソッドを呼び出すことで文字列の出力ができます。

HelloWrite.javaのdoGetメソッドの処理

        PrintWriter writer = response.getWriter();

        writer.println("CharacterEncoding: " + response.getContentType() + "<br>");
        writer.println("test<br>");
        writer.println("テスト<br>");

結果

CharacterEncoding: null
test
???

日本語の部分が文字化けしました。これは文字の出力のコンテキスト・タイプが適切に設定されていないからです。初期状態ではnullのようです。

UTF-8

以下ではコンテキスト・タイプを「text/html; charset=UTF-8」に設定してみました。

doGetメソッドの処理

        response.setContentType("text/html; charset=UTF-8");
        PrintWriter writer = response.getWriter();

        writer.println("CharacterEncoding: " + response.getContentType() + "<br>");
        writer.println("test<br>");
        writer.println("テスト<br>");

結果

CharacterEncoding: text/html;charset=UTF-8
test
テスト

日本語の部分が文字化けせずに出力されました。