ランタイムにダイナミックにページを選ぶ

controllerClassを使えば、ランタイムでダイナミックにTileを選ぶことができる。
例えばセッション内にある"user"beanの"type"という値によって違ったJSPページを呼び込む、というシナリオがあるとする。org.apache.struts.tiles.Controllerをインプリメントした"UserTypeController"というクラスを作り、ダイナミックにページを呼び出したいdefinitionでcontrollerClassにそのクラスを指定する。
definitionはこんな感じ。









<definition name="some.page"
extends="layout.MainLayout"
controllerClass="app.UserTypeController">



そしてコントローラ。

import org.apache.struts.tiles.Controller;
import org.apache.struts.tiles.ComponentContext;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import java.io.IOException;
import app.User;

public class UserTypeController implements Controller {
public void perform(ComponentContext tilesContext,
HttpServletRequest request,
HttpServletResponse response,
ServletContext servletContext)
throws ServletException, IOException {
HttpSession session = request.getSession();
User user = (User) session.getAttribute("user");

String userType = user.getType();
String page = "/WEB-INF/tiles/pages/";

//userTypeを確認し、JSPページを選択
if("1".equals(userType)) {
page += "type1.jsp"; [訂正]←ここ、form += ...になってました。間違い。
}
else if("2".equals(userType)) {
page += "type2.jsp";
}
else if("3".equals(userType)) {
page += "type3.jsp";
}

//tilesコンテキストのページを設定
tilesContext.putAttribute("body", page);
}

}

some.pageのdefinitionが呼び出されたらコントローラでuserTypeをチェック、例えばuserTypeが"1"の場合の部分のvalueが"/WEB-INF/tiles/pages/type1.jsp"に設定される。