1

JSF 2.0 の使用:

ユーザーは、既存の値を持つバッキング Bean フィールドにバインドされた入力フィールドを含むページをロードします。入力フィールドは必須としてマークされています。ユーザーがフィールドを空白にしてフォームを送信すると、期待どおりに必要なメッセージが表示されますが、フィールドの値は、フィールドを空白のままにするのではなく、ページがレンダリングされたときに元の値に置き換えられます。

この動作は、フィールドにフォーマット検証エラーがある場合 (必要な検証エラー) と矛盾しているように見えます。ユーザーが、ページが読み込まれたときにフィールドに入力された既存の有効な電子メール アドレスを無効な電子メール アドレスに置き換えてフォームを送信すると、検証エラー メッセージが表示され、電子メール アドレス フィールドの現在の値がそのまま残ります (置き換えられません)。ページがロードされたときの元の値で)。

必要なフィールドの検証エラーが発生したときにフィールドを空白のままにしておく方法と、元の (空白ではない) 値を再ロードする方法はありますか?

詳細:

  • ウェブロジック 10.3.2
  • マイフェイス 2.0.12

JSF ページ:

<h:form>
  <h:messages showSummary="true"/>
  <h:inputText value="#{page1Controller.firstName}" 
               required="true" 
               requiredMessage="You must enter a first name"/>
  <h:commandButton value="Submit"/>
</h:form>

マネージドBean

@ManagedBean
public class Page1Controller
{

    public String getFirstName()
    {
        return "Default Value";
    }

    public void setFirstName(String value)
    {
        // no-op (for example purposes only)
    }

}
4

3 に答える 3

3

web.xmlのcontext-paramjavax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULLをtrueからfalseに変更すると、問題が修正されました。

于 2012-04-09T13:55:14.777 に答える
0

バッキング Bean のスコープは?

検証エラーの後に Bean が再ロードされ、入力フィールドに元の Bean の値が表示される可能性があるため、問題はスコープに関連している可能性があります。

于 2012-04-06T18:47:12.593 に答える
0

私は同じ問題を抱えています (Glassfish with Mojarra 2.2.7)

ユーザーがデータが既に入力されているページを編集する場合、1 つの selectOneMenu で空のオプションを選択すると、送信時に検証エラー (フィールドが空) が発生し、値が返されます。

これを修正するために、これを追加しました:

<h:selectOneMenu value="#{myBean.value}" validator="#{myBean.required}">
 <f:selectItem itemValue="#{null}" itemLabel="" />
 <f:selectItems value="#{myBean.list}" />
</h:selectOneMenu>

 public void required(FacesContext context, UIComponent component, Object value) throws ValidatorException {
    if(value == null) {
        ((UIInput) component).setValue(null);
        ((UIInput) component).setValid(false);
        throw new ValidatorException(new FacesMessage("Empty!"));
    }
}

しかし、「required=true」を使用できればもっと良いでしょう。INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL の設定がないので、それが理由だとは思いませんか?

[編集] 実際には、h:datatable 内の入力の場合のみであることに気付きました

于 2015-09-25T07:30:44.210 に答える