21.2. org.apache.struts.tiles.actions.TilesAction
Controllerを作成する2つ目の方法について説明します。2つ目の方法は、「org.apache.struts.tiles.actions.TilesAction」を利用する方法です。TilesActionは「org.apache.struts.action.Action」クラスを継承したクラスで、これによってActionクラスを作成する事ができます。開発者はまずTilesActionを継承したActionクラスを実装し、それを他のActionクラスと同じように、特定のURLで呼び出されるようにします。そしてTiles設定ファイルの関連付ける組み合わせで、作成したActionが動作するURLを指定します。Controllerの場合と同じように、Actionクラスが実行された直後、JSPページが表示される前にTilesActionを継承したActionクラスが実行されます。
例として、前節と同じ動作をするActionクラスを作成します。
package sample; import org.apache.struts.tiles.actions.TilesAction; import org.apache.struts.tiles.ComponentContext; import org.apache.struts.tiles.beans.SimpleMenuItem; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionForm; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.List; import java.util.ArrayList; public class MenuTilesAction extends TilesAction{ public ActionForward execute(ComponentContext context, ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception{ // リストの作成 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); return(null); } }
TilesActionで定義されているメソッドは幾つかありますが、ここで実装しなければならないものは、ComponentContextを引数にとるexecuteメソッドです。以下に定義を示します。
public ActionForward execute(ComponentContext context, ActionMapping, mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception
引数の種類が変わっていますが、Controllerのperformと同じように使用できると考えて下さい。またActionForwardを返さなければなりませんが、nullを返すようにして下さい。nullを返さなかったとしてもその値は無視されます。サンプルのプログラムは、最後にnullを返していることを除けば、前節のControllerのサンプルと全く同じです。
最後にTiles設定ファイルでの、設定方法について説明します。TilesActionを関連付けるためには、関連付ける組み合わせに「controllerUrl」属性を定義します。先ほど作成したTilesActionが「/tilesAction.do」というURLにマッピングされているとすると、以下のようになります。
<definition name="tilesAction" path="/WEB-INF/jsp/layout.jsp" controllerUrl="/tilesAction.do"> ... </definition>
(実習課題2)
実習課題1と同じ挙動をするWebアプリケーションを、TilesActionを用いて作成しなさい。