3

我正在使用 2 个字符串映射。

  Map<String, String> offices;
  Map<String, String> services;

一张地图包含“办公室”,一张地图包含“提供的服务”。这些都是动态的,因为可以添加或删除新的办公室或服务。我的问题是如何成功地说明哪些办公室支持每项服务,以及最终如何捕捉到这一点。

这就是我希望它看起来的样子:

在此处输入图像描述

我的第一个问题是我无法弄清楚如何使用 PrimeFaces 或 JSF vanilla 来表示它。我一直在研究不同的东西,比如 DataTable,但它们似乎都说明了一个“标题”,而不是我需要的列和行标题。或者他们说明了如何复杂地显示数据,所有数据都来自一个列表或地图。我需要说明 2 个地图会聚。我相信我需要将这两个地图组合成一个中间列表,但我正在摸索细节。

我的第二个问题是如何捕获返回的布尔值?我想我需要捕获索引,但它的细节暗示了我。

编辑:代码和澄清:

  private Map<String, String> offices;

  public Map<String, String> getOffices() {
  return offices;
  }

//constructor
offices.put("PV001", "Pleasantville");
offices.put("GV001", "Green Valley");

然后在 JSF/XHTML 标记中:

<p:selectManyCheckbox>
    <f:selectItems value="#{myOffices.offices.entrySet()}"
        var="entry" itemLabel="#{entry.value}" itemValue="#{entry.key}" />
</p:selectManyCheckbox>

那么我将如何像这样 CROSS 2 Maps 并获得相关的复选标记。通常我只会创建一个带有 bodyWork、paint、oilChange 属性的 office 类,但不幸的是我需要能够动态调整这些属性的数量,这就是我使用 Map 的原因。

4

1 回答 1

2

至于布局,只需在<ui:repeat>. 使用常规 JSF 表组件确实不可能做到这一点。

<table>
    <thead>
        <tr>
            <th>Office</th>
            <ui:repeat value="#{bean.services.values().toArray()}" var="service">
                <th>#{service}</th>
            </ui:repeat>
        </tr>
    </thead>
    <tbody>
        <ui:repeat value="#{bean.offices.entrySet().toArray()}" var="office">
            <tr>
                <td>#{office.value}</td>
                <ui:repeat value="#{bean.services.keySet().toArray()}" var="service">
                    <td><p:selectBooleanCheckbox value="#{bean.officeServices[office.key][service]}" /></td>
                </ui:repeat>
            </tr>
        </ui:repeat>
    </tbody>
</table>

要修复外观,只需按照通常的方式添加一些 CSS。如有必要,应用与 PrimeFaces 用于其数据表/网格组件的相同 CSS 类名称,例如ui-datatable和兄弟。

至于捕获提交的值,请在以办公室 ID 和服务 ID 为键的属性上使用一堆<p:selectBooleanCheckbox>组件。Map<String, Map<String, Boolean>>下面是合适的 bean 的样子:

private Map<String, String> offices;
private Map<String, String> services;
private Map<String, Map<String, Boolean>> officeServices;

@PostConstruct
public void init() {
    offices = new LinkedHashMap<>();
    offices.put("o1", "office1");
    offices.put("o2", "office2");
    offices.put("o3", "office3");
    services = new LinkedHashMap<>();
    services.put("s1", "service1");
    services.put("s2", "service2");
    services.put("s3", "service3");
    officeServices = new HashMap<>();
    for (String office : offices.keySet()) {
        officeServices.put(office, new HashMap<String, Boolean>());
    }

}

public void submit() {
    for (Entry<String, Map<String, Boolean>> entry : officeServices.entrySet()) {
        String office = entry.getKey();
        Map<String, Boolean> services = entry.getValue();
        System.out.println(office + ": " + services);
    }
}

// 3 getters. No setters necessary.

<p:selectManyCheckbox>不是一个选项,因为您无法在每个单元格的基础上控制其渲染。

确保您使用最新的 Mojarra。已知旧版本存在与嵌套<ui:repeat>和 ajax 相关的错误。如果我是正确的,它固定在 2.1.14~2.1.17 左右。

于 2013-06-10T18:35:28.097 回答