Wicket 1.5.2 で、
調べた
[TOC]
前提
動作確認している
Wicket の
Version <!-- https://mvnrepository.com/artifact/org.apache.wicket/wicket-core --> <dependency> <groupId>org.apache.wicket</groupId> <artifactId>wicket-core</artifactId> <version>1.5.2</version> </dependency>
OS
% sw_vers ProductName: Mac OS X ProductVersion: 10.12.6 BuildVersion: 16G1036
** Java の
Version** <plugin> <inherited>true</inherited> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> <debug>true</debug> </configuration> </plugin>
参考
Wicket 7.6.0 での CSS Javascript の Reference 出力の コントロール方法に ついて
過去に
Wicket scriptタグ を
Wicket 7.6.0
ですとFilteredHeaderItem
、HeaderResponseDecorator
を
Wicket 1.5.2 での CSS Javascript の Reference 出力の コントロール方法に ついて
Wicket 7.6.0 と
HTML と、
Page クラスに Footer 部と する Container を 追加する HeaderResponseDecoratorHeader の
設定 HeaderResponseContainerFilteringHeaderResponse の
拡張クラスの 作成
以下、
作成した
Wicket 1.5.2 で、
1. HTML と、 Page クラスに Footer 部と する Container を 追加する
Footer 出力箇所と
footerBucket
は
HeaderResponseFilteredResponseContainer
のfooterBucket
は
HTML
<wicket:container wicket:id="footerBucket"/>
Pageクラス
add(new HeaderResponseFilteredResponseContainer("footerBucket", "footerBucket"));
2. HeaderResponseDecoratorHeader の 設定
WebApplication クラスで、setHeaderResponseDecorator
で、HeaderResponseDecorator
を
3.
でFilteringHeaderResponse
を
filter クラスには、
WebApplication クラス
setHeaderResponseDecorator(new IHeaderResponseDecorator() { HeaderResponseContainerFilteringHeaderResponse.IHeaderResponseFilter[] filters = { new AbstractHeaderResponseFilter("headerBucket") {}, new AbstractHeaderResponseFilter("footerBucket") {}} ; @Override public IHeaderResponse decorate(IHeaderResponse response) { return new FilteringHeaderResponse(response, "headerBucket", filters); } });
CSSAcceptingHeaderResponseFilter 、
JavaScriptAcceptingHeaderResponseFilter を 利用しない 理由
以下の理由から、 CSSAcceptingHeaderResponseFilter 、 JavaScriptAcceptingHeaderResponseFilter は 利用しませんでした。 - 文字列ベースでの
Reference参照だと、 大きな レベルでの コントロールしかできない。
acceptReference
、acceptOtherJavaScript
、acceptOtherCss
という メソッドが ありますが、 文字列ベースの response.renderJavaScriptReference()
実行の際は、 acceptOtherJavaScript
、response.renderCSSReference()
実行の際は、 acceptOtherCSS
が実装され、 追加する/しない の 判断が 行われます。
acceptOtherJavaScript
、acceptOtherCss
は、true/false のみを 返すため、 css ヘッダ部へ、<wbr>javascript は<wbr>フッタ部へ
とする 大雑把な コントロールしかできず、 リソース単位での コントロールが できない ためです。
- 文字列ベースでの
3. HeaderResponseContainerFilteringHeaderResponse の 拡張クラスの 作成
リソース単位での
- renderJavaScriptReferenceIntoFooter、
renderCSSReferenceIntoFooter メソッドの 追加
HeaderResponseContainerFilteringHeaderResponse
のJAVA DOC に 以下の 記載が あります。 出力を 完全に コントロールしたい 場合は、 runWithFilter
メソッドを使えばよいとの ことなので、 runWithFilter
メソッドを使用して、 Footer部を 指定して タグを 追加する メソッドを 追加しました。
If subclasses of this class have special cases where they force something into a particular bucket, regardless of the filters, they can create a Runnable that renders to the real response, and pass it to this method with the name of the filter (bucket) that they want it to appear in. Example:
public void renderJavascriptIntoHead(final String js, final String id) { runWithFilter(new Runnable() { public void run() { getRealResponse().renderJavascript(js, id); } }, "headerBucket"); }
- aync属性の
出力メソッドの 追加
Wicket 1.5.2 だと、defer 属性のみ 出力できるのですが、 Wicket 8.0 の 実装を 見ると、 Javascript の async 属性も 追加できるようになっています。
async 属性で非同期実行の 順序を コントロールしたい ケースが ありそうですので、 以下クラスの 実装を 参考に、 async 属性を コントロールできる メソッドを 追加しました。
wicket/JavaScriptUtils.java at master · apache/wicket
使い方
Page クラスのrenderHead
で、IHeaderResponse
をFilteringHeaderResponse
に
@Override public void renderHead(IHeaderResponse response) { FilteringHeaderResponse filteringResponse = (FilteringHeaderResponse) response; filteringResponse.renderString("<script type=\"text/javascript\"><!-- document.write(\"Hello\"); // --></script>"); filteringResponse.renderString("<link type=\"image/x-icon\" rel=\"shortcut icon\" href=\"resources/favicon.ico\" />"); filteringResponse.renderCSSReference("https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"); filteringResponse.renderJavaScriptReference("https://code.jquery.com/jquery-1.12.4.min.js"); filteringResponse.renderJavaScriptReference("https://code.jquery.com/jquery-1.12.4.min.js", true, false); filteringResponse.renderJavaScriptReferenceIntoFooter("https://code.jquery.com/jquery-2.2.4.min.js", true, true); super.renderHead(response); }
気にしなかった こと
TOP - async/defer属性と
async、
defer 属性は 論理型の 属性( あれば true、 なければ false)で、 スクリプトが どのように 実行されるべきかを 表します。また src 属性が ない 場合は 指定する ことができません。
論理属性なので、defer="defer" async="async"
と
フレームワークは
エンタープライズだと、
以上です。
コメント