2016-08-08 9 views
0

私はJSFの新機能ですが、検証が失敗した後にJSFがフォームでどのような値をレンダリングするのか分かりません。私はWebSphere 7とそのJSF、MyFaces(私は2.0と思う)のデフォルトの実装を使用しています。私はいくつかのテキストと<h:inputText />を埋めるJSF 1.2 empty <h:selectManyListbox />検証の問題

public class Backing { 

    private String text; 

    private String[] options; 

    public String getText() { 
     return text; 
    } 

    public void setText(String text) { 
     this.text = text; 
    } 

    public String[] getOptions() { 
     return options; 
    } 

    public void setOptions(String[] options) { 
     this.options = options; 
    } 
} 
  1. <h:form id="form"> 
        <h:inputText id="text" value="#{backing.text}" required="true"/> 
        <h:message for="text" /> 
    
        <h:selectManyListbox id="options" value="#{backing.options}" required="true"> 
         <f:selectItem itemLabel="1" itemValue="1" /> 
         <f:selectItem itemLabel="2" itemValue="2" /> 
         <f:selectItem itemLabel="3" itemValue="3" /> 
        </h:selectManyListbox> 
        <h:message for="options" /> 
    
        <h:commandButton value="Save" /> 
    </h:form> 
    

    そして、このように私のバッキングBean:

    私のXHTMLは、このようになります。私は、フォームが、私は<h:inputText />に入力された値で、私は<h:selectManyListbox />上で選択したオプションを使用してレンダリングされる(無検証メッセージは、表示されません

  2. 「保存」ボタンを押してください<h:selectManyListbox />
  3. から2つのオプションが選択
  4. 今...
  5. )予想通り、私は私が押し<h:selectManyListbox />
  6. から2つのオプションが選択解除<h:inputText />
  7. を空にする「保存」ボタンが
  8. フォームが空<h:inputText />をレンダリングし、私が選択した前のオプションと<h:selectManyListbox />(予想通り、両方の検証メッセージが示されている)

あなたが見ることができるように、行動<h:inputText />をレンダリングするときそして<h:selectManyListbox />は異なります

  • <h:inputText />は、コンポーネントの送信された値
  • <h:selectManyListbox />は、Beanの値をレンダリングレンダリング

<h:selectManyListbox />レンダリングしようとしましたが、ハッキングやコードの混乱を招くことなく選択肢が選択されていませんでしたが、運がありませんでした。

¿これはいくつかのバグですか?私は何かを逃していますか?

+0

他のフォームを作成中に、テキスト入力それが日付に変換されました。これを、web.xmlでjavax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULLをtrueに設定して修正しました。しかし、これを行うことで、日付テキスト入力の問題を修正することしかできませんでした.h:selectManyListboxの動作は同じ方法です。 – Gabriel

+0

'h:selectOneMenu'で同じ動作が検出されました – Gabriel

答えて

0

見つけにくい解決策は、renderOptionというメソッドをコピーして再実装し、デフォルトのMenuRendererをオーバーライドすることです。

オリジナルのソースは、逆コンパイル(バージョン1.2_13)のようなものです。 実際に変更する必要のある行だけを貼り付けていることに注目してください。あなたはこのソリューションを使用する必要がある場合は、この方法の全内容をコピーする必要があります:

public class MenuRenderer extends HtmlBasicInputRenderer { 
    protected void renderOption(FacesContext context, UIComponent component, Converter converter, SelectItem curItem, Object currentSelections, Object[] submittedValues, HtmlBasicRenderer.OptionComponentInfo optionInfo) throws IOException { 
     (...) 
     Object valuesArray; 
     Object itemValue; 
     if (submittedValues != null) { 
      boolean containsValue = containsaValue(submittedValues); 
      if (containsValue) { 
       valuesArray = submittedValues; 
       itemValue = valueString; 
      } else { 
       valuesArray = currentSelections; 
       itemValue = curItem.getValue(); 
      } 
     } else { 
      valuesArray = currentSelections; 
      itemValue = curItem.getValue(); 
     } 
     (...) 
    } 
} 

私はこのようなCustomListboxRendererListboxRendererMenuRendererを拡張)作成:

public class CustomListboxRenderer extends ListboxRenderer { 
    @Override 
    protected void renderOption(FacesContext context, UIComponent component, Converter converter, SelectItem curItem, Object currentSelections, Object[] submittedValues, HtmlBasicRenderer.OptionComponentInfo optionInfo) throws IOException { 
     (...) 
     Object valuesArray; 
     Object itemValue; 
     if (submittedValues != null) { 
      valuesArray = submittedValues; 
      itemValue = valueString; 
     } else { 
      valuesArray = currentSelections; 
      itemValue = curItem.getValue(); 
     } 
     (...) 
    } 
} 

をして、顔に追加しました次の行を設定してください:

<render-kit> 
    <renderer> 
     <component-family>javax.faces.SelectMany</component-family> 
     <renderer-type>javax.faces.Listbox</renderer-type> 
     <renderer-class>CustomListboxRenderer</renderer-class> 
    </renderer> 
</render-kit>