2010-11-12 29 views
5

Potrzebuję wyświetlić/edytować polimorficzne byty.Jak radzić sobie z polimorfizmem z JSF2?

Moja abstrakcyjna klasa to Osoba. Moi konkretne zajęcia są PhysicalPerson i MoralPerson

Każda klasa betonu własnych niestandardowych atrybutów.

Jak mogę użyć odpowiedniego komponentu wyświetlania/edycji (złożonego) zgodnie z klasą encji?

Dzięki! :)

Odpowiedz

4

Nie ma czegoś takiego jak instanceof w EL. Możesz jednak (ab) użyć Object#getClass() i uzyskać dostęp do modułów pobierających z Class również w EL. Następnie określ wynik w atrybucie składnika 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> 

Niestandardowa funkcja EL będzie bardziej czyste, jednak. Zauważ, że powyższe nie działa na Tomcat 7 i klonach ze względu na bardzo restrykcyjne ograniczenia dozwolonych właściwości w EL. Java zastrzeżone literały, takie jak class, nie są już dozwolone. Będziesz potrzebował #{entity['class'].name} i tak dalej.

1

Innym sposobem jest stworzenie metody abstrakcyjne w klasie bazowej, która będzie zwracać ci znak co instancja masz, i wdrożyć go w swoim podklasy, tak:

public abstract class Person { 

public abstract boolean isPhysical(); 

} 

public PhysicalPerson extends Person { 

public boolean isPhysical() { 
    return true; 
} 

} 

a następnie w 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> 

Jednak podejście do sprawdzania klas jest bardziej uniwersalne.

+0

Oznacza to, że musisz dodać getter do interfejsu/klasy abstrakcyjnej za każdym razem, gdy tworzysz nową implementację 'Osoby'. Niezbyt przydatne. – BalusC

+0

atrybut boolean można zmienić na dowolny inny. ale zgadzam się, nie jest to najpiękniejsze rozwiązanie. –

Powiązane problemy