3

私の見解StudentModelBeanでは、フォームに入力されたデータを保存するために使用しています。私のフォームのこの部分を考えてみましょう:

<h:selectManyCheckbox value="#{}">
<f:selectItem itemLabel="English" itemValue="English" />
    <f:selectItem itemLabel="Hindi" itemValue="Hindi" />
    <f:selectItem itemLabel="Telugu" itemValue="Telugu" />
</h:selectManyCheckbox>

私の要件は、選択した各アイテムの値を各オブジェクトのlanguageNameプロパティに格納する必要があることです。Languages最後に、それらをListオブジェクトに入れる必要があります。どうすればこれを達成できますか?

4

1 に答える 1

9

Languageオブジェクト全体を、使用可能なアイテムと選択したアイテムの両方として提供する必要があります。また、オブジェクトとConverterの間で変換するを作成する必要があります。これは、HTML出力とHTTPリクエストパラメータがすべてであるため必須です。LanguageStringString

オブジェクトLanguageに2つのプロパティがcodeありname、次のようなアプリケーションスコープのBeanがあるとします。

@ManagedBean
@ApplicationScoped
public class Data {

    private List<Language> languages;

    @PostConstruct
    public void init() {
        languages= new ArrayList<Language>();
        languages.add(new Language("en", "English"));
        languages.add(new Language("hi", "Hindi"));
        languages.add(new Language("te", "Telugu"));
        // ...
    }

    public List<Language> getLanguages() {
        return languages;
    }

}

次に、次のように使用できます。

<h:selectManyCheckbox value="#{bean.selectedLanguages}" converter="languageConverter">
    <f:selectItems value="#{data.languages}" var="language"
        itemValue="#{language}" itemLabel="#{language.name}" />
</h:selectManyCheckbox>

この豆で

@ManagedBean
@ViewScoped
public class Bean {

    private List<Language> selectedLanguages;

    // ...
}

そしてこのコンバーター

@FacesConverter("languageConverter")
public class LanguageConverter implements Converter {

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object object) {
        return ((Language) object).getCode();
    }

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String submittedValue) {
        List<Language> languages = (List<Language>) context.getApplication().evaluateExpressionGet(context.getELContext(), "#{data.languages}", List.class);

        for (Language language : languages) {
            if (language.getCode().equals(submittedValue)) {
                return language;
            }
        }

        return null;
    }

}
于 2012-05-09T17:56:31.983 に答える