Wicket 7 で native Websocket を使ってサーバ PUSH に近いことをしようと作っていて、気持ち悪い制約に気が付いた。
Wicket のサイト web.xml では、たいてい WebFilter として、org.apache.wicket.protocol.http.WebApplication 継承クラスのマッピングには、
<filter-mapping> <filter-name>WebFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
と書いてサイトURL以下全て、WebApplication を通すであろう。
Tomcat 7 の環境だと Wicket が用意する org.apache.wicket.protocol.ws.tomcat7.Tomcat7WebSocketFilter を Websocket 用のフィルタとして
<filter> <filter-name>WebSocketFilter</filter-name> <filter-class>org.apache.wicket.protocol.ws.tomcat7.Tomcat7WebSocketFilter</filter-class> <init-param> <param-name>applicationClassName</param-name> <param-value>sample.SamplApplication</param-value> </init-param> </filter>
と書くであろう。
残念はことに 2017-3-14 現在は、まだ Tomcat 8 用のこの WebSocketFilter はWicket から配布されていない。
filter-mapping にすごくとんでもないルールがあって、url-pattern は、/wicket/ で開始しないと
受信するページで、WebSocketBehavior を登録してもソケット接続コネクションが通知されず結果としてメッセージ受信できない。
<filter-mapping> <filter-name>WebSocketFilter</filter-name> <url-pattern>/wicket/*</url-pattern> </filter-mapping>
と書かないとならない。
これは、BookmarkablePageLink が生成するリンクのURLと被ってしまう。
BookmarkablePageLink が生成するにのは、
サイト名 + "/wicket/bookmarkable/" + PageクラスPATH
のはずだ。
これが嫌で、filter-mapping で、
接続はされないで受信するページを作れない。
Wicket 8 が、もっとちゃんと進めばこんな制約はなくなるのだろうか?