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、

を使用していることに注意してください。これはその後、名前規則によってgetterとsetterを使用してフィールドにマップされます。

<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

タグを設定し、さらにリスナータグ内にリスナーがトリガーされたときにタスクを実行するために使用されるクラスを指定する必要があります。

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、Selenium Web Driverで機能テストを行います。

まず、__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が提供するコンバーター、リスナー、およびバリデーターの実装を作成しました。

コードはhttps://github.com/eugenp/tutorials/tree/master/jee-7[Githubに掲載]から入手できます。