0

大家好,我有这种情况:

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

<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 |

有任何想法吗 ????谢谢你 ....

4

2 回答 2

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. 在本地化的资源包文件中定义。

    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}" />
    

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


与具体问题无关,我会处理您的Java 命名约定part_status不是有效的属性名称。应该是partStatus

于 2013-03-20T13:58:03.213 回答
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...
}
于 2013-03-20T12:09:43.780 回答