1. 概要

Java Enterprise Edition(JEE)7は、いくつかの便利な機能を提供します。 ユーザー入力を検証し、値を適切なJavaデータ型に変換します。

このチュートリアルでは、コンバーター、リスナー、およびバリデーターによって提供される機能に焦点を当てます。

2. コンバーター

コンバーターを使用すると、文字列入力値をJavaデータ型に変換できます。 事前定義されたコンバーターはjavax.faces.convertパッケージにあり、任意のJavaデータ型またはDate。などの標準クラスと互換性があります。

Integer コンバーターを定義するには、最初に、JSFフォームのバックエンドとして使用されるマネージドBeanにプロパティを作成します。

private Integer age;
	 
// getters and setters

次に、 f:converter タグを使用して、フォームにコンポーネントを作成します。

<h:outputLabel value="Age:"/>
<h:inputText id="Age" value="#{convListVal.age}">
    <f:converter converterId="javax.faces.Integer" />
</h:inputText>
<h:message for="Age" />

同様の方法で、Doubleコンバーターのような他の数値コンバーターを作成します。

private Double average;

次に、ビューに適切なJSFコンポーネントを作成します。 変数average、を使用していることに注意してください。この変数は、名前の規則により、ゲッターとセッターを使用してフィールドにマップされます。

<h:outputLabel value="Average:"/>
<h:inputText id="Average" value="#{convListVal.average}">
    <f:converter converterId="javax.faces.Double" />
</h:inputText>
<h:message for="Average" />

ユーザーにフィードバックを提供する場合は、エラーメッセージのプレースホルダーとしてコントロールが使用する h:messageタグを含める必要があります。

DateTime コンバーターは、日付、時刻を検証し、これらの値をフォーマットできるため、便利なコンバーターです。

まず、以前のコンバーターと同様に、ゲッターとセッターを使用してフィールドを宣言します。

private Date myDate;
// getters and setters

次に、ビューにコンポーネントを作成します。 ここでは、パターンを使用して日付を入力する必要があります。パターンが使用されていない場合、入力の正しいパターンの例でエラーが発生します。

<h:outputLabel value="Date:"/>
<h:inputText id="MyDate" value="#{convListVal.myDate}">
    <f:convertDateTime pattern="dd/MM/yyyy" />
</h:inputText>
<h:message for="MyDate" />
<h:outputText value="#{convListVal.myDate}">
    <f:convertDateTime dateStyle="full" locale="en"/>
</h:outputText>

この場合、入力日を変換して、 h:outputText。で完全な日付としてフォーマットされた投稿データを送信できます。

3. リスナー

リスナーを使用すると、コンポーネントの変更を監視できます。 テキストフィールドの値がいつ変更されるかを監視しています。

前と同じように、マネージドBeanでプロパティを定義します。

private String name;

次に、ビューでリスナーを定義します。

<h:outputLabel value="Name:"/>
<h:inputText id="name" size="30" value="#{convListVal.name}">
    <f:valueChangeListener type="com.baeldung.convListVal.MyListener" />
</h:inputText>

f:valueChangeListener を追加して、 h:inputText タグを設定します。また、listenerタグ内に、次の場合にタスクを実行するために使用されるクラスを指定する必要があります。リスナーがトリガーされます。

public class MyListener implements ValueChangeListener {
    private static final Logger LOG = Logger.getLogger(MyListener.class.getName());	
        
    @Override
    public void processValueChange(ValueChangeEvent event)
      throws AbortProcessingException {
        if (event.getNewValue() != null) {
            LOG.log(Level.INFO, "\tNew Value:{0}", event.getNewValue());
        }
    }
}

リスナークラスは、 ValueChangeListener インターフェイスを実装し、 processValueChange()メソッドをオーバーライドして、リスナータスクを実行し、ログメッセージを書き込む必要があります。

4. バリデーター

バリデーターを使用して、提供されている一連の標準クラスを使用してJSFコンポーネントデータを検証し、ユーザー入力を検証します。

ここでは、テキストフィールドへのユーザー入力の長さを確認できるようにするための標準バリデーターを定義しました。

まず、マネージドBeanにフィールドを作成します。

private String surname;

次に、ビューにコンポーネントを作成します。

<h:outputLabel value="surname" for="surname"/>
<h:panelGroup>
    <h:inputText id="surname" value="#{convListVal.surname}">
        <f:validateLength minimum="5" maximum="10"/>
    </h:inputText>
    <h:message for="surname" errorStyle="color:red"  />
</h:panelGroup>

h:inputText タグ内に、入力の長さを検証するためのバリデーターを配置します。 JSFにはさまざまな標準検証ツールが事前定義されており、ここに示すものと同様の方法で使用できることを覚えておいてください。

5. テスト

このJSFアプリケーションをテストするために、Arquillianを使用して、Drone、Graphene、およびSeleniumWebDriverで機能テストを実行します。

まず、 ShrinkWrap:を使用してアプリケーションをデプロイします

@Deployment(testable = false)
public static WebArchive createDeployment() {
    return (ShrinkWrap.create(
      WebArchive.class, "jee7.war").
      addClasses(ConvListVal.class, MyListener.class)).
      addAsWebResource(new File(WEBAPP_SRC, "ConvListVal.xhtml")).
      addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml");
}

次に、各コンポーネントのエラーメッセージをテストして、アプリケーションが正しく機能していることを確認します。

@Test
@RunAsClient
public void givenAge_whenAgeInvalid_thenErrorMessage() throws Exception {
    browser.get(deploymentUrl.toExternalForm() + "ConvListVal.jsf");
    ageInput.sendKeys("stringage");
    guardHttp(sendButton).click();
    assertTrue("Show Age error message",
      browser.findElements(By.id("myForm:ageError")).size() > 0);
}

同様のテストが各コンポーネントで実行されます。

6. 概要

このチュートリアルでは、JEE7が提供するコンバーター、リスナー、およびバリデーターの実装を作成しました。

コードは、Githubの記事から見つけることができます。