Wicket のページは、そのまま使用するとステートフルでページセッションの番号が
ブラウザのURLに付与されてしまう。
?1 → 2回目の表示、 → ?2
昔からこの解決方法は以下 stackoverflow で示唆されてきているが、敢えてここに書くと。。
stackoverflow.com
↑ ↑ ↑
コンストラクタは、1つのみにすべきで
import org.apache.wicket.core.request.handler.BookmarkableListenerRequestHandler; import org.apache.wicket.core.request.handler.ListenerRequestHandler; import org.apache.wicket.core.request.mapper.MountedMapper; import org.apache.wicket.request.IRequestHandler; import org.apache.wicket.request.Url; import org.apache.wicket.request.component.IRequestablePage; import org.apache.wicket.request.mapper.info.PageComponentInfo; import org.apache.wicket.request.mapper.parameter.PageParametersEncoder; public class NoVersionMapper extends MountedMapper{ public NoVersionMapper(String mountPath, final Class<? extends IRequestablePage> pageClass){ super(mountPath, pageClass, new PageParametersEncoder()); } @Override protected void encodePageComponentInfo(Url url, PageComponentInfo info){ } @Override public Url mapHandler(IRequestHandler requestHandler){ if (requestHandler instanceof ListenerRequestHandler || requestHandler instanceof BookmarkableListenerRequestHandler){ return null; }else{ return super.mapHandler(requestHandler); } } }
mountPath を指定しないコンストラクタを用意してそれを使ってしまうと、
全てのURLで同じ Page を指してしまい良くない。・・そういう要求ケースもあるかもしれないが考えにくい。
この NoVersionMapper を WebApplation の init() で
getRootRequestMapperAsCompound().add(new NoVersionMapper("/", HomePage.class));
のように指定していくわけだが、サイトの全ページに対処するとなると全Page クラスでこれを呼びだすのも
ちょっとたいへん。init() の書き方を各々工夫することに委ねられるだろう。
(注意)
ただし!以下が後から発覚! "/" に対しては
NoVersionMapper を書くべきでない。
oboe2uran.hatenablog.com