TAKEUCHI Hideyuki
webma****@chime*****
2010年 9月 3日 (金) 00:09:10 JST
竹内です。 IComponentResolver.resolve()は、HTMLのマークアップをはじめから順番に 処理し出力していく中で、idに対応するコンポーネントが見つからなかった ときに初めて呼ばれます。 そのため、残念ながらresolve()が呼ばれる時には通り過ぎてしまっている <head>タグに後から内容を追加することは原理的にできないはずです。 MarkupContainer.renderNext()の途中でIComponentResolverによる 実際の解決がされているのでソースコードを少し眺めてみると よいかもしれません。 -- たけうち(chimerast) (2010/09/02 16:58), 古川 烈 wrote: > 古川です。 > > 現在、IComponentResolverを利用したプログラムで、 > <head></head> 区画にCSSが出力され無い問題で悩んでおります。 > > IComponentResolverを実装し、 > Pageクラス内部でPanelコンポーネントがadd()されなかった場合は、 > 自動でadd()するようなプログラムを作成しています。 > > ページHTML内部で下記の様なタグを用意しています。 > ※タグの例 <div wicket:id="id01" panel-class="panel.MyPanel" ></div> > 独自属性の panel-class からクラス名を取得してリフレクションでインスタン > スを生成しています。 > > ------------------------------------------------------------------------------------------------------ > public class MyComponentResolver implements IComponentResolver { > > @Override > public boolean resolve(MarkupContainer container, MarkupStream > markupStream, ComponentTag tag) { > > /* Wicketが自動的に追加するタグは無視 */ > if (tag.isAutoComponentTag()) { > return false; > } > > try { > > /* コンポーネントクラスを取得 */ > Class<WebComponent> targetClass = (Class<WebComponent>) > Class.forName(tag.getAttribute("panel-class")); > > /* コンストラクタ( String id )の取得 */ > Constructor<WebComponent> constructor = > targetClass.getConstructor(String.class); > > /* パネルコンポーネントインスタンスを取得*/ > Component component = constructor.newInstance(tag.getId()); > > /* コンポーネントを追加する */ > return container.autoAdd(component, markupStream); > > } catch (Exception e) { > } > } > } > > ------------------------------------------------------------------------------------------------------ > public class MyPanel extends Panel { > > /** > * > * @param id > * @param attributes > */ > public MyPanel(String id) { > super(id); > } > > @Override > protected void onInitialize() { > super.onInitialize(); > add(CSSPackageResource.getHeaderContribution(MyPanel.class, > "css/MyCss.css")); > } > } > ------------------------------------------------------------------------------------------------------ > > このとき、Panelは正常にadd()され、レスポンスのHTMLソースにも出力されるの > ですが、 > <head></head> 区画に出力されるはずの > > <link rel="stylesheet" type="text/css" > href="resources/panel.MyPanel/css/MyCss.css" /> > > が出力されません。 > > Pageクラス内の初期化時に、自分で add( new MyPanel("id01") ) した場合は問 > 題無く出力されます。 > IComponentResolverで解決しようとした場合、 > どのようにすれば<head></head>区画に期待通りのソースを出力することが出来 > るのか、 > ご存知の方が居られましたら、ご教示お願い致します。 > > > --------------------------------------------------- > 古川 烈 > 電子メール:r_f_315****@hotma***** > --------------------------------------------------- > > > > _______________________________________________ > Wicket-ja-user mailing list > Wicke****@lists***** > http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user