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

Back to archive index

古川 烈 r_f_315****@hotma*****
2010年 9月 3日 (金) 17:49:46 JST


古川です。
早速の返答ありがとうございます。

Panel内部にrenderHead()をオーバーライドAbstractBehaviorを用意して、
renderHead()内でログを出力を設定してみたりしていたのですが、
メソッド自体が全く呼ばれている気配がありませんでしたので、
もしかしたらそうかと思っていたのですが・・・

後学のために竹内様にご教示頂いたコード周辺を読んでみます。

ありがとうございました。

> Date: Fri, 3 Sep 2010 00:09:10 +0900
> From: webma****@chime*****
> To: wicke****@lists*****
> Subject: [Wicket-ja-user 472] Re: IComponentResolver利用時にPanelクラスで書かれたCSSPackageResource.getHeaderContributionが効かない
> 
> 竹内です。
> 
> 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 mailing list
> Wicke****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/wicket-ja-user
 		 	   		  
-------------- next part --------------
HTMLの添付ファイルを保管しました...
下載 



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