こんにちは。「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
テスト
日本語の部分が文字化けせずに出力されました。