Java JSF2/Facelets:如何有效地使用Facelets统一编辑子类类型的实例

Java JSF2/Facelets:如何有效地使用Facelets统一编辑子类类型的实例,java,jsf-2,facelets,Java,Jsf 2,Facelets,为了便于讨论,假设我有以下经典层次结构: 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

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

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
中有一个车辆实例列表。如何支持统一编辑?我不知道如何避免这种代码:

<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设计的冒犯,OO设计似乎要求车辆本身以某种方式参与选择正确的视图,而不是检查视图并自行决定。我在代码中的很多地方都看到了这种模式,其中我有一个半异构的集合或对象上的属性,该对象必须是一个类或其子类的实例,我需要一个特殊的编辑器来公开子类的不同之处。看起来有点异味,我想问一下是否有更好的方法。

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