Formに入力した値を表示する

2018年2月24日

この記事は最初の投稿日から18年経過しています。内容が古い可能性があります。

前回作った HelloWorld を改造して、Formに入力した値を表示するように変えてみます。

src/HelloWorld/HelloWorld.html に Form を追加する。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<title>Wicket HelloWorld</title>
</head>
<body>
<form wicket:id = "form">
入力してください。<br>
<input type="text" wicket:id = "msgInput">
<input type = "submit" value="入力完了"/>
</form>
<hr>
あなたが入力したのは、「
<span wicket:id="message">Message goes here</span>
」です。
</body>
</html>

src/HelloWorld/HelloWorld.java で Form を処理する。

package helloworld;
import wicket.markup.html.WebPage;
import wicket.markup.html.basic.Label;
import wicket.markup.html.form.Form;
import wicket.markup.html.form.TextField;
import wicket.model.PropertyModel;
public class HelloWorld extends WebPage {
private String message = "";
public HelloWorld() {
PropertyModel messageModel = new PropertyModel(this, "message");
add(new Label("message", messageModel));
Form form = new Form("form");
form.add(new TextField("msgInput", messageModel));
add(form);
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}

むむっ。これはわからない。PropertyModel とは何でしょう。

Wicket の JavaDoc によると、

A PropertyModel is used to dynamically access a model using a “property expression".

となっています。モデルに対してプロパティっぽいアクセスができると言ってます?

PropertyModel messageModel = new PropertyModel(this, "message");

となっているので、自分自身のインスタンスの getter/setter 付きのメンバー変数である message を関連づけたモデルを作成し、それを、

add(new Label("message", messageModel));

で、

<span wicket:id="message">Message goes here</span>

に割り当て、さらに、

form.add(new TextField("msgInput", messageModel));

で Form の

<input type="text" wicket:id = "msgInput">

に割り当てているというところでしょうか。

Form に入力された値が PropertyModel を通して Bean にセットされ、PropertyModel を経由して取り出されて画面に表示される・・・ということが起こっているように思えます。

とりあえず動かしてみる。

Tomcat を起動して、URLを叩くと入力フォームが表示され、「入力完了」ボタンを押すと入力した値が表示されました。

この、PropertyModel とはどういう概念なのか?Wicketでの位置づけは?をきちんと理解する必要がありそうです。

今日はここまで。

Dev,Wicket

Posted by toshyon