Java主要面对如何在xhtml上显示来自数据库的int值的enum名称



情况就是这样,我真不知道该怎么办。
我想用jpa和enum持久化月份,其中月份将持久化为相应的int值。我读了很多类似的问题,我知道关于序数和字符串和@枚举的意见,但我想使用这个自定义int值,我决定这样做:

public enum Months {        
    January(1),
    February(2),
    March(3),
    April(4),
    May(5),
    Jun(6),
    July(7),
    August(8),
    September(9),
    October(10),
    November(11),
    December(12);
    private int intValue;
    private Months(int v) {
        this.intValue = v;
    }
    public int getIntValue() {
        return intValue;
    }
    // Mapping month to int
    private static final Map<Integer, Months> mapMonth = new HashMap<Integer, Months>();
    static
    {
        for (Months m : Months.values())
            mapMonth.put(m.intValue, m);
    }
    //Get month from int
    public static Months getMonthName(int v)
    {
        Months m = mapMonth.get(Integer.valueOf(v));
        return m;
    }
}
@Transient
private transient Months month; //actual enum; not stored in db
@Column(name="month")  
private int monthInt; // enum int value gets stored in db

因此,我保留了int属性intMonth并在xhtml中使用标签之类的enum名称

<h:outputText value="* #{bundle.month}: " />  
                <h:selectOneMenu 
                    value="#{adminMembershipBean.membership.monthInt}"
                    panelStyle="width:150px"  
                    effect="fade" 
                    var="m" 
                    style="width:160px"
                    filter="true" 
                    filterMatchMode="startsWith">  
                    <f:selectItem itemLabel="Select One" itemValue="" />  
                    <f:selectItems 
                        value="#{adminMembershipBean.months}" 
                        var="months" 
                        itemLabel="#{months}" 
                        itemValue="#{months.intValue}"/> 
                    <p:column>  
                        #{m} 
                    </p:column>  
                </h:selectOneMenu>
顺便说一下,这里有一个附加问题:
为什么p:selectOneMenu不显示枚举名称?我知道这是一个问题,一个解决方案是使用h:selectOneMenu,但我没有primefaces风格的组合框。所以,现在我在我的数据库中,例如4和xhtml四月,这是好的。
但是,当我想从数据库中读取其他xhtml上的4时,我无法获得April,我得到空单元格(这里是从p:datatable中提取的):
<p:column sortBy="#{membership.monthInt}">
<f:facet name="header">
<h:outputText value="#{bundle.month}" />
</f:facet>
<h:outputText value="#{membership.month.getMonthName(membership.monthInt)}"/>
</p:column>

如果我把

membership.monthInt

我得到4。
所以,主要问题如何显示月名,即enum名称?
谢谢你的宝贵时间。

它是开箱即用的。我用枚举和质面做了一个简单的例子。

bean:

@ManagedBean
@ViewScoped
public class MonthEnumBean
{
    private Months month;
    private int monthInt;
    private String monthString;
    public MonthEnumBean()
    {
        monthInt = 12;
    }
    public Months[] getMonths()
    {
        return month.values();
    }
    public Months getMonth()
    {
        return month;
    }
    public void setMonth(Months month)
    {
        this.month = month;
    }
    public int getMonthInt()
    {
        return monthInt;
    }
    public void setMonthInt(int monthInt)
    {
        this.monthInt = monthInt;
    }
    public Months getMonthString()
    {
        return month.getMonthName(monthInt);
    }
}

示例页面:

<h:form>
    <p:dataTable id="month" var="month" value="#{monthEnumBean.months}">
        <p:column id="modelHeader" exportable="true">
            <f:facet name="header">
                <h:outputText value="Month Name" />
            </f:facet>
            <h:outputText value="#{month}" />
        </p:column>
        <p:column>
            <f:facet name="header">
                <h:outputText value="Int " />
            </f:facet>
            <h:outputText value="#{month.intValue}" />
        </p:column>
    </p:dataTable>
    <p:panel>
    <p:selectOneMenu value="#{monthEnumBean.month}">
        <f:selectItem itemLabel="Select One" itemValue="" />
        <f:selectItems value="#{monthEnumBean.months}" var="month" itemLabel="#{month}" itemValue="#{mont.intValue}" />
    </p:selectOneMenu>
    </p:panel>
    <p:commandButton value="Submit" update="@form" oncomplete="dlg.show()" />
    <p:dialog header="Selected Values" modal="true" widgetVar="dlg">
        <h:panelGrid columns="1" id="display">
            <h:outputText value="Name: #{monthEnumBean.month}" />
            <h:outputText value="Intvalue: #{monthEnumBean.month.intValue}" />
        </h:panelGrid>
    </p:dialog>
    <p:panel>
        <p:panelGrid columns="3">
            <h:outputText value="Number from database: #{monthEnumBean.monthInt }" />                   
            <h:outputText value="String name of number from database: #{monthEnumBean.monthString}" />
        </p:panelGrid>
    </p:panel>
</h:form>

最新更新