なんかドはまりしていたのでメモ。
固定された値を入力するプルダウンを作るのだけど、値そのものが単純なものなので、enumで済ませたい場合の方法。
enum Sex {
WOMAN, MAN
}
バッキングビーン
@Named("editStudent") @RequestScoped public class EditStudent { private Sex sex; public List<Sex> getSexes() { return Arrays.asList(Sex.values()); } //getter, }
<h:selectOneMenu value="#{editStudent.sex}" required="true" label="#{msg.common_sex}"> <f:selectItems value="#{editStudent.sexes}" var="s" itemValue="#{s}" itemLabel="#{s}"/> </h:selectOneMenu>
ところで、固定値などのラベルはtoString()
ではなくて、ちゃんとした文字列かつ国際化できるようにしておきたい。そこでリソースの値を取得できるようにしておく。
enum Sex { WOMAN("common_sex_woman"), MAN("common_sex_man"); private final String resId; Sex(String resId) {this.resId = resId;} public String getResId() {return resId;} }
message.properties
common_sex_woman=女子 common_sex_man=男子
<h:selectOneMenu value="#{editStudent.sex}" required="true" label="#{msg.common_sex}"> <f:selectItems value="#{editStudent.sexes}" var="s" itemValue="#{s}" itemLabel="#{msg[s.resId]}"/> </h:selectOneMenu>
これで国際化も対応したプルダウンをenumから作成できる。
ちなみに僕がはまってたのは既存のデータを更新するときに値をセットし忘れてデフォルトで前の登録内容が反映されていないというポカミスでした。
おわり