[Wicket-ja-user 472] Re: IComponentResolver利用時にPanelクラスで書かれたCSSPackageResource.getHeaderContributionが効かない

Back to archive index

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




Wicket-ja-user メーリングリストの案内
Back to archive index