Webアプリ開発エンジニアのための技術情報サイト「テックスコア」

2.Front Controller パターン

2.1 Front Controller パターンとは

Front Controller パターンとはどういうものか、目的、概要、構造とわけて説明していきます。

目的

クライアントがWebアプリケーションを利用するとき、もしクライアントが直接ビューにアクセスすることになると、 各ビューごとにリクエストを制御しなくてはなりません。そうすると、リクエストの制御が各ビューに分散してしまい、 リクエストを制御するためのソースコードも、各ビューに重複して記述することになってしまいます。

  • 認証の確認
  • リクエストパスの制約
  • エンコーディングの確認
  • クライアント(ブラウザ)情報の確認

これらの共通する処理をそれぞれのリソースでコーディングすると、同じコードを何度も記述しなければならず、 無駄な作業が必要となります。また、共通部分がコピーアンドペーストで作成されたりすると、 共通する処理内容や処理方法などに修正・変更が必要となった場合、 その処理を行っているリソースすべてを変更しなければならず、 保守性の低いアプリケーションになってしまいます。 この問題を解決するために考えられたのが、Front Controller パターンです。

概要

Webリクエストを集中して管理する「フロントコントローラ」を使用し、 認証や権限付与、ビューの選択、エラー処理などを行います。

構造

Front Controller パターンの構造は、大まかには以下のようになります。

  1. Contoroller
    > 全ての Web リクエストを処理する最初の入り口です。
  2. Dispatcher
    ビューの管理とナビゲーションを担い、Contoroller と協調もしくは、Controller に内包させます。

Helper と View については、特に重要ではありません。Front Controller パターンの肝になるのは、 Controller と Dispatcher をあわせた「フロントコントローラ」の部分です。

2.2 メリット

Front Controller パターンには次のようなメリットがあります。

  1. 共通の処理を一元管理できる
    上述の通り、Web リクエストに対して、認証や権限付与といった処理を一元管理することが可能となります。
  2. 保守性の向上
    共通の処理を一元管理するということで、共通ロジックの変更が容易になります。

2.3 実装例

Struts における、org.apache.struts.action.ActionServlet(以下 ActionServlet) , org.apache.struts.action.RequestProcessor(以下 RequestProcessor) は、Front Controller の「フロントコントローラ」を担うものです。
全ての Web リクエストは ActionServlet に渡されます。ActionServlet では、servletContext に登録された RequestProcessor を
取得し、処理の大部分を、この RequestProcessor に任せます。実際には、RequestProcessor の process メソッドを呼んでいます。 RequestProcessor の process メソッドでは、ActionForm の処理、Action の選択などを行った後、processActionPerform メソッドを呼び出します。 ユーザは、RequestProcessor を継承し、processActionPerform メソッドをオーバーライドすることで、 Action の execute メソッドの前後に共通の処理を埋め込むことができるようになります。

Action は、MVC モデルでは、コントローラに分類されますが「フロントコントローラ」ではありません。 Action は、全ての Web リクエストに対して処理を行うものではないからです。

RequestProcessor の processActionPerform メソッドのソースは、以下のようになっています。

 processActionPerform(HttpServletRequest request,
                             HttpServletResponse response,
                             Action action,
                             ActionForm form,
                             ActionMapping mapping)
        throws IOException, ServletException {

        try {
            return (action.execute(mapping, form, request, response));
        } catch (Exception e) {
            return (processException(request, response,
                                     e, form, mapping));
        }
 }
    

このメソッドをオーバーライドすることで、全てのリクエストに対して共通の処理を行うことができるようになります。

  processActionPerform(HttpServletRequest request,
                             HttpServletResponse response,
                             Action action,
                             ActionForm form,
                             ActionMapping mapping)
        throws IOException, ServletException {

        try {
        	// 認証処理
            ActionForward forward = action.execute(mapping, form, request, response));
            // 権限の付与
            return forward;
        } catch (Exception e) {
            return (processException(request, response,
                                     e, form, mapping));
        }
 }   
    

2.4 まとめ

全ての Web リクエストに対して「共通の処理」を一元化した場合に利用します。 Front Controller パターンでは、全ての Web リクエストが通過するコントローラを用意することで、 このような一元管理を可能にしています。



前のページへ TECHSCOREのTOPページへ  
techscore(トップページへ)
TECHSCORE書店
TECHSCOREトップページJavaSQLXMLリッチクライアントモデリングセマンティックWebその他技術Tuigwaa