如何用JSF2处理多态?

时间:2010-11-12 15:38:46

标签: java jsf polymorphism jsf-2 java-ee-6

我需要显示/编辑多态实体。

我的抽象类是。 我的具体课程是 PhysicalPerson MoralPerson

每个具体类都有自己的自定义属性。

如何根据实体类使用适当的显示/编辑(复合)组件?

谢谢! :)

2 个答案:

答案 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>

然而,班级检查方法更为普遍。