首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在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

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-11-23 00:16:12

JSF有一个用于enum的内置转换器,因此应该这样做:

代码语言:javascript
复制
@Named
@ApplicationScoped
public class Data {

    public Status[] getStatuses() {
        return Status.values();
    }

}

使用

代码语言:javascript
复制
<h:selectOneMenu value="#{bean.question.status}" >
    <f:selectItems value="#{data.statuses}" />
</h:selectOneMenu>

(注意:从JSF2.0开始,不再需要提供SelectItem[]List<SelectItem>__,也接受T[]List<T>,您可以通过var属性访问当前项)

如果您碰巧使用JSF实用程序库OmniFaces,那么您可以使用而不是bean。

代码语言:javascript
复制
<o:importConstants type="com.example.Status" />

<h:selectOneMenu value="#{bean.question.status}" >
    <f:selectItems value="#{Status}" />
</h:selectOneMenu>

如果您还想控制标签,可以将它们添加到Status枚举中:

代码语言:javascript
复制
public enum Status {

    SUBMITTED("Submitted"),
    REJECTED("Rejected"),
    APPROVED("Approved");

    private String label;

    private Status(String label) {
        this.label = label;
    }

    public String getLabel() {
        return label;
    }

}

使用

代码语言:javascript
复制
<f:selectItems value="#{data.statuses}" var="status"
    itemValue="#{status}" itemLabel="#{status.label}" />

或者,更好的做法是将枚举值设置为本地化资源包的属性键(需要EL 3.0 ):

代码语言:javascript
复制
<f:selectItems value="#{data.statuses}" var="status"
    itemValue="#{status}" itemLabel="#{text['data.status.' += status]}" />

在与资源束#{text}相关联的属性文件中

代码语言:javascript
复制
data.status.SUBMITTED = Submitted
data.status.REJECTED = Rejected
data.status.APPROVED = Approved
票数 219
EN

Stack Overflow用户

发布于 2012-04-06 04:21:25

对于本地化,我们也可以使用这个解决方案:

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

data.status.SUBMITTED=Submitted
data.status.REJECTED=Rejected
data.status.APPROVED=Approved

<h:selectOneMenu value="#{bean.question.status}" >
    <f:selectItems
        value="#{data.statuses}"
        var="status"
        itemValue="#{status}"
        itemLabel="#{text['data.status.'.concat(status)]}" />
</h:selectOneMenu>

因此本地化字符串的资源路径不是硬编码在Enum中的。

票数 16
EN

Stack Overflow用户

发布于 2011-11-22 23:54:33

您可以使用<f:selectItems value="#{carBean.carList}" />并返回包装枚举的SelectItem实例列表(使用Status.values()获取所有可能的值)。

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

https://stackoverflow.com/questions/8229638

复制
相关文章

相似问题

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