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クラスの実装例です。
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クラスでメニューおよびタイトルのリストを設定するようにすること。