【问题标题】:How to store the data's selected in a selectManyCheckbox into different objects?如何将 selectManyCheckbox 中选择的数据存储到不同的对象中?
【发布时间】:2012-05-09 15:57:44
【问题描述】:

在我看来,我使用StudentModelBean 来存储表单中输入的数据。考虑一下我表单的这一部分:

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

我的要求是我需要将每个选定的项目值存储到每个Languages 对象的languageName 属性中。最后,我需要将它们放入 List 对象中。我怎样才能做到这一点?

【问题讨论】:

    标签: jsf jsf-2


    【解决方案1】:

    您需要提供整个Language 对象作为可用项和选定项。您还需要创建一个Converter,它在Language 对象和String 之间进行转换,这是强制性的,因为HTML 输出和HTTP 请求参数是一个和所有String

    假设您的Language 对象有两个属性codename,并且您有一个应用程序范围的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;
        }
    
    }
    

    【讨论】:

    • 谢谢巴鲁。这对我帮助很大。
    • evaluateExpressionGet 不适用于 JSF1.2 中的 List.class
    • @Beginner:更重要的是,整个 evaluateExpressionGet() 方法在 JSF 1.2 中不可用。它是在 JSF 2.0 中添加的。在寻找答案时,请注意寻找针对 JSF 1.x 的问题,而不是针对 JSF 2.x 的问题,否则您会陷入无尽的困惑。 JSF 1.x 和 2.x 是天壤之别。
    猜你喜欢
    • 2010-11-15
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多