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の戻り値に対応するページのパスを、
どうやれば取得できるかが分からない (^^;
まぁ、今日の所は、ここまで!