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上的属性