0

ユーザーが社会保障番号 (ユーザー ID) を入力する入力フィールドがあります。この数値は特定の形式にする必要があるため、カスタム コンバーターを使用して正しく形式設定します。その後、番号は DB に対してチェックされます。チェックが失敗した場合、UX の理由から、ユーザーが入力した方法で番号を表示したいと考えています。ただし、変換はチェック前であり、バッキング Bean のユーザー ID が変換された値に設定されているため、元の番号は失われます。元の値を保存する最良の方法は何ですか?

<h:inputText id="userId" value="#{bean.userId}">
    <f:converter converterId="IdConverter" />
</h:inputText>
4

1 に答える 1

1

私があなたの問題を正しく理解していれば、元の値を保存する必要はありません。JSF ライフサイクルを活用します。

カスタム コンバーターに加えて、カスタム バリデーターも必要です。バリデーターで、変換された入力と db 上のデータとの間のチェックが成功した場合、getAsStringカスタム コンバーターは単に変換された入力を返します。ただし、変換が成功しても検証が失敗した場合 (つまり、db レコードに対するチェックが失敗した場合)、単純にValidatorExceptionをスローします。はgetAsString呼び出されず、生の入力が表示されます。

これを達成する方法については、2 つの方法が考えられます。最初のアプローチでは、Bean 内でバリデーター メソッドを定義し、検証ロジックをそのメソッドに移動できます。例 :

public class Bean {    
    //Remainder omitted

    public void validate(FacesContext fc, UIComponent uic, Object o) {
        //Get the converted input. Assuming of type String
         String convertedInput = (String) o; 

        //Move the db check in this method. If it fails simply throw 
        //a ValidatorException like below. If it succeeds, don't return anything

        //throw new ValidatorException(new FacesMessage("Validation Failed")); 
    }
} 

戻り値の型とパラメーターに注意してください。

次に、同様にvalidator属性を追加します<h:inputText>

<h:inputText id="userId" value="#{bean.userId}" validator="#{bean.validate}">

このアプローチの利点の 1 つは、このメソッドがBeanクラスの他のインスタンス変数にアクセスできることですが、欠点として移植性が低くなります。

もう 1 つの方法は、別のクラスにValidatorインターフェイスを実装させることです。例:

@FacesValidator("customValidator")
public class MyValidator implements javax.faces.validator.Validator {

    @Override
    public void validate(FacesContext fc, UIComponent uic, Object o) {
        //Same logic as bean validator method
    }
}

次に、<h:inputText>

<f:validator validatorId="customValidator" />

あなたの問題は、JSF ライフサイクルの理解が不足していることを示しているようです。この概念をできるだけ理解するために時間を割くことを強くお勧めします。一度では理解できないかもしれませんが、JSF に深く関わるにつれて、いくつかの側面がより明確になります。ここから始めるのが良いでしょう。

JSF ライフサイクルをデバッグする

于 2013-07-26T17:52:34.227 に答える