4. Servletアプリケーションの作成と実行
環境の準備ができたので、まずは基本的なServletのプログラムを作って動かしてみよう。通常通りプロジェクトマネージャーから「動的Webプロジェクト」を作成し、ランタイムおよび構成にLiberty Profileを選択する。本稿では、郵便番号から住所を取得するアプリケーションを、「PostalCodeServlet」という名称で作成した(図4.1)。
まず、郵便番号を指定して住所を取得するためのクラスとして「com.example.postcode.PostalCode.java」を用意した。郵便番号データは、日本郵便が公開しているCSVデータから郵便番号と住所の部分を抜粋したファイルを用意し、クラスの初期化時にMapに読み込むようにしている。実際に検索を行うのはget()メソッドである。
public class PostalCode { private Map<String, String> postalCodeMap = new HashMap<>(); public PostalCode() { try (BufferedReader reader = new BufferedReader(new InputStreamReader (this.getClass().getResourceAsStream("postalcode.csv"), "UTF-8"))) { String line; StringTokenizer token; while ((line = reader.readLine()) != null) { token = new StringTokenizer(line, ","); String code = token.nextToken(); String address = token.nextToken(); this.postalCodeMap.put(code, address); } } catch(IOException ex) { ex.printStackTrace(); } } public String get(String postalcode) { String address = this.postalCodeMap.get(postalcode); if (address == null) { address = "NoData"; } return address; } }
Servletクラスは次のようにした。init()でPostalCodeの初期化を行い、doGet()ではパラメータとして郵便番号を受け取り、PostalCode.get()メソッドで住所を検索して画面に結果を返す。
@WebServlet("/PostalCodeServlet") public class PostalCodeServlet extends HttpServlet { private static final long serialVersionUID = 1L; private PostalCode postalCode; public PostalCodeServlet() { super(); } public void init() throws ServletException { this.postalCode = new PostalCode(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String postalcode = request.getParameter("postalcode"); String address = this.postalCode.get(postalcode); String result; if (!address.equals("NoData")) { result = "<p style='font-size:large'>〒" + postalcode + " の住所は</p>" + "<p style='font-size:x-large'>" + address + "</p>" + "<p style='font-size:large'>です。</p>"; } else { result = "<p style='font-size:x-large'>〒" + postalcode + " は存在しません。"; } response.setContentType("text/html; charset=UTF-8"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>Sample Servlet</title>"); out.println("</head>"); out.println("<body>"); out.println(result); out.println("</body>"); out.println("</html>"); out.flush(); out.close(); } }
Webページ側は次のようになる。
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Sample Servlet</title> </head> <body> <p style='font-size:large'>郵便番号を入力してください。</p> <form action="PostalCodeServlet"> <input type="text" name="postalcode" size="50"/> <input type="submit" value="送信"/> </form> </body> </html>
アプリケーションが準備できたら、サーバー上で実行してみる。単純なServletであれば特別な設定は必要ない。プロジェクトマネージャーから[実行]-[サーバーで実行]を選び、使用するサーバーとしてLiberty Profileを選択すればよい。
起動に成功すれば、EclipseのWebプレビューでServletの動作を確認できる。
注目すべきはサーバーの起動時間だ。初回でも、ものの数秒で起動およびアプリケーションのデプロイが完了する。また、ホットデプロイの仕組みが組み込まれているため、ソースコードや設定を書き換えた場合でも、サーバーを再起動することなく自動で変更が反映される。反映にかかる時間も、ものの1~2秒といったところだ。
軽量という謡い文句のとおり、極めてスムーズな動作が実現されており、コーディングとプレビューの繰り返しをストレスなく行うことができる。