【问题标题】:JSF 2.0 - How to show in a label the text value of java enum?JSF 2.0 - 如何在标签中显示 java 枚举的文本值?
【发布时间】:2014-11-11 17:42:40
【问题描述】:

这是我在论坛上的第一篇文章。 我有一个带有标识符(值)和描述(文本)的 Java 枚举类。

CriteriExlusio.java:

public enum CriteriExclusio{
C1(1, "< 10"),
C2(2, "Low grade"),
C3(3, "Medium grade"),
C4(4, "High grade"),
C5(5, "> 250"),

private final int value;
private final String text;

private CriteriExclusio(int value, String text) {
    this.value = value;
    this.text = text;
}

public int getValue() { return value; }
public String getText() { return text; }    
}

还有控制器:

@Named(value = "auxCriteriExclusioController")
@ApplicationScoped
public class AuxCriteriExclusioController {   
    public CriteriExclusio[] getCriteriExclusio(){
        return CriteriExclusio.values();
    }
}

当我提交表单时,我在 selectonemenu 中正确加载了 values-text 并存储在 table (values-int) 中。

.xhtml

<h:selectOneMenu value="#{mbVCriteriExclusio.criteriExclusio.idCriteriExclusio}" id="cmbCriteriExclusio" required="true">
  <f:selectItem itemLabel="" itemValue=""></f:selectItem>
  <f:selectItems value="#{auxCriteriExclusioController.criteriExclusio}" var="respuestaCriterisExclusio" itemValue="#{respuestaCriterisExclusio.value}" itemLabel="#{respuestaCriterisExclusio.text}" />
</h:selectOneMenu> 

问题是当页面检索表中的数据时,我想在输出标签中显示文本(文本),该标签对应于存储在数据库中的值(值)。它更加用户友好,需要显示文本而不是数值。

我已经搜索并尝试了几个选项,但我无法检索文本。只恢复java枚举的C1、C2....等。

<p:outputLabel value="#{auxCriteriExclusioController.criteriExclusio[itemCriterisExclusio.idCriteriExclusio]}" />

例如如果在表格中保存了值3,则要显示的标签是“中等等级”

更新。数据表代码

<h:form id="frmExclos">
                        <p:growl id="mensajeGeneral3" sticky="false" showDetail="true"/>
                        <p:panel id="pnlCriteriExclusio" style="width: 425px" header="Criteris d'exclusió del pacient" widgetVar="pnlCriterisE">
                            <p:dataTable id="tblCriterisExclusioNia" var="itemCriterisExclusio" value="#{mbRCriteriExclusio.getCriterisExclusioNia(mbVMalignitatNia.personaAmbMalignitatNia.id)}" editable="true">
                                <p:ajax event="rowEdit" listener="#{mbRCriteriExclusio.onRowEdit}" update=":frmExclos:mensajeGeneral3" />
                                <p:ajax event="rowEditCancel" listener="#{mbRCriteriExclusio.onRowCancel}" update=":frmExclos:mensajeGeneral3"  />
                                        <p:column headerText="Criteri">
                                        <p:cellEditor>
                                            <f:facet name="output">
                                                <p:outputLabel value="#{itemCriterisExclusio.idCriteriExclusio}">
                                                  <f:converter converterId="criteriExclusioConverter"/>
                                                </p:outputLabel>
                                            </f:facet>
                                            <f:facet name="input">
                                                <h:selectOneMenu value="#{itemCriterisExclusio.idCriteriExclusio}" id="cmbCriteriExclusioEditat" required="true">
                                                    <f:selectItem itemLabel="" itemValue=""></f:selectItem>
                                                    <f:selectItems value="#{auxCriteriExclusioController.criteriExclusio}" var="respuestaCriterisExclusioEditar" itemValue="#{respuestaCriterisExclusioEditar.value}" itemLabel="#{respuestaCriterisExclusioEditar.text}" />
                                                </h:selectOneMenu> 
                                            </f:facet>
                                        </p:cellEditor>
                                    </p:column>
                                    <p:column headerText="Observacions">
                                        <p:cellEditor>
                                            <f:facet name="output"><h:outputText value="#{itemCriterisExclusio.comentaris}"></h:outputText></f:facet>
                                            <f:facet name="input"><p:inputText value="#{itemCriterisExclusio.comentaris}" label="Observacions"></p:inputText></f:facet>
                                        </p:cellEditor>
                                    </p:column>
                                    <p:column style="width:32px">
                                        <p:rowEditor />
                                    </p:column>
                                    <f:facet name="footer" >
                                        <p:commandButton update="@this" icon="ui-icon-plusthick" value="Afegir criteri" oncomplete="PF('dlgAddCriterisExclusio').show()"/>
                                    </f:facet>
                            </p:dataTable>
                        </p:panel>
                    </h:form> 

【问题讨论】:

  • 你没有错过 outputlabel EL 值中的 'text' 属性吗?尝试使用此
  • 我试过了,它没有正确链接文本值..还是谢谢..

标签: java jsf enums


【解决方案1】:

为什么不将完整的枚举值保存到mbVCriteriExclusio.criteriExclusio 中? JSF-2 会自动转换您的枚举值(请参阅this question)。

所以当你使用这个时:

<h:selectOneMenu value="#{bean.criteriExclusio}" required="true">
  <f:selectItem itemLabel="" itemValue="" noSelectOption="true"></f:selectItem>
  <f:selectItems value="#{valueProvider.criteriExclusio}" 
      var="crit" itemLabel="#{crit.text}" />
</h:selectOneMenu>

您可以使用CriteriExclusio 类型的bean.criteriExclusio 来显示这样的标签:

<h:outputLabel value="#{bean.criteriExclusio.text}" />

【讨论】:

    【解决方案2】:

    我无法保存在 bean 中,因为它是数据表中的迭代,并且值保存在数据表“var”参数中。

    最后我做了一个转换器。我不认为这是一个最佳解决方案,但它确实有效。

    @FacesConverter("criteriExclusioConverter")
    public class CriteriExclusioConverter implements Converter {
    
    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
          return null;
    
    }
    
    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
    
        String textCriteriExclusio;
    
        switch (value.toString()) {
            case "1":
                textCriteriExclusio = "< 10";
                break;
            case "2":
                textCriteriExclusio = "Low grade";
                break;
            case "3":
                textCriteriExclusio = "MEdium grade";
                break;
            case "4":
                textCriteriExclusio = "High grade";
                break;
            case "5":
                textCriteriExclusio = "> 250";
                break;
            default:
                textCriteriExclusio = "";
                break;
        }
    
    
        return textCriteriExclusio;
    
    
    }
    

    }

    【讨论】:

    • 嗯?这听起来像是最糟糕的解决方案,在转换器中重复您的枚举定义。你能用你提到的那个数据表编辑你的答案吗?我们或许可以帮助您找到更好的解决方案。
    【解决方案3】:

    使用表达式语言的另一种替代方法是使用 ViewHelper 模式。

    我建议您使用辅助方法创建一个新的HelperBean 来获取实际文本。

    @Named(value = "beanHelper")
    @ApplicationScoped
    public class BeanHelper {
       public String getCriteriText(int idCriteria){
          return auxCriteriExclusioController.getCriteriExclusio()[idCriteria].getText();
       }
    }
    

    并从 JSF 调用这个辅助方法:

    <p:outputLabel value="#{beanHelper.getCriteriText(itemCriterisExclusio.idCriteriExclusio)}"></p:outputLabel>
    

    【讨论】:

      【解决方案4】:

      助手对我不起作用。

      我的托管 bean 助手 MbADescripcionesHelper .java:

      @Named(value = "mbADescripcionesHelper")
      @ApplicationScoped
      public class MbADescripcionesHelper implements Serializable {
      
      @ManagedProperty(value = "#{auxCriteriExclusioController}")
      private AuxCriteriExclusioController auxCriteriExclusioController;
      
      public MbADescripcionesHelper() {
      }
      
      public String getCriteriText(int idCriteria) {
          return auxCriteriExclusioController.getCriteriExclusio()[idCriteria].getText();
      }
      
      public void setAuxCriteriExclusioController(AuxCriteriExclusioController auxCriteriExclusioController) {
          this.auxCriteriExclusioController = auxCriteriExclusioController;
      }
      }
      

      xhtml 行错误:

      <p:outputLabel value="#{mbADescripcionesHelper.getCriteriText(itemCriterisExclusio.idCriteriExclusio)}"></p:outputLabel>
      

      错误:

      错误渲染视图[/revisions/PendentsRevisar.xhtml] javax.el.E​​LException: PendentsRevisar.xhtml @76,145 value="#{mbADescripcionesHelper.getCriteriText(itemCriterisExclusio.idCriteriExclusio)}": java.lang.NullPointerException

      【讨论】:

        猜你喜欢
        • 2020-01-09
        • 2021-08-19
        • 1970-01-01
        • 2010-10-07
        • 1970-01-01
        • 2014-09-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多