在我正在进行的项目中,我们希望从 Wicket 1.4 升级到 1.5。经过一些工作,我们得到了大部分工作正常。
然而,一件主要的事情还没有奏效。需要将旧的 JSP/servlet 包装到新的基于 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>
在 1.5 版本中,我通过(HttpServletRequest)RequestCycle.get().getRequest().getContainerRequest()
and获取请求和响应(HttpServletResponse)RequestCycle.get().getResponse().getContainerResponse()
然后我尝试:
markupStream.next()
使用1.5 中不再提供 的 onRender()-magic- 把它移到
onComponentTagBody(MarkupStream markupStream, ComponentTag tag)
- 注意:要调用 onComponentTagBody() 我必须打开 wicket:container tag
<wicket:container wicket:id="wrappedContentId"></wicket:container>
。我也尝试过不调用markupStream.next()
,因为该步骤是在调用Component.internalRenderComponent()
之前执行的onComponentTagBody
。
- 注意:要调用 onComponentTagBody() 我必须打开 wicket:container tag
- 把它移到
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和Wicket wiki中找到的方法非常相似
任何解决此问题的帮助将不胜感激!
[编辑]
在 TheStijn 提出建议后,我也尝试过调用getAssociatedMarkupStream()
from ,onRender()
但这会引发以下错误:org.apache.wicket.markup.MarkupNotFoundException: Markup of type 'html' for component '... AbstractServletWrapperPanel$1' not found.