我需要显示/编辑多态实体。
我的抽象类是人。 我的具体课程是 PhysicalPerson 和 MoralPerson
每个具体类都有自己的自定义属性。
如何根据实体类使用适当的显示/编辑(复合)组件?
谢谢! :)
答案 0 :(得分:4)
EL中没有instanceof
这样的东西。但是,您可以(ab)使用Object#getClass()
并访问EL中Class
的getter。然后只需确定组件的rendered
属性中的结果。
<h:panelGroup rendered="#{entity.class.name == 'com.example.PhysicalPerson'}">
<p>According to Class#getName(), this is a PhysicalPerson.</p>
</h:panelGroup>
<h:panelGroup rendered="#{entity.class.simpleName == 'MoralPerson'}">
<p>According to Class#getSimpleName(), this is a MoralPerson.</p>
</h:panelGroup>
然而,自定义EL功能会更加干净。请注意,由于EL中允许的属性名限制极为严格,因此上述内容不适用于Tomcat 7和克隆。不再允许使用class
之类的Java保留文字。你需要#{entity['class'].name}
等等。
答案 1 :(得分:1)
另一种方法是在基类中创建一个抽象方法,它会返回一些你所拥有的实例的标记,并在你的子类中实现它,如下所示:
public abstract class Person {
public abstract boolean isPhysical();
}
public PhysicalPerson extends Person {
public boolean isPhysical() {
return true;
}
}
然后在jsf:
<h:panelGroup rendered="#{entity.physical}">
<p>this is a PhysicalPerson.</p>
</h:panelGroup>
<h:panelGroup rendered="#{ not entity.physical}">
<p>this is a Moral Person.</p>
</h:panelGroup>
然而,班级检查方法更为普遍。