S2JSFでWebParts その16
さて、リフレッシュしたことだし、
「insertで呼び出されたHTMLの、InitActionを実行する」の続き。
まず、やりたい事を整理すると、
- 親画面
- 子画面1 (m:inject="s:insert"タグで挿入。以下同様)
- 子画面2
- 子画面3
こんな構成の画面を作ったとして、
子画面のInitActionの戻り値がnull以外の場合や、
子画面のInitActionで例外が発生した場合、どう表示すべきか。
例1)
子画面2の戻り値が、子画面4の画面名だった場合。
- 親画面
- 子画面1
- 子画面4
- 子画面3
という形で表示する。
例2)
子画面2のInitActionで、例外が発生した場合。
- 親画面
- 子画面1
- 例外に対応したエラー画面
- 子画面3
という形で表示する。
、、、という所を目指して、実装開始。
protected void processInclude(JsfContext jsfContext, Tag parentTag,
String src) throws JspException {
S2Container container = SingletonS2ContainerFactory.getContainer();
ViewTemplateFactory factory = (ViewTemplateFactory) container
.getComponent(ViewTemplateFactory.class);
ViewTemplate template = factory.getViewTemplate(src);
ViewProcessor viewProcessor = (ViewProcessor) template
.getRootTagProcessor();
InsertProcessor insertProcessor = viewProcessor
.getInsertProcessor(null);
// -- 変更 BEGIN
String initAction = viewProcessor.getInitAction();
FacesContext context = FacesContext.getCurrentInstance();
if (initAction != null) {
String newSrc = executeInitAction(context, initAction);
if (newSrc != null) {
processInclude(jsfContext, parentTag, newSrc);
return;
}
}
insertProcessor.process(jsfContext, parentTag);
// -- 変更 END
}
// -- メソッド追加 BEGIN
protected String executeInitAction(FacesContext context, String initAction) {
Application app = context.getApplication();
MethodBinding mb = app.createMethodBinding(initAction, null);
try {
String outcome = InvokeUtil.invoke(mb, context);
if (outcome == null || context.getResponseComplete()) {
return null;
}
return "★outcomeに対応したページのパス★";
} catch (EvaluationException ex) {
return "★例外に対応したページのパス★";
}
}
// -- メソッド追加 END子画面のInitActionを実行した結果、
遷移する場合も、例外が発生した場合も、それぞれ対応したページのパス(src)を返す。
そのsrcを使って、呼び出し側で再度processIncludeを呼び出す、、、という形。
ひとまずこれで、大枠としては動く模様。
ただ、InitActionの戻り値に対応するページのパスを、
どうやれば取得できるかが分からない (^^;
まぁ、今日の所は、ここまで!