首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在f:selectItem(s)中使用枚举值

如何在f:selectItem(s)中使用枚举值
EN

Stack Overflow用户
提问于 2011-11-22 23:52:04
回答 4查看 92.8K关注 0票数 108

我想创建一个selectOneMenu下拉列表,这样我就可以选择我的问题的状态。有没有可能让f:selectItem更灵活,考虑到如果枚举的顺序改变了会发生什么,如果列表很大会发生什么?我能做得更好吗?是否有可能自动“选择”问题所具有的项目?

枚举类

代码语言:javascript
运行
复制
public enum Status {
    SUBMITTED,
    REJECTED,
    APPROVED
}

问题实体

代码语言:javascript
运行
复制
@Enumerated(EnumType.STRING)
private Status status;

JSF

代码语言:javascript
运行
复制
<div class="field">
    <h:outputLabel for="questionStatus" value="Status" />
    <h:selectOneMenu id="questionStatus" value="#{bean.question.status}" >
        <f:selectItem itemLabel="Submitted" itemValue="0" />
        <f:selectItem itemLabel="Rejected" itemValue="1" />
        <f:selectItem itemLabel="Approved" itemValue="2" />
    </h:selectOneMenu>
    <hr />
</div>
EN

Stack Overflow用户

发布于 2016-02-14 05:36:13

例如,您可以使用以下实用工具el函数来获取枚举值并在SelectOneMenu中使用它们。不需要创建bean和样板方法。

代码语言:javascript
运行
复制
public final class ElEnumUtils
{
    private ElEnumUtils() { }

    /**
     * Cached Enumerations, key equals full class name of an enum
     */
    private final static Map<String, Enum<?>[]> ENTITY_ENUMS = new HashMap<>();;

    /**
     * Retrieves all Enumerations of the given Enumeration defined by the
     * given class name.
     *
     * @param enumClassName Class name of the given Enum.
     *
     * @return
     *
     * @throws ClassNotFoundException
     */
    @SuppressWarnings("unchecked")
    public static Enum<?>[] getEnumValues(final String enumClassName) throws ClassNotFoundException
    {
        // check if already cached - use classname as key for performance reason
        if (ElEnumUtils.ENTITY_ENUMS.containsKey(enumClassName))
            return ElEnumUtils.ENTITY_ENUMS.get(enumClassName);

        final Class<Enum<?>> enumClass = (Class<Enum<?>>) Class.forName(enumClassName);

        final Enum<?>[] enumConstants = enumClass.getEnumConstants();

        // add to cache
        ElEnumUtils.ENTITY_ENUMS.put(enumClassName, enumConstants);

        return enumConstants;
    }
}

在taglib文件中将其注册为el函数:

代码语言:javascript
运行
复制
<function>
    <description>Retrieves all Enumerations of the given Enumeration defined by the given class name.</description>
    <function-name>getEnumValues</function-name>
    <function-class>
        package.ElEnumUtils
    </function-class>
    <function-signature>
        java.lang.Enum[] getEnumValues(java.lang.String)
    </function-signature>
</function>

最后,我们这样称呼它:

代码语言:javascript
运行
复制
<p:selectOneMenu value="#{bean.type}">
    <f:selectItems value="#{el:getEnumValues('package.BeanType')}" var="varEnum" 
        itemLabel="#{el:getEnumLabel(varEnum)}" itemValue="#{varEnum}"/>
</p:selectOneMenu>

与BalusC答案类似,您应该使用带有本地化枚举标签的资源包,并且为了使代码更简洁,您还可以创建像getEnumLabel(enum)这样的函数

票数 2
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8229638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档