目次へ

21. 表示するTileの動的な変更

21.1. org.apache.struts.tiles.Controller

前章の最後で、可変個のTileを並べて表示する方法について説明しました。しかし動的に表示するTileを制御できなければ、この方法はあまり意味がありません。この章では、表示するTileを制御する方法について説明します。これによって、ユーザ毎に表示するTileを切り替えることも可能となります。

表示するTileを制御する方法には、Controllerクラスを設定する方法が最も簡単です。Controllerクラスの作成方法には2通りあるのですが、1つ目は「org.apache.struts.tiles.Controller」インタフェースを実装する方法です。ControllerクラスはJSPページでの表示が行われる前に呼び出されるものです。Struts全体での処理の流れから説明しますと、ControllerクラスはActionクラスの実行後、forward先であるJSPページの表示前に呼び出されます。

Controllerクラス

以下はControllerクラスの実装例です。

package sample;

import org.apache.struts.tiles.Controller;
import org.apache.struts.tiles.ComponentContext;
import org.apache.struts.tiles.beans.SimpleMenuItem;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletContext;
import java.util.List;
import java.util.ArrayList;

public class MenuController implements Controller{
  public void perform(ComponentContext context, HttpServletRequest request,
                      HttpServletResponse response, ServletContext servletContext){
    // リストの作成
    List menuList=new ArrayList();
    SimpleMenuItem menu=new SimpleMenuItem();
    menu.setLink("/WEB-INF/jsp/calendar.jsp");
    menu.setValue("カレンダー");
    menuList.add(menu);
    menu=new SimpleMenuItem();
    menu.setLink("/WEB-INF/jsp/clock.jsp");
    menu.setValue("世界時計");
    menuList.add(menu);

    // リストの登録
    context.putAttribute("menuList", menuList);
  }
}

Controllerで定義されているメソッドは、「perform」だけです。performの定義は以下の通りで、「HttpServletRequest」「HttpServletResponse」「ServletContext」の3つは、直前に実行されたActionやこの後に実行されるJSPページで使用するものと同じものです。

public void perform(ComponentContext context, HttpServletRequest request,
                    HttpServletResponse response, ServletContext servletContext)

1つ目の引数は「org.apache.struts.tiles.ComponentContext」ですが、これは関連付けられたTilesの組み合わせ内で作成された、リストや文字列を管理するオブジェクトです。ComponentContextを用いる事によって、Tiles設定ファイルで定義された文字列やリストを置き換えたり、新たに追加することができます。サンプルではSimpleMenuItemを要素として持つリストを作成し、ComponentContextに登録しています。これはTiles設定ファイルに

<putList name="menuList">
  <item link="/WEB-INF/jsp/calendar.jsp" value="カレンダー" />
  <item link="/WEB-INF/jsp/clock.jsp" value="世界時計" />
</putList>

と定義することと同じです。

Controllerを動作させるためには、関連付けるTilesの組み合わせに、「controllerClass」属性を設定します。以下はその例です。

<definition name="controller" path="/WEB-INF/jsp/layout.jsp"
            controllerClass="sample.MenuController">
  ...
</definition>

controllerClass属性には、Controllerクラスを完全限定名で指定します。これによって該当する組み合わせが表示される直前に、Controllerクラスが実行されるようになります。

(実習課題1)

前章の実習課題3を改良しなさい。

  • Controllerクラスを作成し、Controllerクラスでメニューおよびタイトルのリストを設定するようにすること。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp