Apache Wicketを使ってみる[3] -Model編-
0. Wicketでいう「Model」とは何か
Modelというと、だいたいビジネスロジック層とかデータアクセス層とかの認識でいるわけだが、Wicketにおける「Model」はセッションストアを含むデータアクセスも、Viewへの入出力を含む状態の受け渡しもやる。[出典]
こう書いてしまうと、かなりViewModelっぽい気もする。
1. 基本中の基本
単純なラベル表示の場合、たいていのチュートリアルにはこう書かれているはず。
<div><span wicket:id="strLabel">Label!!</span></div>
add(new Label("strLabel", "Hello, World!!));
要は「"strLabel"というIDをもつ要素に"Hello, World!!"という文字列を置け」というだけのものだけれど、内部的には
add(new Label("strLabel", new Model<String>("Hello, World!!")));
と、Viewへの出力を行う基本的な実装を持つModelを仲介している、そうな。[出典]
2. 応用編
前述の例は単純なリテラルの出力だけだけど、当然のことながら「Java Beansとのやりとり」も「別のModelが吐いた出力を受けた入力」も、Modelとして処理できる。
全文はhttps://github.com/bitstorm/Wicket-tutorial-examples/tree/master/ModelChainingExampleを参照いただくとして、「ドロップダウンリストの選択値変化に応じてFormのテキストボックスの値を動的に変更する」処理も容易に実現できる。
なお、こちらのコードは例によってKotlinで書いてみた。
class PersonListDetails() : WebPage() {
/** 連動して値を反映させる先のForm */
private lateinit var forms: Form<Unit>
/** ドロップダウンリストの中身(select + option) */
private lateinit var personList: DropDownChoice<Person%>
init {
// selectとformの橋渡しをするModel
val listModel = Model<Person>
// selectで選択された値を拾うレンダラー
personRender = ChoiceRenderer<Person>("fullName")
// ドロップダウンリストを画面へ割り当てる
personList = DropDownChoice<Person>("persons", listModel, loadPersons(), personRender)
// 更新通知を受け取るためのイベントリスナー的なもの
// これをトリガーに、下で定義しているformにModelが値を反映してくれる
personsList.add(FormComponentUpdatingBehavior());
// 画面へコンポーネントを反映
add(personList)
// selectの変化を受け取るModelを引数にとるModelをformに張る
form = Form("form". CompoundPropertyModel<Person>(listModel))
// それぞれ、listModelが持っているJava Beansのプロパティに紐づいている
form.add(TextField("name"));
form.add(TextField("surname"));
form.add(TextField("address"));
form.add(TextField("email"));
add(form)
}
// selectに張る中身のListを作る処理
fun loadPerson(): List<Person> {...}
}
// 名(name)と姓(surname)を受け取る
data class Person(var name:String, var surname: String): Serializable {
// 住所
var address: String
// メアド
var email: String
// 配偶者
var spouse: Person?
// 子供
var children: MutableList<Person>?
}
これをStrutsでやろうと思うと、JSPにhiddenでいっぱい値をねじ込んでおかないとサクッとはできないよな....
ちなみに、前述のチュートリアルを動かすには pom.xml
のパッケージング設定がjarになっているのでwarに変更する 必要があるので注意。
初めまして。
以前はやりたくてもなかなかできなかったことですね。
投稿: 師子乃 | 2020年6月 7日 (日) 13時28分