こんなアプリを作る †
Java、HTML、Properties を併せて画面を作る †
レタリングの仕方は5種類を試してみる †
- wicket:message を使って、Properties ファイルから直接リソースを読み込み、HTMLのボタンのラベル名を変更する。
- Java で、 Properties ファイルのリソースを読み込み、HTMLのボタンのラベル名を変更する。
- wicket:message を使って、Properties ファイルから直接リソースを読み込み、HTMLのラベルに設定する。
- Java で、現在のロケールの書式で日付を文字列化し、HTMLのラベルに設定する。
- ここではいろいろやっている
- a.親画面(継承元)の Properties ファイルからリソースを読み込む
- b.HTMLのラベルの色を変更する
- c.Properties ファイルに定義された、プレイスホルダ( ${name} , {0} , {1})付きのメッセージに、Java で値を埋め込み、HTMLのラベルに設定する。
フランス語、日本語、中国語対応 †
wicket:message を使って、Properties ファイルから直接リソースを読み込み、HTMLのボタンのラベル名を変更する。 †
- LabelPage?.html
<!-- レタリング時に、properties ファイルから直接タグ属性に値を代入
したいときには、${タグ属性}:${propertyのkey} とする -->
<input type="submit" wicket:id="changeButton" wicket:message="value:change" value="CHANGE"/>
- LabelPage?.properties
f.today-is=Today is
change=Change
back=Back
Java で、 Properties ファイルのリソースを読み込み、HTMLのボタンのラベル名を変更する。 †
- LabelPage?.html
<!-- レタリング時に、LabelPage.java でタグ属性を埋め込む -->
<input type="submit" wicket:id="backButton"/>
- LabelPage?.java
// ----- BACK BUTTON
Button back = new Button("backButton") {
private static final long serialVersionUID = 3515590724694491832L;
@Override
protected void onComponentTag(ComponentTag tag) {
// onComponentTag で、タグ属性を付け足す場合には
// HTML に、目的のタグ属性が無くても良い
// (タグ属性が作られる)
super.onComponentTag(tag);
tag.getAttributes().put("value", getString("back"));
}
@Override
public void onSubmit() {
setResponsePage(new MenuPage());
}
};
f.add(back);
- LabelPage?.properties
f.today-is=Today is
change=Change
back=Back
wicket:message を使って、Properties ファイルから直接リソースを読み込み、HTMLのラベルに設定する。 †
Java で、現在のロケールの書式で日付を文字列化し、HTMLのラベルに設定する。 †
- LabelPage?.html
<!-- レタリング時に、LabelPage.java で値を代入する -->
<span wicket:id="today">XXXX-XX-XX</span>
- LabelPage?.java
// ----- DATE TIME
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL,
DateFormat.FULL, getSession().getLocale());
f.add(new Label("today", df.format(new Date())));
親画面のリソースを使う・プレイスホルダ付きのメッセージの扱い方。 †
- LabelPage?.html
<!-- 親クラスのリソースを参照する -->
<span wicket:id="placehold" style="color:green">
This label will be made by the properties of the parent page
</span>
- LabelPage?.java
// ----- COLORED LABEL (REFER THE PARENT PAGE'S PROPERTIES FILE)
HashMap<String, String> argMap = new HashMap<String, String>();
argMap.put("name", "Alice");
String[] argArray = new String[] { "Bob", "Charry", "Dan" };
// ResourceModel, StringResourceModel は、継承元(親)ページの
// properties ファイルのエントリを引くことができる。
//
// Place holder に入れる値は、Map ではなく Bean でも良い
// (この場合 getName() が実装されていればよい)
Label placeholdLabel = new Label("placehold",
new StringResourceModel("angerMessage", this,
new Model(argMap), argArray));
// AttributeModel で、タグ属性を付け足す場合には
// HTML に、目的のタグ属性が無くてはならない
// (タグ属性が書き換えられる)
placeholdLabel.add(new AttributeModifier("style",
new ResourceModel("angerStyle")));
f.add(placeholdLabel);
- ResourceModel?( resourceKey )
- Properties ファイルから resourceKey に対応する値を取ってくる
- StringResourceModel?( resourceKey, component, new Model(bean) )
- Properties ファイルから resourceKey に対応する、プレースホルダ付きの文字列を取ってくる
- component に対応するページとその親(継承元)ページ の Properties ファイルを走査する。
- プレースホルダは、bean で埋める
Hello ${name}
の ${name} には、bean#getName() の返値が埋め込まれる。
beanは、HashMap? でもいい( Serializable を実装している必要があるので、Map はダメ )
- StringResourceModel?( resourceKey, component, new Model(bean), params[] )
- AttributeModifier?
- Component.add( AttributeModifier? ) で、タグ属性を変えることができる。
- 変えることができる というところがミソで、HTML に変える対象のタグが必要。
- LabelPage?.properties
f.today-is=Today is
change=Change
back=Back
LabelPage?.properties には、LabelPage?.java で使われている angerStyle や angerMessage は記入されていない
- LabelParentPage?.properties
angerStyle=color:red
angerMessage=Sit here until I say you can go, ${name}! {0}, {1} and {2}, too.
StringResourceModel? や ResourceModel? は、親画面の Properties ファイルも探しに行く
ソースコード †
LabelPage?.html †
<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:wicket="http://wicket.apache.org/">
<head>
<title>Label Exam</title>
</head>
<body>
<form wicket:id="f"><img src="flag.gif" wicket:id="flag" /><br />
<p><select wicket:id="selectedLocale">
<option value="0">XXXXX</option>
<option value="1">YYYYY</option>
<option value="2">ZZZZZ</option>
</select> <!-- レタリング時に、properties ファイルから直接タグ属性に値を代入
したいときには、${タグ属性}:${propertyのkey} とする --> <input type="submit"
wicket:id="changeButton" wicket:message="value:change" value="CHANGE" />
<!-- レタリング時に、LabelPage.java でタグ属性を埋め込む --> <input type="submit"
wicket:id="backButton" /></p>
<!-- レタリング時に、properties ファイルから直接値を代入する --> <wicket:message
key="today-is">TODAY IS</wicket:message> <!-- レタリング時に、LabelPage.java で値を代入する -->
<span wicket:id="today">XXXX-XX-XX</span> <br />
<br />
<!-- 親クラスのリソースを参照する --> <span wicket:id="placehold"
style="color: green"> This label will be made by the properties
of the parent page </span></form>
</body>
</html>
LabelPageVO.java †
package com.snail.wicket.exam.label;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import java.util.Locale;
public final class LabelVO implements Serializable {
private static final long serialVersionUID = -4718473278534052108L;
private List<Locale> localeList;
private Locale selectedLocale;
public LabelVO() {
localeList = new LinkedList<Locale>();
localeList.add(Locale.FRENCH);
localeList.add(Locale.JAPANESE);
localeList.add(Locale.CHINESE);
localeList.add(Locale.ENGLISH);
}
public void setLocaleList(List<Locale> localeList) {
this.localeList = localeList;
}
public List<Locale> getLocaleList() {
return localeList;
}
public void setSelectedLocale(Locale selectedLocale) {
this.selectedLocale = selectedLocale;
}
public Locale getSelectedLocale() {
return selectedLocale;
}
}
LabelPage?.java (extends LabelParentPage?) †
package com.snail.wicket.exam.label;
import com.snail.wicket.exam.MenuPage;
import org.apache.wicket.AttributeModifier;
import org.apache.wicket.markup.ComponentTag;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Button;
import org.apache.wicket.markup.html.form.DropDownChoice;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.image.Image;
import org.apache.wicket.model.CompoundPropertyModel;
import org.apache.wicket.model.Model;
import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.model.StringResourceModel;
import java.text.DateFormat;
import java.util.Date;
import java.util.HashMap;
/**
* DOCUMENT ME!
*
* @author $author$
* @version $Revision$
*/
public class LabelPage extends LabelParentPage {
/** */
private static final long serialVersionUID = 6938670271453979073L;
/**
* Creates a new LabelPage object.
*/
public LabelPage() {
this(new LabelVO());
}
/**
* Creates a new LabelPage object.
*
* @param vo DOCUMENT ME!
*/
public LabelPage(final LabelVO vo) {
// ----- FORM
Form f = new Form("f", new CompoundPropertyModel(vo)) {
private static final long serialVersionUID = -637897867574833949L;
@Override
protected void onSubmit() {
getSession().setLocale(vo.getSelectedLocale());
}
};
add(f);
// ----- COMBO BOX
vo.setSelectedLocale(getSession().getLocale());
DropDownChoice localeChoice = new DropDownChoice("selectedLocale",
vo.getLocaleList());
f.add(localeChoice);
// ----- DATE TIME
DateFormat df = DateFormat.getDateTimeInstance(DateFormat.FULL,
DateFormat.FULL, getSession().getLocale());
f.add(new Label("today", df.format(new Date())));
// ----- CHANGE BUTTON
Button change = new Button("changeButton");
f.add(change);
// ----- BACK BUTTON
Button back = new Button("backButton") {
private static final long serialVersionUID = 3515590724694491832L;
@Override
protected void onComponentTag(ComponentTag tag) {
// onComponentTag で、タグ属性を付け足す場合には
// HTML に、目的のタグ属性が無くても良い
// (タグ属性が作られる)
super.onComponentTag(tag);
tag.getAttributes().put("value", getString("back"));
}
@Override
public void onSubmit() {
System.out.println("BACK BUTTON PUSHED");
setResponsePage(new MenuPage());
}
};
f.add(back);
// ----- COLORED LABEL (REFER THE PARENT PAGE'S PROPERTIES FILE)
HashMap<String, String> argMap = new HashMap<String, String>();
argMap.put("name", "Alice");
String[] argArray = new String[] { "Bob", "Charry", "Dan" };
// ResourceModel, StringResourceModel は、継承元(親)ページの
// properties ファイルのエントリを引くことができる。
//
// Place holder に入れる値は、Map ではなく Bean でも良い
// (この場合 getName() が実装されていればよい)
Label placeholdLabel = new Label("placehold",
new StringResourceModel("angerMessage", this,
new Model(argMap), argArray));
// AttributeModel で、タグ属性を付け足す場合には
// HTML に、目的のタグ属性が無くてはならない
// (タグ属性が書き換えられる)
placeholdLabel.add(new AttributeModifier("style",
new ResourceModel("angerStyle")));
f.add(placeholdLabel);
// ----- FLAG
Image flagImage = new Image("flag");
f.add(flagImage);
}
}
LabelPage?.properties †
- LabelPage?.properties
f.today-is=Today is
change=Change
back=Back
- LabelPage_fr.properties
f.today-is=Aujourd'hui est
change=Changement
back=en arrière
- LabelPage_ja.properties
f.today-is=今日は、
change=変更
back=戻る
- LabelPage_zh.properties
f.today-is=今日是
change=変更
back=返回
LabelParentPage?.java †
package com.snail.wicket.exam.label;
import org.apache.wicket.markup.html.WebPage;
public class LabelParentPage extends WebPage {
private static final long serialVersionUID = 8058824640942598408L;
}
LabelParentPage?.properties †
angerStyle=color:red
angerMessage=Sit here until I say you can go, ${name}! {0}, {1} and {2}, too.
Java#Wicket