0

私はWicketを使い始めたばかりで、「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);
    }
}

エラーメッセージは次のとおりです。

予期しないRuntimeException-最後の原因:[ページクラス= HomePage、id = 0、レンダリングカウント= 1]でID'form'のコンポーネントが見つかりません。予期される:'。form'。類似の名前で見つかりました:''

マークアップ行:

<form wicket:id="form">

WicketTesterテストを実行するとわかります。

警告-コンポーネント-通常はマークアップにレンダリングされないコンポーネントに設定されたマークアップ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 に答える