6

私たちのチームは、Stripesを長年使用して以来、最初のJSF 2.0アプリケーションを作成しています。私は、f:ajaxタグを使用して入力を検証するための最良の方法についていくつか質問があります。

私が回答した多くの質問には、複数の入力と送信ボタンのあるフォームがありますが、個々の入力フィールドは変更後すぐに更新され、データベースに保持されます(送信ボタンはありません。これは機能していました)。 PrototypeのAjax.Requestを使用してStripesで問題はありませんが、可能であれば避けたい余分な手順でした。

基本的に、Beanによって直接裏付けられた一連の入力を含むページがあります。次に例を示します。

<h:inputText id="name" value="#{personController.name}" >
    <f:ajax listener="#{personController.ajax}" />
</h:inputText>

ご存知かもしれませんが、リスナーが呼び出されるまでに、名前の値はBeanですでに変更されています。これは便利ですが、いくつか問題があります。

  • リスナーは、Beanのどの値が変更されたかを明らかに知りません
  • 値はすでに変更されているため、サーバー側の検証を実行できません
  • 名前の古い値が何であるかはわかりませんが、何らかの検証を実行できたとしても、値を何に戻すかはわかりません。

今のところ、変更されたプロパティと新しい値を取得し、それをコントローラーに送信して、検証、データベースの更新、レンダリングするものの返送などを実行するために、ある種のjavascript仲介者を実装する必要があるようです。 。しかし、私が言ったように、これは私たちがストライプで行っていたものであり、私は本当にもっとネイティブなものを使いたいと思っています。

ページにある種の送信ボタンが必要な場合は、valueChangeListener属性のようなものを使用できることはわかりましたが、大量の送信は避けたいと思います。

OpenFacesタグを含めたのは、すでにデータテーブルに使用しているためです。そのため、そこに何か良いものがあれば、それを使用することができます。しかし、私が知る限り、彼らのo:ajaxタグはJSFのf:ajaxよりもそれほど強力ではありません。

ありがとう!

4

1 に答える 1

11

入力フィールドを検証するという具体的な機能要件を達成するために、間違った方向を向いています。これには通常のJSFバリデーターを使用する必要があります。間違ったタイミング(INVOKE_ACTIONフェーズではなくPROCESS_VALIDATIONSフェーズ)で実行され、モデル値を直接把握していないajaxリスナーメソッドではありません。ajaxリスナーメソッドは、現在のモデル値に基づいていくつかのビジネスロジックを実行するために使用されるだけです。

requiredJSFには、属性といくつかの<f:validateXxx>タグの背後にいくつかの組み込みバリデーターがあります。インターフェイスを実装することで、カスタムバリデーターを作成することもできValidatorます。

例:必要性の確認:

<h:inputText ... required="true">
    <f:ajax />
</h:inputText>

または、さまざまな<f:validateXxx>タグの1つを使用して、パターンと一致するかどうかを確認します。

<h:inputText ...>
    <f:validateRegex pattern="[a-z]+" />
    <f:ajax />
</h:inputText>

または、カスタムバリデーターを使用します。

<h:inputText ...>
    <f:validator validatorId="myValidator" />
    <f:ajax />
</h:inputText>

@FacesValidator("myValidator")
public class MyValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) {
        if (value is not valid) {
            throw new ValidatorException(new FacesMessage(...));
        }
    }

}

HTML DOMイベント(またはチェックボックス/ラジオボタンの場合はイベント)<f:ajax>中に現在の入力フィールドを送信するためだけにあります。現在の入力フィールドをajaxで送信するために、必ずしもメソッドは必要ありません。値変更イベントをフックする場合は、を使用します。changeclick<f:ajax listener>valueChangeListener

<h:inputText ... valueChangeListener="#{bean.valueChanged}">
    <f:ajax />
</h:inputText>

public void valueChanged(ValueChangeEvent event) {
    Object oldValue = event.getOldValue();
    Object newValue = event.getValue();
    UIComponent component = event.getComponent();
    // ...
}

これは、特定のコンポーネントで検証が渡された場合にのみ呼び出されることに注意してください。

于 2012-10-03T23:38:59.663 に答える