JavaEEに限らず、エラーメッセージなどは通常、プログラムの中に書くのではなく、できればエラーメッセージファイルの中で管理するのが望ましいでしょう。
またJSF側の名称の表示なども直接xhtmlの中に書いてしまうと保守性を下げる原因となります。
今回はメッセージファイルを外において管理する方法です。
メッセージファイルの管理の仕方
サンプル
例えば下記のようなフォームの入力画面があったとします。
仮に必須で、20文字以内の文字列を定義するとき、これを下記のようなエラーメッセージを出したいとします。
ちなみに姓、名、入力に関してもxhtmlの中に入れるのではなく、別のファイルから管理するとします。
メッセージ系のファイルはプロパティファイルなどで管理します。
ファイル構成
ファイル構成ですが、下記のような構成です。後ほど設定ファイルを追加します。
画面のxhtml regist.xhml
プログラム sampleBean.java
エラーメッセージファイル /src/main/resources/ValidationMessages.properties
ラベルファイル /src/main/resources/Label.properties
ソース
regist.xhtml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html"> <head> <title>TODO supply a title</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"/> </head> <body> <h:form> <p>#{fieldLabel.familyName}<h:inputText value="#{sampleBean.familyName}" id="familyName" /><br /> <h:message for="familyName" /></p> <p>#{fieldLabel.firstName}<h:inputText value="#{sampleBean.firstName}" id="firstName" /><br /> <h:message for="firstName" /></p> <h:commandButton action="#{sampleBean.check()}" value="#{fieldLabel.regist}" /> </h:form> </body> </html> |
SampleBean.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package com.sampleweb; import javax.enterprise.context.RequestScoped; import javax.inject.Named; import javax.validation.constraints.Size; import lombok.Getter; import lombok.Setter; /** * * @author matsumoto */ @Named @RequestScoped public class SampleBean { @Getter @Setter @Size(min=1,max=20) private String familyName; @Getter @Setter @Size(min=1,max=20) private String firstName; public String check() { //今回はエラーメッセージとラベルの動きを見るのが目的なので正常な入力があっても画面は遷移しません。 return null; } } |
faces-config.xml
エラーメッセージは上記のバリデーションで行う場合、上記のパス( /src/main/resources/ValidationMessages.properties )であれば設定ファイルなどは必要ありません。
このファイルに下記のように書いておけば、先ほどのようなエラーメッセージが出力されます。
1 |
javax.validation.constraints.Size.message={min}~{max}文字以内で入力してください。 |
ただ任意のパスに設定したい場合や、ラベルなどを出力したい場合はfaces-config.xmlという設定ファイルが必要になります。
1 2 3 4 5 6 7 8 9 10 11 12 |
<?xml version='1.0' encoding='UTF-8'?> <faces-config version="2.2" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-facesconfig_2_2.xsd"> <application> <resource-bundle> <base-name>Label</base-name> <var>fieldLabel</var> </resource-bundle> </application> </faces-config> |
上記のように設定すればvarで設定した変数名として出力することができます。
Label.propertiesの中身ですが、下記のように設定してあげればJSFから参照できます。
1 2 3 |
familyName=姓 firstName=名 regist=入力 |
なおエラーメッセージを任意のパスで出力する場合は、
<application></application>の中で
<message-bundle>パッケージ名/ファイル名</message-bundle>
と記述すれば表示することができます。