Servlet と JSP による Web アプリケーション(その 4)

さて、間に小ネタを挟んでしまいましたがそろそろ本題を進めましょう。

Controller を作ろう(その 1)

package jp.mydns.akanekodou;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import java.util.List;

import jp.mydns.akanekodou.model.Customer;
import jp.mydns.akanekodou.dao.CustomerDAO;

public class InitServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public void doGet(
        HttpServletRequest request,
        HttpServletResponse response
    ) throws ServletException, IOException {
        List<Customer> list = new CustomerDAO().all();

        request.setAttribute("list", list);

        getServletContext()
            .getRequestDispatcher("/init.jsp")
            .forward(request, response);
    }
}

HttpServlet クラスには init という初期化メソッドがあり、Servlet へのリクエストがあったときに最初の 1 回だけ呼び出されます。今回は特に何もしないので省略しています。

doGet は Servlet に対して GET メソッドでアクセスされた時に呼び出されます。今回は一覧表を作るだけなので基本は GET メソッドでのアクセスになるのでここに処理を書きます。フォームを用意してデータを送信するときは一般的に POST メソッドを使用するので、別途定義されている doPost というメソッドに内容を記述することになりますが、今回は POST メソッドでアクセスされることがないのでやはり省略しています。

今回の処理としては、前に作った CustomerDAO クラスのインスタンスから all() メソッドを呼び出して CustomerList クラスのインスタンスに格納します。その後、custlist という属性名でその内容を request にセットします。この属性名は View を作ったときに jsp:useBean で指定した id と一致させておく必要があります。そのことによって JSP で request.getAttribute を使わずに自動で内容を取得することができます(しかも request.getAttribute の返り値は Object 型なのでキャストしないといけないから面倒)。

request に値がセットされたところで init.jsp に forward して、Controller の役目は終了、ということになります。

Controller を作ろう(その 2)

最後に、今作成した Servlet を web.xml に登録します。

<?xml version="1.0" encoding="utf-8"?>
<web-app
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns="http://java.sun.com/xml/ns/javaee"
  xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
  xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
    http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
  id="WebApp_ID" version="3.0">

  <display-name>Customers</display-name>

  <servlet>
    <servlet-name>InitServlet</servlet-name>
    <servlet-class>jp.mydns.akanekodou.InitServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>InitServlet</servlet-name>
    <url-pattern>/index.html</url-pattern>
  </servlet-mapping>

  <filter>
    <filter-name>EncodingFilter</filter-name>
    <filter-class>jp.mydns.akanekodou.filter.EncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>utf-8</param-value>
    </init-param>
    <init-param>
      <param-name>language</param-name>
      <param-value>ja</param-value>
    </init-param>
  </filter>

  <filter-mapping>
    <filter-name>EncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
</web-app>

プロジェクトを作成するときに "Generate web.xml deployment descriptor" にチェックを入れておくと、あらかじめ web.xml のひな型が作成されますので、それに必要な記述を追加していけばいいでしょう。servlet 要素でサーブレット名と対応する Servlet のクラスを紐づけます。servlet-mapping 要素でサーブレット名とそれにアクセスするための URL を紐づけます。今回は /index.html という URL にアクセスしたら Servlet が呼び出されるようにしてあります。filter と filter-mapping については以前にもご紹介した encoding と location の設定を EncodingFilter クラスにやってもらうためのものです。パッケージ名が変わっていますが内容は前に紹介したものと同じですので省略します。私は jar ファイルにエクスポートして Tomcat の lib フォルダに入れました。プロジェクトの WebContent/WEB-INF/lib フォルダに入れてもいいですし、jar にしないでプロジェクト内にパッケージを作ってそこにクラスを書いてもいいでしょう。ただし何かと便利なので、jar ファイルにして Tomcat の lib フォルダに入れてしまうのがお勧めです。

最後の welcome-file-list は、http://localhost:8080/Customers/ にアクセスしたときに自動で呼び出されるファイルを指定します。今回は index.html にしました。これによって http://localhost:8080/Customers/ にアクセスすると http://localhost:8080/Customers/index.html にアクセスしたことになり、servlet-mapping によって InitServlet が呼び出されることになります。

起動してみよう

以上でプロジェクトは完成です。WebContent/WEB-INF/lib フォルダ、もしくは Tomcat の lib フォルダに mysql-connector-java-5.1.20-bin.jar を入れます(後者がお勧め)。そして eclipse 内に作った Tomcat サーバに Customers プロジェクトを追加して Tomcat サーバを起動し、http://localhost:8080/Customers/ にアクセスしてみてください。

このような画面が出力されれば、問題なく Web アプリケーションは動作しています。