PrimeFaces如何在p:datatable单元格中表示Label而不是value

时间:2013-03-20 12:04:55

标签: java jsf primefaces primefaces-extensions

我喜欢这个场景:

我正在使用primefaces数据表p:datatable,它从托管bean接收一个列表... 请查看此示例:并注意标题“status”

<p:datatable styleClass="table1" id="listTable" var="t" value="{testBean.elements}">
    <p:column headerText="Request No.">
       <h:outputText value="#{t.part_request_no}"></h:outputText>
    </p:column>
    <p:column headerText="Request No.">
       <h:outputText value="#{t.part_request_date}"></h:outputText>
    </p:column>
    <!--please pay attention here -->
    <p:column headerText="status">
        <h:outputText value="#{t.part_status}"></h:outputText>
    </p:column>
</p:datatable>

结果如下:这个

Request No.  | Request Date | Status |
    1        |   2013-02-02 |   1    |
    2        |   2013-01-01 |   2    |
    3        |  2013-4-23   |   5    |

我的问题是:代表1,2,5是一种耻辱。所以我更喜欢查看像

这样的状态
  • 1:新
  • 2:拒绝
  • 5:已取消。

我需要的结果

Request No.  | Request Date | Status   |
    1        |   2013-02-02 |   New    |
    2        |   2013-01-01 | Rejected |
    3        |   2013-4-23  | Canceled |

任何想法???? 谢谢....

2 个答案:

答案 0 :(得分:2)

根据您希望如何以及在何处维护状态代码和相关描述之间的映射,有几种方法。

  1. 在视图中硬编码。

    <h:outputText value="New" rendered="#{t.part_status == 1}" />
    <h:outputText value="Rejected" rendered="#{t.part_status == 2}" />
    <h:outputText value="Cancelled" rendered="#{t.part_status == 5}" />
    

  2. 在地图中硬编码。

    @ManagedBean
    @ApplicationScoped
    public class Data {
    
        private static final Map<Long, String> STATUSES = createStatuses();
    
        private static Map<Long, String> createStatuses() {
            Map<Long, String> statuses = new HashMap<Long, String>();
            statuses.put(1L, "New");
            statuses.put(2L, "Rejected");
            statuses.put(5L, "Cancelled");
            return Collections.unmodifiableMap(statuses);
        }
    
        public Map<Long, String> getStatuses() {
            return STATUSES;
        }
    
    }
    

    <h:outputText value="#{data.statuses[t.part_status]}" />
    

  3. 在loclaized资源包文件中定义。

    status.1 = New
    status.2 = Rejected
    status.5 = Cancelled
    

    <f:loadBundle basename="com.example.i18n.text" var="text" />
    ...
    <c:set var="statusKey" value="status.#{t.part_status}" />
    <h:outputText value="#{text[statusKey]}" />
    

  4. 在枚举中定义。

    public enum Status {
    
        New(1), Rejected(2), Cancelled(5);
    
        private int code;
    
        private Status(int code) {
            this.code = code;
        }
    
        public static Status of(int code) {
            for (Status status : values()) {
                if (status.code == code) {
                    return status;
                }
            }
            throw new IllegalArgumentException();
        }
    
        public int getCode() { 
            return code;
        }
    
    }
    

    并在填充模型期间

    t.setPart_status(Status.of(statusCode));
    

    然后只是在视图中

    <h:outputText value="#{t.part_status}" />
    

  5. 组合也可以。例如。枚举中的i18n标签。


    对具体问题

    无关,我会处理你的Java naming conventionspart_status不是有效的属性名称。它应该是partStatus

答案 1 :(得分:0)

为什么不在ManagedBean中创建一个方法来将其转换为您想要的标签?

<p:column headerText="status">
    <h:outputText value="#{testBean.getStatusLabel(t.part_status)}"/>
</p:column>

在ManagedBean上:

public String getStatusLabel(int code){
    // Do your thing here...
}