The HIRO Says

If you smell what The HIRO is cooking!!!

【slim3】画面遷移のための”Controller”−(2)実装方法

前回slim3 の画面遷移制御用コンポーネントである
”Controller”の生成方法をまとめました。
今回は、この Controller の実装方法をざっと見てみます。


1.Controllerの基本的な構成

Controller の基本的な要件は、以下の3点です。
(1)org.slim3.controller.Controller を継承(extend)する。
(2)org.slim3.controller.Navigation を戻り値として返す
   run() メソッドをオーバーライドする。
(3)run() メソッド内で、遷移先のパスを返す。


ちなみにこれらは、Ant で自動的に生成されます。


2.パラメータの取得方法

画面などからの入力値を取得するには、
次の2つの方法があります。

(1)HttpServletRequest 等から取得する方法

通常の Servlet と同様、HttpServletRequest 等の getAttribute() メソッドなどを呼び出すことで、入力値を取得することができます。
HttpServletRequest 等へのアクセス方法は、
「3.HttpServletRequest等へのアクセス方法」をご参照下さい。

(2)Controller の専用メソッドを利用する方法

Controller クラスには、asString()asInteger() など、HttpServletRequest に格納された値を取得するためのメソッドが型毎に用意されています。
これらを呼び出すことで、入力値を取得することができます。


ちなみに次の2つは、同じ意味になります。

  1. (String) request.getAttribute("abc")
  2. asString("abc")
(3)【参考】ActionFormについて

slim3 には今のところ、Struts の ActionForm のような、画面入力値専用の JavaBeans クラスは用意されていません。
※そもそも作る予定があるのかは不明です…
 ひがさんのみぞ知る?それとも自力で作る?
 一応 Struts・S2・SAStruts のソースは知っているので、
 自力で作ろうと思えば作れると思いますが…
 今のところやる気出ず…(´・ω・)


3.HttpServletRequest等へのアクセス方法

HttpServletRequest・HttpServletResponse・ServletContext には、それぞれ専用のアクセス用クラスが slim3 で用意されています。

(1)HttpServletRequest

org.slim3.util.RequestLocator クラスの get() メソッドを呼び出します。

(2)HttpServletResponse

org.slim3.util.ResponseLocator クラスの get() メソッドを呼び出します。

(3)ServletContext

org.slim3.util.ServletContextLocator クラスの get() メソッドを呼び出します。

(4)【参考】HttpSession

HttpServletRequest の getSession() メソッドで取得します。


4.入力値の検証方法(validation)

入力値の検証は、org.slim3.controller.validator.Validators クラスで行います。
入力値の検証手順は、次の通りです。


(1)Validators のインスタンスを生成する。
引数には、HttpServletRequest、または検証対象が格納された Map を渡します。


(2)add() メソッドで、入力値とそれに対する検証方法を追加する。

  1. 引数の1つめに、検証対象の入力値のキーを指定します。
  2. 引数の2つめ以降に、検証方法を追加します。(可変長引数)


具体的には、以下の例をご確認下さい。

    Validators v = new Validators(RequestLocator.get());
    // 必須チェック・100 文字以内のチェックを実施
    v.add("name", v.required(), v.maxlength(100));

5.初期画面用のController

アプリケーションの初期画面表示を Controller で制御したい場合は、ルートパッケージ/controller ディレクトリに、IndexController クラスを用意します。


6.【参考】Controllerの実装例

package xxx.yyy.controller.order;

import org.slim3.controller.Controller;
import org.slim3.controller.Navigation;

public class OrderController extends Controller {

    @Override
    public Navigation run() {

        // 入力値検証(validation)
        Validators v =
                new Validators(RequestLocator.get());
        v.add("name", v.required(), v.maxlength(100));

        if (!v.validate()) {
            // 入力値検証失敗時
            // この呼び方だと、/war/order.jsp へ遷移する。
            return forward("order.jsp");
        }

        // 入力値検証成功時

        // 必要に応じて Service を呼び出し、
        // ビジネスロジックを実施する。
        new OrderService()
                .order(new Order(asString("name")));

        /*
         * この呼び方だと、
         * /war/WEB-INF/view/order/orderComplete.jsp
         * へ遷移する。
         */
        return forward(
                "/WEB-INF/view/order/orderComplete.jsp");
    }
}

次の予定

次は、Controller の UT について考えたいと思います。