0

我刚开始使用 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,也许他们在此期间改变了一些东西?任何想法如何修复这一小段代码?

4

2 回答 2

3

当您想通过 Ajax 更新一些组件时, setOutputMarkupId(true) 并不能解决问题。您还需要用户 setOutputMarkupPlaceholder(true),我目前不确定这是否适用于 wicket:container。您可能必须将其更改为跨度或类似的东西,因为 Wicket 在通过 Ajax 更新时需要一些 HTML 组件来扩展......

带有空标签的 wicket:container 通常不会渲染任何内容。所以没有什么可以被 Ajax 取代。起初这可能看起来很麻烦,但这是一个很容易习惯的事实。

于 2012-08-03T12:42:36.830 回答
0

对不起,我解决了这个问题。我用来测试代码的嵌入式 Jetty 插件存在问题。当我用 Maven 构建应用程序时,它突然开始引入所有这些 Jetty 的东西,所以我重新启动了嵌入式服务器,结果:我的代码工作了。

于 2012-08-03T14:54:39.843 回答