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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (73)

我想创建一个selectOneMenu下拉列表,以便我可以在我的问题上选择一个状态。考虑如果枚举的顺序发生变化,并且列表很大,会发生什么情况,是否可以使f:selectItem更灵活?我能做得更好吗?是否有可能自动“选择”该问题的项目?

枚举类

public enum Status {
    SUBMITTED,
    REJECTED,
    APPROVED
}

问题实体

@Enumerated(EnumType.STRING)
private Status status;

JSF

<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>
提问于
用户回答回答于

JSF有一个内置的转换器enum,所以应该这样做:

@ManagedBean
@ApplicationScoped
public class Data {

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

}

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

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

<o:importConstants type="com.example.Status" />

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

如果你打算控制标签,你可以将它们添加到Status枚举中:

public enum Status {

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

    private String label;

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

    public String getLabel() {
        return label;
    }

}

<f:selectItems value="#{data.statuses}" var="status"
    itemValue="#{status}" itemLabel="#{status.label}" />

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

<f:selectItems value="#{data.statuses}" var="status"
    itemValue="#{status}" itemLabel="#{text['data.status.' += status]}" />

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

data.status.SUBMITTED = Submitted
data.status.REJECTED = Rejected
data.status.APPROVED = Approved
用户回答回答于

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

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中不是硬编码的。

所属标签

可能回答问题的人

  • 应用案例分享

    1 粉丝490 提问4 回答
  • uncle_light

    5 粉丝518 提问4 回答
  • 人生的旅途

    11 粉丝484 提问3 回答
  • Hyman.W

    15 粉丝0 提问3 回答

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动