【问题标题】:Wicket 8 - Extension mechanism does not workWicket 8 - 扩展机制不起作用
【发布时间】:2017-04-26 12:39:46
【问题描述】:

我正在将应用程序从旧版本的 wicket 迁移到 wicket 8。某些页面运行正常(登录等简单页面)。这些页面不使用扩展机制。 当我访问具有该机制的页面时,它不起作用。我不知道这是否是一个错误,但我尝试了一切,但找不到解决方案。 我正在使用 wicket 8.0.0-M5(我知道这不是一个稳定的版本)。有人有同样的问题吗? 这是我的代码:

WerklijstPageXXX.html

<html xmlns:wicket>
 <body>
    <wicket:extend>
        <div wicket:id="panelXXX"></div>
    </wicket:extend>
</body>

WerklijstPanelXXX.html

<wicket:head xmlns:wicket>
</wicket:head>

<wicket:panel xmlns:wicket>
    <div wicket:id="filter">
         <div wicket:id="label"></div>
    </div>
</wicket:panel>

WerklijstPageXXX.java

public class WerklijstPageXXX extends BasePage {

private WerklijstPanelXXX werklijstPanel;

public WerklijstPageXXX() {
    werklijstPanel = new WerklijstPanelXXX("panelXXX"){};
    add(werklijstPanel);
}

@Override
public Panel getContextPanel(String id)
{
    return werklijstPanel.getWerklijstFilterPanel();
}

WerklijstPanelXXX.java

public abstract class WerklijstPanelXXX extends Panel {
private static final Logger LOG = LoggerFactory
        .getLogger(WerklijstPanelXXX.class);

private Panel filterPanel;

public WerklijstPanelXXX(String id) {
    super(id);
    WebMarkupContainer upperPanel = new WebMarkupContainer("filter");
    filterPanel = new Panel("filterPanel") {

    };

    add(upperPanel);

    upperPanel.add(new Label("label"));


}

public Panel getWerklijstFilterPanel() {
    return filterPanel;
}

编辑: BasePage.html(部分)

<div id="body" class="body">
                <div id="aside" class="aside">
                    <div wicket:id="contextPanel"></div>
                </div>
                <div id="content" class="content">
                    <div class="padding">
                        <wicket:child></wicket:child>
                    </div>
                </div>
            </div>

BasePage.java

    @Override
protected void onInitialize() {
    super.onInitialize();
    add(getContextPanel("contextPanel"));
    addTabMenu();
    addMenu();
    addPatientBar();
}

错误:

根本原因:

org.apache.wicket.WicketRuntimeException:下面的组件未能呈现。可能的原因可能是: 1)您在代码中添加了一个组件,但忘记在标记中引用它(因此该组件永远不会被渲染), 2) 如果您的组件被添加到父容器中,请确保子容器的标记将它们包含在 .

  1. [WerklijstPanelXXX [组件 id = panelXXX,页面 = nl.philips.raris.web.werklijst.WerklijstPageXXX,路径 = panelXXX,类型 = nl.philips.raris.web.werklijst.WerklijstPanelXXX,isVisible = true,isVersioned = true ], children = [WebMarkupContainer [Component id = filter]]]
  2. [WebMarkupContainer [组件 id = 过滤器,页面 = nl.philips.raris.web.werklijst.WerklijstPageXXX,路径 = panelXXX:filter,类型 = org.apache.wicket.markup.html.WebMarkupContainer,isVisible = true,isVersioned = true],孩子 = [组件 id = 标签]]
  3. [组件 id = 标签,页面 = nl.philips.raris.web.werklijst.WerklijstPageXXX,路径 = panelXXX:filter:label,类型 = org.apache.wicket.markup.html.basic.Label,isVisible = true , isVersioned = true]
  4. [面板 [组件 id = filterPanel,页面 = nl.philips.raris.web.werklijst.WerklijstPageXXX,路径 = filterPanel,类型 = org.apache.wicket.markup.html.panel.Panel,isVisible = true,isVersioned =真]]

    在 org.apache.wicket.Page.checkRendering(Page.java:662) 在 org.apache.wicket.Page.onAfterRender(Page.java:805) 在 org.apache.wicket.markup.html.WebPage.onAfterRender(WebPage.java:209) 在 org.apache.wicket.Component.afterRender(Component.java:919) 在 org.apache.wicket.Component.render(Component.java:2335) 在 org.apache.wicket.Page.renderPage(Page.java:987) 在 org.apache.wicket.request.handler.render.WebPageRenderer.renderPage(WebPageRenderer.java:124) 在 org.apache.wicket.request.handler.render.WebPageRenderer.respond(WebPageRenderer.java:236) 在 org.apache.wicket.core.request.handler.RenderPageRequestHandler.respond(RenderPageRequestHandler.java:175) 在 org.apache.wicket.request.cycle.RequestCycle$HandlerExecutor.respond(RequestCycle.java:912) 在 org.apache.wicket.request.RequestHandlerExecutor.execute(RequestHandlerExecutor.java:65) 在 org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:283) 在 org.apache.wicket.request.cycle.RequestCycle.processRequest(RequestCycle.java:253) 在 org.apache.wicket.request.cycle.RequestCycle.processRequestAndDetach(RequestCycle.java:221) 在 org.apache.wicket.protocol.http.WicketFilter.processRequestCycle(WicketFilter.java:262) 在 org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:204) 在 org.apache.wicket.protocol.http.WicketServlet.doGet(WicketServlet.java:137) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:687) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 在 org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:808) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1669) 在 org.apache.shiro.web.servlet.AbstractShiroFilter.executeChain(AbstractShiroFilter.java:449) 在 org.apache.shiro.web.servlet.AbstractShiroFilter$1.call(AbstractShiroFilter.java:365) 在 org.apache.shiro.subject.support.SubjectCallable.doCall(SubjectCallable.java:90) 在 org.apache.shiro.subject.support.SubjectCallable.call(SubjectCallable.java:83) 在 org.apache.shiro.subject.support.DelegatingSubject.execute(DelegatingSubject.java:387) 在 org.apache.shiro.web.servlet.AbstractShiroFilter.doFilterInternal(AbstractShiroFilter.java:362) 在 org.apache.shiro.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:125) 在 org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) 在 org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:262) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652) 在 org.springframework.orm.hibernate4.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:151) 在 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1652)

【问题讨论】:

  • “不起作用”到底是什么意思?它只是显示基本页面还是出现异常?如果您共享 BasePage 的代码+html,也可能会很好。如果 BasePage 中没有正确的 标签,则 标签将无法工作。
  • 对不起。我忘了添加错误和 BasePage 的东西。

标签: java wicket


【解决方案1】:

Java 和 HTML 组件树应该匹配。

您的 HTML 声明:&lt;div wicket:id="*contextPanel*"&gt;&lt;/div&gt;,但您的 Java 代码返回一个 ID 为 filterPanel 的面板。

public WerklijstPageXXX() {
    werklijstPanel = new WerklijstPanelXXX("panelXXX"){};
    add(werklijstPanel);
}

@Override
public Panel getContextPanel(String id)  // HERE id is ignored
{
    return werklijstPanel.getWerklijstFilterPanel(); // This returns a panel with id `filterPanel`
}

【讨论】:

  • contextPanel对应BasePage中的div
  • 我已经扩展了我的答案。
猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
  • 2014-11-30
  • 2014-02-20
  • 2019-03-21
  • 2011-08-18
  • 2012-03-02
  • 1970-01-01
相关资源
最近更新 更多