MyFacesの実装の話かな?
MyFaces 1.1.5
下記のようなManagedBeanで、UIコンポーネントを動的に構築する(動的にDataTableのカラムを生成する)ような処理を行う。
初期のJSPの表示で、HtmlDataTableが空の状態のままで画面を表示するとTABLEは表示されない。
これはOK。
この後、なんらかのアクションでcreateUi()メソッドでUIComponentを生成したとしても、画面表示は変わらない。
これはなんで?
このアクションでは同一JSPでの遷移としていた。
それを、イベントでアクションとしてcreateUi()メソッドを実行し、別のJSPから画面遷移すると問題なくHTMLが生成される。
これでOK。
なんとなく、FacesServletがUIコンポーネント・ツリーを生成するフェーズ(ビューの復元)の処理仕様に依存してる感じがしないでもない。
public class ManagedBean { // DataTableのUIComponent private HtmlDataTable ui = new HtmlDataTable(); // TABLEで表示するデータのリスト private List list = new ArrayList(); public ManagedBean() { super(); } public HtmlDataTable getUi() { return this.ui; } public void setUi(HtmlDataTable ui) { this.ui = ui; } public List getList() { return this.list; } public void setList(List list) { this.list= list; } public void createUi() { // DataTableのUIComponetを構築する処理 } }
<%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %> <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %> <html> <body> <f:view> <h:dataTable id="dataTable" binding="#{managedBean.ui}" var="item" value="#{managedBean.list}" /> </f:view> </body> </html>
同一JSPへの遷移、空の状態(ツリーの子が?)で表示、等の状態では再描画でUIコンポーネント・ツリーを再構築しないetc...とかあるんかな?時間があったら調べてみよ。
とりあえず、汎用的な画面が作れるのが判ったからOK。