Javaクラスでの入力チェック

今回はJavaクラスで入力チェックを行い、
それを画面に表示させる方法について書きます。

【前提条件】

[環境]

【内容】

前回と同じくサンプルはログイン画面っぽい「index.xhtml」を使います。

<?xml version="1.0" encoding="Windows-31J" ?>
<!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:f="http://java.sun.com/jsf/core"
      xmlns:h="http://java.sun.com/jsf/html"> 
    <f:view>
        <h:head>
            <meta http-equiv="Content-Type" content="text/html; charset=Windows-31J" />
            <title>ログイン</title>
            <style>
            li.errorStyle {
                color : orange;
            }
            li.infoStyle {
                color : black;
            }
            li.warnStyle {
                color : blue;
            }
            li.fatalStyle {
                color : red;
            }
            </style>
        </h:head>
        <h:body>
            <h:form id="loginForm">
                <div id="userIdRow">
                    <span id="userIdLabel">ユーザID</span>
                    <span id="userIdInput">
                        <h:inputText id="userId" value="#{indexPage.userId}" label="ユーザID" />
                        <h:message for="userId"/>
                    </span>
                </div>
                <div id="passwordRow">
                    <span id="passwordLabel">パスワード</span>
                    <span id="passwordInput">
                        <h:inputSecret id="password" value="#{indexPage.password}"  label="パスワード" />
                    </span>
                    <h:message for="password" errorStyle="color : blue;"/>
                </div>
                <div>
                    <h:commandButton action="#{indexPage.login}" value="ログイン" />
                </div>
                <h:messages id="message1" infoClass="infoStyle" warnClass="warnStyle" errorClass="errorStyle" fatalClass="fatalStyle" />
            </h:form>
        </h:body>
    </f:view>
</html>

今回はタグにメッセージ種類ごとのCSSクラスの設定を追加しました。
ユーザIDとパスワードの必須入力チェックも消しています。

続いてJavaクラス側のソースです。

@ManagedBean(name = "indexPage")
@RequestScoped
public class IndexPageImpl {

    /** ユーザID */
    private String userId = null;

    /** パスワード */
    private String password = null;

    public String login() {

        FacesContext context = FacesContext.getCurrentInstance();

        if ("".equals(userId)) {
            context.addMessage("", new FacesMessage(FacesMessage.SEVERITY_INFO, "INFOです(サマリ)", "INFOです(詳細)"));
            context.addMessage("", new FacesMessage(FacesMessage.SEVERITY_WARN, "WARNです(サマリ)", "WARNです(詳細)"));
            context.addMessage("", new FacesMessage(FacesMessage.SEVERITY_ERROR, "ERRORです(サマリ)", "ERRORです(詳細)"));
            context.addMessage("", new FacesMessage(FacesMessage.SEVERITY_FATAL, "FATALです(サマリ)", "FATALです(詳細)"));
        }

        return "";
    }

    // アクセサメソッドは省略
}

メッセージを追加するにはFacesContext#addMessageメソッドを使います。
FacesContext#getCurrentInstanceメソッドでFacesContextのインスタンスを取得します。
FacesContextはリクエストごとに生成されるJSFの状態を保持するクラスです。

addMessageメソッドにはクライアントIDとFacesMessageクラスのオブジェクトを
パラメータとして渡します。
クライアントIDの役割がわかっていませんが、とりあえず、空白で動くようです。

FacesMessageクラスのコンストラクタはいくつかありますが、
今回はメッセージの種類も指定するので、3つのパラメータを受け取るコンストラクタを使います。

一つ目のパラメータはメッセージの種類です。
INFO、WARN、ERROR、FATALの四つが用意されています。
二つ目のパラメータは概要メッセージ、三つ目は詳細メッセージになります。

loginメソッドの戻り値についてですが、
nullや空白を返却すると元のページが表示されます。
戻り値をvoidにしても同様の動きをします。

画面を開いてログインボタンをクリックしてみます。

メッセージが表示されました。
それぞれ設定したメッセージの種類に対応するCSSのクラスが適用されています。

メッセージを見てみると概要メッセージしか出ていません。
タグにshowDetail属性を追加し、「true」を設定してみます。

<h:messages id="message1" infoClass="infoStyle" warnClass="warnStyle" errorClass="errorStyle" fatalClass="fatalStyle" showDetail="true" />

再度、画面を開いてログインボタンをクリックしてみます。

詳細メッセージが表示されました。
概要メッセージはshowSummary属性を「false」にすると表示されません。

Javaクラスでのメッセージの設定はタグのみが対象になるようです。
(もしかしたら、あるのかもしれませんが・・・)