2012-03-30 30 views
2

私は、JSF 2.0でフィールドエラーの強調表示を追加する最善の方法についていくつかのガイダンス/意見を探しています。これまで私はCagatay's exampleを使用してロジックを少し調整して正常に実装しました。JSF 2.0の検証とフィールドの強調表示

String styleClass = (String) uiInput.getAttributes().get("styleClass"); 
     //Check the valid flag 
     if (!uiInput.isValid()) 
     { 
      //Component already has a styleclass 
      if (styleClass != null) 
      { 
       //check if it's already highlighted 
       if (!styleClass.contains("ui-input-invalid")) 
       { 
        //if not add the error class to it 
        styleClass = styleClass + " ui-input-invalid"; 
        //and put the new styleclass back on the component 
        uiInput.getAttributes().put("styleClass", styleClass); 
       } 
      } else 
      { 
       //no current style class so just add the error class 
       uiInput.getAttributes().put("styleClass", "ui-input-invalid"); 
      }  
     } else //component is valid so we might need to remove a highlight 
     { 
      //component has a styleclass 
      if (styleClass != null) 
      { 
       //check if it is already highlighted 
       if (styleClass.contains("ui-input-invalid")) 
       { 
        //remove error class from the string 
        styleClass = styleClass.replace("ui-input-invalid", ""); 
        //and put the new styleclass back on the component 
        uiInput.getAttributes().put("styleClass", styleClass); 
       } 
      }  
     } 

また、各コンポーネントのスタイルクラスにstyleClass="#{component.valid ? '' : 'ui-input-invalid'}"を追加することを提案しました。
両方のメソッドは、Bean Validation JSR303と組み合わせて使用​​すると魅力的です。しかし私は2つの検証段階も追加しています。フィールドとフォームの検証が成功すると、フォーム全体、つまりフィールドの正しい組み合わせと1の一般的なビジネスルールを検証するための1を検証する。これらの段階でも強調表示を追加するために、私は手動で作業する必要があります。どちらのハイライト手法でも、コンポーネントのvalidフラグをfalseに手動で設定する必要があります。コンポーネントにアクセスするために、私はそれをフォームの形で独自のオブジェクトにバインドしました。 Cagatayの例では、すべてのコンポーネントをListに追加し、このリストをハイライト方法に渡す必要があります。私がスタイルクラスのアプローチを使用する場合、私はコンポーネントリストを心配する必要はなく、強調表示メソッドに渡す必要はありません。しかしこれは私にとってはより良いアプローチに見えますが、JSFページにロジックを追加していることが少し心配です。

あなたが気に入っているアプローチは何ですか、あるいは私が気づいていない別の方法がありますか?また、私は、コンポーネントにバインドせずに有効なフラグを設定する他の方法がないと思いますか?現時点では、すべてのコンポーネントをバインドしなければならないので、有効なフラグを設定できます。

答えて

0

私はこれを尋ねてから、しばらくしてJSFをエンタープライズアプリケーションに部分的に実装しました。強調表示されたフィールドのソリューションは非常に複雑で、再利用可能でカスタマイズ可能であるためには、JSF /入力値オブジェクト、関連する入力フィールドオブジェクト、およびビーン検証を含むフレームワークにすばやく収める必要があります。したがって、ここで遭遇する人は、彼らが探している答えを得ることができないかもしれません。しかし私は、そのメカニズムを説明する内部設計文書の一部を含める予定です。

フィールドハイライトとエラーメッセージフィールドの強調表示は、JSF では非常に複雑な作業であることが判明しました。これは、htmlの id/nameがjsfによって実行時に生成され、多くの接頭辞を含むことができるためです。 JSFは、id35に接頭辞を追加します。これは、 のform/tab/datatable/compositeコンポーネント内にあります。 ucnのIDが となってtab1:contentForm:jsfDataTable:1:ucnになる可能性があります。そのため、実際にはIDを取得する前に試してみることは実質的に不可能で、 を試してみることは、 です。この問題を解決するには、 preRenderComponentEventListenerクラスが使用されます。これは、入力タイプとともにfacesConfig.xml に登録されています。これは、入力のタイプが に近づくたびにこのクラスを実行するようにJSF ライフサイクルを指示します。次に入力 の短いIDと長いIDにアクセスし、保存して後でルックアップすることができます。 は次のように完全な手順は次のとおりfacesConfig.xmlで

  1. エントリ preRenderComponentEventListener入力の関連するタイプを登録します。 入力がレンダリングされる前に、processEventメソッドが呼び出され、 が呼び出されます。
  2. facesConfig.xmlのエントリは、入力IDの格納に使用される componentMapというHashMapを登録します。
  3. processEventメソッドが呼び出されると、Input要素が取得されます。 componentMapが取得され、入力のid/clientIDがマップに追加されます。 入力のIDはKey(これは短いID、つまりucn)で、 ClientIDが値です(これは長いJSF生成ID、すなわち csn01Form:jsf454:ucn:1)。同じ名前の複数の入力を処理するには、DataTablesのように キーをインクリメントインデックスで追加します。例えば。 ucn3がすでにマップucn4に存在する場合は追加します。
  4. この プロセスが完了すると、componentMapにはすべての 入力フィールドのエントリが含まれます。したがって、短いIDを使用すると、完全なclientIDは になる可能性があります。
  5. BackingBean FormatValidationExceptionsおよび では、RuleExceptionsがキャッチされて処理されます。
  6. FormatValidationExceptions。これらはBeanValidationから派生したものです。 Destin8Input(CSN01InputVOを参照)のサブクラスを含むInputVOのサブクラス が作成されます。 入力でフォーマットの検証が必要な場合は、カスタムBean検証で注釈を付ける必要があります。例えば。 @StringCheck(Bean検証を参照)。
  7. FormatValidationクラス には、InputVOタイプ を取り込み、Bean Validatorを使用して実行するvalidateFormatsというメソッドがあります(トランザクションを使用すると、このメソッドが自動的に実行されます)。 Bean Validator は、自動的に各注釈付きフィールドを取得し、注釈に関連付けられたisValid() メソッドを実行します。たとえば、 のような@StringCheckは、入力された値が正規表現と一致し、入力された文字の数が正しく入力されているかどうかをチェックします( )。すべての障害が発生すると、 がConstraintViolationになります。この時点で、エラーメッセージはDestin8Inputのエラー表示名を使用して に生成されます。すべての妥当性検査 検査が実行され、拘束違反のセットが発生します。
  8. validateFormatsメソッドでは、ConstraintViolationsのセットは であり、各メッセージは ValidationFormatExceptionのエラーメッセージリストに追加されます。エラーのある各htmlIDも フィールドエラーリストに追加されます。
  9. ValidationFormatExceptionが BackingBeanで検出されました。すべてのエラーメッセージはFacesMessageとして追加され、 がページの上部に表示されます。
  10. 例外例外は、 例外をスローすると、強調表示されるメッセージとフィールドが手動で追加される点を除いて、類似しています( )。メッセージコードは DBから検索されます。
  11. エラーのあるIDのリストはループされ、 に関連付けられたfull ClientIDをcomponentMapから取得するために使用されます。各 ClientIDがリストに追加されます。
  12. このリストは JSFUtils.highlightFieldsメソッドに渡され、各ClientIDは〜 区切り文字列に追加されます。
  13. このように区切られた文字列は、「エラー」のキーで RequestMapに追加されます(これは、各リクエストごとに自動的に のマップです)。
  14. この文字列はDestin8Template.xhtmlの一部として を取得その後れる -
  15. 直ちに呼び出さでhighlightFieldsと呼ばれるJavaScriptメソッド 。 これは、区切られたStringを効果的にループし、完全なID を取得し、jQueryを使用してError cssクラスを追加します。
  16. は、Java入力とJSF入力の間のリンクがIDであることに注意してください。 2を接続するには、同じIDを持つことが重要です。これは、IDConstantsクラスを使用して達成された です。これは、 に異なるフィールドのエントリが含まれているENUMです。また、エントリは、IDConstantsマネージドBean に追加され、フェイスレットを介したアクセスが許可されます。これは であり、適用可能な入力要素のid属性として追加されます。
+0

Prime Facesはこれをデフォルトで行います。 – alphablue

関連する問題