我刚开始使用 Wicket,在阅读 Martijn Dashorst 和 Eelco Hillenius 所著的“Wicket in action - by Martijn Dashorst and Eelco Hillenius”一书时,我尝试将我学到的一些东西实施到小测试中,但是当我尝试使用时我似乎犯了一个错误表单中的 AjaxFallbackButton。代码通过了 WicketTester 测试,但是当我执行它时,我得到一个我不完全理解的错误。
我想要实现的是一个显示简单表单的页面,用户可以在其中输入表达式,然后单击按钮,表达式被评估并显示在表单下方。现在我将坚持只显示带有标签的表单内容。书中有一个这样的例子,但它没有使用 AjaxFallBackButton,它只允许更新标签而不是整个页面。
这是html模板:
<!DOCTYPE html>
<html xmlns:wicket="http://wicket.apache.org">
<head>
<meta charset="utf-8" />
<title>Wicket test</title>
<link href='http://fonts.googleapis.com/css?family=Yanone+Kaffeesatz:regular,bold' rel='stylesheet' type='text/css' />
<link rel="stylesheet" href="style.css" type="text/css" media="screen" title="Stylesheet" />
</head>
<body>
<div id="header">
<div id="logo">
<h1>Wicket test</h1>
</div>
</div>
<div id="body">
<h2>Simple test for wicket learning purposes</h2>
<p>
Test: <wicket:container wicket:id="message">text here</wicket:container>
</p>
<form wicket:id="form">
<input wicket:id="textField" type="text" />
<input wicket:id="evalButton" type="submit" value="evaluate" />
</form>
<p>
Result: <span wicket:id="evalResultLabel">result</wicket:container>
</p>
</div>
<div id="footer">
</div>
</body>
</html>
这是对应的java代码:
public class HomePage extends WebPage {
private Label evalResultLabel;
private TextField<String> textField;
public HomePage() {
add(new Label("message", "lalala"));
Form<?> form = new Form("form");
textField = new TextField<String>("textField", new Model<String>("type expression here"));
form.add(textField);
form.add(new AjaxFallbackButton("evalButton", form) {
@Override
public void onSubmit(AjaxRequestTarget target, Form<?> form) {
String expr = textField.getModelObject();
evalResultLabel.setDefaultModelObject(expr);
if (target != null) {
target.add(evalResultLabel);
}
}
});
evalResultLabel = new Label("evalResultLabel", new Model<String>(""));
evalResultLabel.setOutputMarkupId(true);
add(form);
add(evalResultLabel);
}
}
错误信息如下:
Unexpected RuntimeException - 最后一个原因:无法在 [Page class = HomePage,id = 0,render count = 1] 中找到 ID 为“form”的组件,预期:“.form”。找到具有相似名称的:''
在标记行中:
<form wicket:id="form">
当我运行 WicketTester 测试时,它会告诉我:
WARN - 组件 - 在通常不呈现为标记的组件上设置的标记 ID。标记 id:evalResultLabel3,组件 id:evalResultLabel,组件标签:容器。
谁能告诉我我做错了什么。我知道我可能会在书中进一步了解这一点,但这有点违背了这个测试的目的。
更新:当我使用普通检票口按钮时存在同样的问题:
public class HomePage extends WebPage {
private Label evalResultLabel;
private TextField<String> textField;
public HomePage() {
add(new Label("message", "lalala"));
Form form = new Form("form");
textField = new TextField<String>("textField", new Model<String>("type expression here"));
form.add(textField);
form.add(new Button("evalButton") {
@Override
public void onSubmit() {
String expr = textField.getModelObject();
evalResultLabel.setDefaultModelObject(expr);
}
});
evalResultLabel = new Label("evalResultLabel", new Model<String>(""));
add(form);
add(evalResultLabel);
}
}
这与书中给出的示例几乎相同。我看不出我做错了什么。虽然这本书相当老,但我相信使用 Wicket 1.2 或 1.3,也许他们在此期间改变了一些东西?任何想法如何修复这一小段代码?