私が取り組んでいるプロジェクトでは、Wicket1.4から1.5にアップグレードしたいと考えています。いくつかの作業の後、ほとんどのことが正常に機能するようになりました。
ただし、1つの主要なことがまだ機能していません。古いJSP/サーブレットを新しいWicketベースのアプリケーションにラップする必要があり、古い1.4アプローチは機能しなくなりました。
1.4での簡略化されたhtml出力
<body>
<div id="container">
wrappedContentFromJsp
</div>
<body>
1.5での簡略化されたhtml出力
<body>
wrappedContentFromJsp
<div id="container">
</div>
<body>
したがって、すべてのJSPコンテンツは、ラップしたいタグの外側にレンダリングされます。
ラッピングの魔法は、内部AbstractServletWrapperPanel
とWebMarkupContainer.onRender(MarkupStream markupStream)
オーバーライドで発生します。ただし、Wicket 1.5では、提供されなくなったため、呼び出すことができませmarkupStream.next()
ん。私はまだこれを回避する方法を見つけていません。
参照としてサンプルパネル実装を使用した1.4の作業コード:
public abstract class AbstractServletWrapperPanel extends Panel {
public AbstractServletWrapperPanel(String id, final String servletName, String tagId) {
super(id);
add(new WebMarkupContainer(tagId) {
@Override
protected void onRender(MarkupStream markupStream) {
markupStream.next();
try {
WebRequestCycle cycle = (WebRequestCycle) RequestCycle.get();
ServletRequest request = cycle.getWebRequest().getHttpServletRequest();
ServletResponse response = cycle.getWebResponse().getHttpServletResponse();
ServletContext context = ((WebApplication) Application.get()).getServletContext();
RequestDispatcher rd = context.getNamedDispatcher(servletName);
if (rd != null) {
rd.include(request, response);
} else {
// handling...
}
} catch (Exception e) {
// handling...
}
}
});
}
}
//Impl
public class WrapperPanel extends AbstractServletWrapperPanel {
private static final long serialVersionUID = 1L;
public WrapperPanel(String id, final String servletName) {
super(id, servletName, "wrappedContentId");
}
}
//WrapperPanel html
<body>
<wicket:panel>
<wicket:container wicket:id="wrappedContentId"/>
</wicket:panel>
</body>
(HttpServletRequest)RequestCycle.get().getRequest().getContainerRequest()
1.5バージョンでは、とを介してリクエストとレスポンスを取得しています(HttpServletResponse)RequestCycle.get().getResponse().getContainerResponse()
それから私はしようとしました:
- onRender()を使用する-1.5では
markupStream.next()
提供されなくなった 魔法 - に移動します
onComponentTagBody(MarkupStream markupStream, ComponentTag tag)
- 注:onComponentTagBody()を呼び出すには、wicket:containerタグを開く必要がありました
<wicket:container wicket:id="wrappedContentId"></wicket:container>
。また、呼び出される直前にmarkupStream.next()
そのステップが実行されるため、呼び出さずに試しました。Component.internalRenderComponent()
onComponentTagBody
- 注:onComponentTagBody()を呼び出すには、wicket:containerタグを開く必要がありました
- に移動します
onComponentTag(ComponentTag tag)
- 上記の設定と組み合わせ
setRenderBodyOnly(true)
てWebMarkupContatiner.onInitialize()
<div>
の代わりにタグを使用するwicket:container
- 1.5のレンダリングプロセスを追跡するには、デバッグモードを使用します。しかし、それでも、コンポーネントをレンダリングする新しい1.5の方法の重要な部分を見逃していると思います。
すぐにすべてのJSP機能をWicketに移行するオプションはないので、これは現時点で私たちにとって一種の目玉です。
参考までに、これを行う1.4の方法は、記事jsp-and-wicket-sitting-in-a-treeおよびWicketwikiで見つけたアプローチとよく似ています。
この問題を解決するための助けをいただければ幸いです。
[編集]
TheStijnからの提案の後、私も呼び出しを試みましgetAssociatedMarkupStream()
たonRender()
が、次のエラーが発生します。org.apache.wicket.markup.MarkupNotFoundException: Markup of type 'html' for component '... AbstractServletWrapperPanel$1' not found.