问题
我一直收到此错误。我正在关注http://www.7thweb.net/wicket-jquery-ui/wizard/DefaultWizardPage?1上的教程。我试图解决它,但没有任何效果。请帮助!!!
错误
最后原因:以下组件无法渲染。可能的原因可能是:1)您已在代码中添加了一个组件,但忘记了在标记中引用它(因此该组件将永远不会呈现),2)如果您的组件是在父容器中添加的,请确保子容器的标记在中包含它们。
The Stacktrace
根本原因:
org.apache.wicket.WicketRuntimeException:以下组件未能呈现。可能的原因可能是:1)您已在代码中添加了一个组件,但忘记了在标记中引用它(因此该组件将永远不会呈现),2)如果您的组件是在父容器中添加的,请确保子容器的标记在中包含它们。
[EmailTextField [组件ID =邮件,页面= com.mycompany.WizardPage,路径=向导:form:view:mail,类型= org.apache.wicket.markup.html.form.EmailTextField,isVisible = true, isVersioned = false]]
在org.apache.wicket.Page.checkRendering(Page.java:663)在org.apache.wicket.Page.endComponentRender(Page.java:316)在org.apache.wicket.Component.renderPart(Component.java:2206)在org.apache.wicket.page.XmlPartialPageUpdate.writeComponent(XmlPartialPageUpdate.java:75)在org.apache.wicket.page.PartialPageUpdate.writeComponents(PartialPageUpdate.java:262)在org.apache.wicket.page.PartialPageUpdate.writeTo(PartialPageUpdate.java:161)在org.apache.wicket.ajax.AjaxRequestHandler.respond(AjaxRequestHandler.java:361)在org.apache.wicket.request.cycle.RequestCycle $ HandlerExecutor.respond(RequestCycle.java:914)在org.apache.wicket.request.RequestHandlerExecutor.execute(RequestHandlerExecutor.java:65)在org.apache.wicket.request.cycle.RequestCycle.execute(RequestCycle.java:282)在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:275)在org.apache.wicket.protocol.http.WicketFilter.processRequest(WicketFilter.java:206)在org.apache.wicket.protocol.http.WicketFilter.doFilter(WicketFilter.java:299)在io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)在io.undertow.servlet.handlers.FilterHandler $ FilterChainImpl.doFilter(FilterHandler.java:131)在io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)在io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)在io.undertow.servlet.handlers.ServletChain $ 1.handleRequest(ServletChain.java:68)在io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)在org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)处在io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)在io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:132)在io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)在io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)在io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)在io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)在io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)在io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)在io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)在io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)在io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)在org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)处在io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)在org.wildfly.extension.undertow.deployment.GlobalRequestControllerHandler.handleRequest(GlobalRequestControllerHandler.java:68)在io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)在io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292)在io.undertow.servlet.handlers.ServletInitialHandler.access $ 100(ServletInitialHandler.java:81)在io.undertow.servlet.handlers.ServletInitialHandler $ 2.call(ServletInitialHandler.java:138)在io.undertow.servlet.handlers.ServletInitialHandler $ 2.call(ServletInitialHandler.java:135)在io.undertow.servlet.core.ServletRequestContextThreadSetupAction $ 1.call(ServletRequestContextThreadSetupAction.java:48)在io.undertow.servlet.core.ContextClassLoaderSetupAction $ 1.call(ContextClassLoaderSetupAction.java:43)在org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda $ create $ 0(SecurityContextThreadSetupAction.java:105)在org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService $ UndertowThreadSetupAction.lambda $ create $ 0(UndertowDeploymentInfoService.java:1502)在org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService $ UndertowThreadSetupAction.lambda $ create $ 0(UndertowDeploymentInfoService.java:1502)在org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService $ UndertowThreadSetupAction.lambda $ create $ 0(UndertowDeploymentInfoService.java:1502)在org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService $ UndertowThreadSetupAction.lambda $ create $ 0(UndertowDeploymentInfoService.java:1502)在io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)在io.undertow.servlet.handlers.ServletInitialHandler.access $ 000(ServletInitialHandler.java:81)在io.undertow.servlet.handlers.ServletInitialHandler $ 1.handleRequest(ServletInitialHandler.java:104)在io.undertow.server.Connectors.executeRootHandler(Connectors.java:360)在io.undertow.server.HttpServerExchange $ 1.run(HttpServerExchange.java:830)在org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)在org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1985)在org.jboss.threads.EnhancedQueueExecutor $ ThreadBody.doRunTask(EnhancedQueueExecutor.java:1487)在org.jboss.threads.EnhancedQueueExecutor $ ThreadBody.run(EnhancedQueueExecutor.java:1378)在java.lang.Thread.run(Thread.java:748)
WizardPage.html
<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org">
<head>
<title>My experiment</title>
<link rel="stylesheet" href="style.css" type="text/css" media="screen" title="Stylesheet" />
</head>
<body>
<h1>Hi 3</h1>
<h3>Hi 2</h3>
<!--<wicket:extend>-->
<div id="demo-panel">
<form wicket:id="form">
<button wicket:id="open">Create User</button>
<br/><br/>
<div wicket:id="feedbackPanel" style="width: 360px;">
</div>
</form>
<div wicket:id="wizard">
</div>
<!-- <input wicket:id="wizard:name"/>-->
<!-- <input wicket:id="name"/>-->
</div>
<!--</wicket:extend>-->
</body>
</html>
WizardPage.java
import com.googlecode.wicket.jquery.ui.JQueryIcon;
import com.googlecode.wicket.jquery.ui.form.button.AjaxButton;
import com.googlecode.wicket.jquery.ui.panel.JQueryFeedbackPanel;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
public class WizardPage extends WebPage {
private static final long serialVersionUID = 1L;
public WizardPage() {
// Form//
Form<Void> form = new Form<Void>("form");
this.add(form);
//FeedbackPanel//
final FeedbackPanel feedbackPanel = new JQueryFeedbackPanel("feedbackPanel");
//form.add(feedbackPanel);
form.add(feedbackPanel.setOutputMarkupId(true));
// Wizard //
final UserWizard wizard = new UserWizard("wizard", "Create a user") {
private static final long serialVersionUID = 1L;
@Override
protected void onCancel(AjaxRequestTarget target)
{
this.info("Canceled...");
target.add(feedbackPanel);
}
@Override
protected void onFinish(AjaxRequestTarget target)
{
User user = this.getModelObject();
this.info(String.format("Created user: '%s' - %s [%s]", user.getName(), user.getMail(), user.getRole()));
target.add(feedbackPanel.setEscapeModelStrings(false));
}
};
this.add(wizard);
// Button //
form.add(new AjaxButton("open") {
private static final long serialVersionUID = 1L;
@Override
protected String getIcon()
{
return JQueryIcon.GEAR;
}
@Override
protected void onSubmit(AjaxRequestTarget target)
{
wizard.setModelObject(new User());
wizard.open(target);
}
});
}
}
UserWizard.java
package com.mycompany;
import com.googlecode.wicket.jquery.ui.widget.wizard.*;
import org.apache.wicket.extensions.wizard.*;
import org.apache.wicket.markup.html.form.EmailTextField;
import org.apache.wicket.markup.html.form.RadioChoice;
import org.apache.wicket.markup.html.form.RequiredTextField;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.IModel;
import org.apache.wicket.model.Model;
import java.util.Arrays;
abstract class UserWizard extends AbstractWizard<User>
{
private static final long serialVersionUID = 1L;
public UserWizard(String id, String title)
{
super(id, title);
WizardModel wizardModel = new WizardModel();
wizardModel.add(new Step1());
wizardModel.add(new Step2());
wizardModel.add(new Step3());
wizardModel.setLastVisible(true); // makes the 'last step button' visible
this.init(wizardModel);
}
@Override
protected IModel<?> initModel()
{
// We need to have a model at initialization if none has been supplied to the ctor
// Calling #setModel should be avoided afterward, so we can specify a CPM here
return new CompoundPropertyModel<User>(new Model<User>());
}
/**
* Provides the 'Name and email' step<br>
* Associated markup file is DefaultWizardPage$UserWizard$Step1.html
*/
class Step1 extends WizardStep
{
private static final long serialVersionUID = 1L;
public Step1()
{
super("Name & email", "Please provides a user name and an email");
this.add(new RequiredTextField<String>("name"));
this.add(new EmailTextField("mail"));
}
}
/**
* Provides the 'Role' step<br>
* Associated markup file is DefaultWizardPage$UserWizard$Step2.html
*/
class Step2 extends WizardStep
{
private static final long serialVersionUID = 1L;
public Step2()
{
super("User role", "Please select the user role");
this.add(new RadioChoice<String>("role", Arrays.asList("Admin", "User", "Guest")).setRequired(true));
}
}
/**
* Provides the 'summary' step
*/
class Step3 extends StaticContentStep
{
private static final long serialVersionUID = 1L;
public Step3()
{
super("Summary", "Please review information below:", Model.of(), true);
}
@Override
protected void onConfigure()
{
super.onConfigure();
User user = UserWizard.this.getModelObject();
StringBuilder builder = new StringBuilder("<ul>");
builder.append("<li>").append("User name: ").append(user.getName()).append("</li>");
builder.append("<li>").append("User mail: ").append(user.getMail()).append("</li>");
builder.append("<li>").append("User role: ").append(user.getRole()).append("</li>");
builder.append("</ul>");
this.setContentModel(Model.of(builder.toString()));
}
}
}
User.java
package com.mycompany;
import org.apache.wicket.util.io.IClusterable;
public class User implements IClusterable
{
private static final long serialVersionUID = 1L;
private String name;
private String mail;
private String role;
private Avatar avatar;
public User()
{
this.name = "";
this.mail = "";
this.role = "";
}
public User(String name, String mail, String role)
{
this.name = name;
this.mail = mail;
this.role = role;
}
public String getName()
{
return this.name;
}
public String getMail()
{
return this.mail;
}
public String getRole()
{
return this.role;
}
public Avatar getAvatar()
{
return avatar;
}
public void setAvatar(Avatar avatar)
{
this.avatar = avatar;
}
@Override
public String toString()
{
return String.format("%s [%s] - %s", this.name, this.mail, this.role);
}
// Bean //
public static class Avatar implements IClusterable
{
private static final long serialVersionUID = 1L;
private final int id;
private final String path;
public Avatar(final int id, final String path)
{
this.id = id;
this.path = path;
}
public int getId()
{
return this.id;
}
public String getImagePath()
{
return "images/avatars/" + this.path;
}
@Override
public String toString()
{
return "Avatar #" + this.id;
}
}
}