あまり
ふと
調べてみた
Example ソースコードに
使用している Wicketの Version
7.2.0
Modelに ついての 説明文書
以下の
第2回
コンポーネントと モデル
まず、最初に これを 一読しました。 Wicketの
ユニットテスト機能
WicketTesterについての pdfですが、 後半に、 Modelに ついての 説明付録が あります。 Modelと
PropertyModel
ModelとPropertyModelの 実装の 説明 Apache Wicket ベストプラクティス(日本語)
「常に Modelを 使え」に 大事な ことが 書いてありました。
Modelパッケージ配下の Class一覧
wicket/wicket-core/src/main/java/org/apache/wicket/model at wicket-7.x · apache/wicket · GitHub
から
Class名 | Notes |
---|---|
AbstractPropertyModel.java | PropertyModel.javaの基底クラス 省略 |
AbstractReadOnlyModel.java | ReadOnlyを保証したい時に使う |
AbstractWrapModel.java | ModelオブジェクトをWrapして、一部を加工する時に使用する |
ChainingModel.java | PropertyModel.java,CompoundPropertyModel.javaの基底クラス 省略 |
ComponentDetachableModel.java | シリアライズするには忍びない大きいオブジェクト生成時に使用する |
ComponentModel.java | Panel等ページテンプレートクラスにデータクラスを設定 |
ComponentPropertyModel.java | Panel等ページテンプレートクラスにデータクラスを設定、値はコピーしてくれる |
CompoundPropertyModel.java | 値は自動コピーもする。単純コピーでないものはbindできる。 |
IChainingModel.java | IFなので省略 |
IComponentAssignedModel.java | IFなので省略 |
IComponentInheritedModel.java | IFなので省略 |
IDetachable.java | IFなので省略 |
IModel.java | IFなので省略 |
IModelComparator.java | IFなので省略 |
IObjectClassAwareModel.java | IFなので省略 |
IPropertyReflectionAwareModel.java | IFなので省略 |
IWrapModel.java | IFなので省略 |
LoadableDetachableModel.java | Sessionに大きなデータを積まないようにするためのModel |
Model.java | オーソドックなModel |
PropertyModel.java | CompoundPropertyModel.javaがあるので、あまり使用機会はないかもしれない |
ResourceModel.java | ResourceBundleを扱う際に使用するModel |
StringResourceModel.java | メッセージ出力時などに使用する。1つだけならgetString() |
AbstractReadOnlyModel.java
- 参考サイト
** Java Code Example org.apache.wicket.model.AbstractReadOnlyModel
** 最新WicketのGenericsぶりに、 早くも 敗れ去る – タロタローグ ブログ
AbstractWrapModel.java
大きいModelが
大元の
AbstractWrapModel.java
を
- 参考サイト
** Java Code Example
** Java Code Example
ComponentDetachableModel.java
exmampleが
- 参考サイト
** Detachable Models - Apache Wicket - Apache Software Foundation
** 11 Wicket models and forms 7.x
ComponentModel.java
exmampleが
参考情報も
ComponentPropertyModel.java
の
実装を
ComponentPropertyModel.java
Panelと
Panelは
単純な
単純なComponentModel.java
を
CompoundPropertyModel.java
このクラスは
使い
- 参考サイト
関連:ListItem#setModel()に ついて
ListItemには、
setDefaultModel()は、
java5以降で
- ListItem#setDefaultModel()
CompoundPropertyModel<Blog> blogModel = new CompoundPropertyModel<>(item.getModelObject()); item.setDefaultModel(blogModel);
ではなくて、
ListItem#setModel()
CompoundPropertyModel<Blog> blogModel = new CompoundPropertyModel<>(item.getModelObject()); item.setModel(blogModel);
参考サイト
関連:MarkupContainer#setDefaultModel()に ついて
Pageクラス、
※setModel、
関連:BoundCompoundPropertyModelに ついて
wicket1.4くらいまでは、
以下の、
BoundCompoundPropertyModel#bind(final Component component, final String propertyExpression)
/** * Adds a property binding. * * @param component * The component to bind * @param propertyExpression * A property expression pointing to the property in this model * @return The component, for convenience in adding components */ public Component bind(final Component component, final String propertyExpression) { bind(component, propertyExpression, null); return component; }
BoundCompoundPropertyModel#bind(final Component component, final Class type)
/** * Adds a type conversion binding. * * @param component * The component to bind * @param type * The type of the property * @return The component, for convenience in adding components */ public Component bind(final Component component, final Class type) { bind(component, component.getId(), type); return component; }
wicket1.4で
上記の
- CompoundPropertyModel#bind(String property)
/** * Binds this model to a special property by returning a model that has this compound model as * its nested/wrapped model and the property which should be evaluated. This can be used if the * id of the Component isn't a valid property for the data object. * * @param property * the name that will be used to find * @return The IModel that is a wrapper around the current model and the property * @param <S> * the type of the property */ public <S> IModel<S> bind(String property) { return new PropertyModel<>(this, property); }
関連:PropertiesListViewに ついて
ListViewで、
ListItem#getModel()の
// ------------------------------------------- // New LitView ListView<Video> videoListView = new PropertyListView<Video>("videos", videos) { private static final long serialVersionUID = 4949588177564901031L; @Override protected void populateItem(ListItem<Video> item) { item.add(new Label("title")); WebComponent webComponent = new WebComponent("videoSrc"); CompoundPropertyModel<Video> model = (CompoundPropertyModel<Video>) item.getModel(); webComponent.add(AttributeModifier.replace("src", model.bind("embedUrl"))); item.add(webComponent); } }; // -------------------- add(videoListView);
正直使える
ListItem直下の
それほど、
設定できる
中、
LoadableDetachableModel.java
Sessionに
Sessionには
- 試しに
LoadableDetachableModel
を記載した プログラムの 抜粋 FestivalRepositoryは JPAの リポジトリクラスで 全件リスト 取得処理が 走ります。
LoadableDetachableModel<List<Festival>> festivals = new LoadableDetachableModel<List<Festival>>() { private static final long serialVersionUID = 7474274077691068779L; @Override protected List<Festival> load() { // Get ListView Elems FestivalRepository repository = InjectorHolder._new(FestivalRepository.class); return repository.findAll(); } };
- 参考サイト
LoadableDetachableModel
の処理の 肝は、 検索キーを 保持する ケースかと 思われます。
キーはModel内に 保持して、 再度 getObject()
が呼び出された 際に、 復旧できるように しているようです。
Model.java
簡単なgetObject
を
PropertyModel.java
ComponentPropertyModel
を
ResourceModel.java
あまり
StringResourceModel.java
の
単純なgetString()
ではなく
StringResourceModel.java
以下、
StringResourceModelは、
シリアライズの
包括的な
やはりちょっと
以上です。
コメント