【问题标题】:JSF 2/Facelets: How to use facelets effectively for editing instances of subclassed types uniformlyJSF 2/Facelets:如何有效地使用 facelets 来统一编辑子类类型的实例
【发布时间】:2012-05-16 22:29:18
【问题描述】:

为了便于讨论,假设我有以下经典层次结构:

abstract class Vehicle {
  private int cost; 
  // imagine the usual getters and setters here
}

class Car extends Vehicle {
  private String make, model, year; 
  // getters and setters
}

class Plane extends Vehicle {
  private int yearIntroduced;
  // getter and setter
}

现在假设在我的支持 bean 中,我在 bb.vehicles 中有一个 Vehicle 实例的列表。如何支持统一编辑?我不明白如何避免这种代码:

<ui:repeat value="#{bb.vehicles}" var="vehicle">
  <!-- this is where the trouble begins -->
  <app:editCar      car="#{vehicle}"  rendered="#{test vehicle to see if it is a car}"/>
  <app:editPlane  plane="#{vehicle}"  rendered="#{test vehicle to see if it is a plane}"/>
</ui:repeat>

这似乎是对正确 OO 设计的侮辱,这似乎表明车辆本身应该以某种方式参与正确视图的选择,而不是视图检查它并自行决定。我在我的代码中的很多地方都看到了这种模式,其中我有一个半异构集合或一个对象上的一个属性,该对象必须是一个类或其子类之一的实例,我需要一个特殊的编辑器来公开什么使子类不同。好像有异味,想问问有没有更好的办法。

【问题讨论】:

    标签: java jsf-2 facelets


    【解决方案1】:

    一般来说,您的 backing bean 中可能应该有一些东西来包装车辆,并提供一个 xhtml 文件来包含以编辑该特定车辆类型(或者如果您愿意,也可以使用约定)。这样,您的 jsf 文件中就没有任何特定内容。只需使用 ui:include 并调用车辆支持 bean 上的属性。

    【讨论】:

      猜你喜欢
      • 2011-03-24
      • 1970-01-01
      • 2012-07-19
      • 1970-01-01
      • 2012-01-04
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多