【入門編】Slim3で始める!GAE/JでWebアプリケーション開発 (第2回)

はじめに

前回でModel、Serviceの作成は完了しました。今回はSlim3のHOT reloadingを使いブラウザで確認しながらViewとControllerを作成していきます。便利なSlim3のタグライブラリJSP Functionsの使い方やバリデーションも実装例とともに紹介します。

今回の内容

BBSアプリケーションの開発 (第2回)

リクエストを処理する”Controller”および画面”JSP”の作成

  • Slim3のJSP Functionsの使い方
  • Slim3のバリデーションの実装
  • テストケースの作成、実施

前提

以下の内容が完了していること

  • 入門編(第1回) が終わっていること
    (Java Servletを知っていればよりスムーズです)

Controllerの作成

ControllerはServletを便利にしたクラスです。Controllerを使うことで、バリデーションやエラーメッセージが簡単に実装でき、リクエストパラメータの型変換なども簡単になります。また、Controllerはリクエストのパス(URL)に従って対応するControllerが決定されるため、Servletのようにサーブレットマッピングを定義する必要がありません。

早速Controllerの作成に入りますが、その前にSimpleBBSに必要なControllerおよび画面(JSP)を整理しておきます。下の図は、第1回の画面構成図にControllerのパス(「/index」「/read」など)を追記したものです。

blankpj_refactor_click

これらのController、JSPを作成してSimpleBBSを完成させます。

作成手順

Controller作成も、例によってAntタスクを使ってControllerとTestCaseを作成するのが早くて簡単です。また、Controllerの場合は一緒にJSPも生成する/しないによって2種類のgenタスクを使い分けます。

Antタスク名 概要
gen-controller ControllerとTestCase、およびJSPの雛形を生成する
gen-controller-without-view ControllerとTestCaseの雛形を生成する(JSPは生成しない)

JSPを生成しない gen-controller-without-view は、リクエスト処理後にリダイレクトしたり、レスポンスに直接出力するようなControllerの場合に使います。

ControllerとJSP作成の大まかな流れは以下の通りです。

  1. Antタスク gen-controller にてControllerとTestCase、JSPの雛形を作成
  2. JSPの実装
  3. テストケースの作成
  4. 必要な処理の実装
  5. テストケースの実行
    (完成するまで2~5を繰り返す)

今回は gen-controller で自動生成されるソースから見ていきましょう。

  • Antタスク gen-controller の実行gen-controller を実行し、プロンプトに /bbs/ と記述しOKボタンを押下します。gen-controllerイメージすると、 /bbs/ に対応する simplebbs.controller.bbs.IndexController とテストクラス、および war/bbs/index.jsp が作成されます。gen-controller実行後後イメージ
  • 自動生成されたControllerとTestCaseについて作成された IndexController から見てみます。

    IndexController.java

    package simplebbs.controller.bbs;
    
    import org.slim3.controller.Controller;
    import org.slim3.controller.Navigation;
    
    public class IndexController extends Controller {
    
        @Override
        public Navigation run() throws Exception {
            return forward("index.jsp");
        }
    }
    

    これがControllerのもっとも単純な実装です。 /bbs/ にアクセスすると、この IndexController#run() が実行されます。run() の戻り値には遷移先のパスを指定します。パスは / で始まるコンテキストルートからみたパス(絶対パス)、 / で始まらないパス(相対パス)どちらでも指定できます。

    ちなみに、run() メソッドにはServletのようにRequestやResponseが引数にありませんが、これらはControllerのフィールドに配置されており、いつでもアクセスできるようになっています。

    Controller.java

    public abstract class Controller {
    
        protected ServletContext servletContext;
        protected HttpServletRequest request;
        protected HttpServletResponse response;
        protected String basePath;
        protected Errors errors;
         ...
    }

    次にIndexControllerのテストクラスを見てみます。

    IndexControllerTest.java

    package simplebbs.controller.bbs;
    
    import org.slim3.tester.ControllerTestCase;
    import org.junit.Test;
    import static org.junit.Assert.*;
    import static org.hamcrest.CoreMatchers.*;
    
    public class IndexControllerTest extends ControllerTestCase {
    
        @Test
        public void run() throws Exception {
            tester.start("/bbs/");
            IndexController controller = tester.getController();
            assertThat(controller, is(notNullValue()));
            assertThat(tester.isRedirect(), is(false));
            assertThat(tester.getDestinationPath(), is("/bbs/index.jsp"));
        }
    }
    

    Controllerのテストケースでは、実際にパスを指定してControllerを実行し、その結果について検査できるようになっています。

    tester.start(“/bbs/”) はブラウザで /bbs/ にアクセスしたのと同じ意味です。つまり先の IndexController#run() がこの時点で実行されます。これ以降はJunitの検査のためのコードです。

    tester.getController() は /bbs/ のリクエストを実行したContrllerのインスタンスを返します。もし、tester.start() で存在しないパスを指定していた場合 null を返します。tester.isRedirect() は Controller#run() の遷移先に redirect しているかを判定します。 forward している場合は false を返します。tester.getDestinationPath() は遷移先を”絶対パス”で返します。

    試しにこのままテストを実行してみましょう。IndexControllerTestのエディタ上で 右クリック > Run As > JUnit Test を実行します。結果はグリーンになるはずです。


    IndexControllerTestの実行イメージ

  • ControllerとJSPの動作確認続けて war/bbs/index.jsp を見てみます。

    index.jsp

    <%@page pageEncoding="UTF-8" isELIgnored="false" session="false"%>
    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <%@taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
    <%@taglib prefix="f" uri="http://www.slim3.org/functions"%>
    
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>bbs Index</title>
    </head>
    <body>
    <p>Hello bbs Index !!!</p>
    </body>
    </html>
          

    gen-controller の実行後、まだ何もソースに手を加えていませんが、この時点でブラウザから動作確認することが可能なので試して見ましょう。まずは、ローカルマシン上の開発サーバーを起動します。開発サーバーは Google Plugins for Eclipseのプラグインに含まれているのですぐに起動できます。

    simplebbs プロジェクトの上で 右クリック > Run As > Web Application をクリックします。


    開発サーバの起動イメージ

    すると、Consoleに”The servier is running at http://localhost:8888/”とログが出力され、開発サーバーが起動します。


    開発サーバの起動コンソールイメージ

    それでは、早速ブラウザからアクセスしてみましょう。ブラウザを起動し http://localhost:8888/bbs/ にアクセスしてみます。

    自動生成されたindex.jspの画面イメージ

    先ほどのJSPが表示されていることが確認できました。それでは、このControllerとViewをSimpleBBS用に作り変えていきます。