2010-11-12 12 views
5

Devo visualizzare/modificare entità polimorfiche.Come gestire il polimorfismo con JSF2?

La mia classe astratta è Persona. mie classi concrete sono PhysicalPerson e MoralPerson

Ogni classe concreta ha gli attributi proprio personalizzato.

Come è possibile utilizzare il componente di visualizzazione/modifica appropriato (composito) in base alla classe di entità?

Grazie! :)

risposta

4

Non esiste una cosa come instanceof in EL. È tuttavia possibile (ab) utilizzare Object#getClass() e accedere ai getter di Class anche in EL. Quindi basta determinare il risultato nell'attributo rendered del componente.

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

Un'usanza funzione EL sarebbe più pulito però. Nota che quanto sopra non funziona su Tomcat 7 e cloni a causa di restrizioni estremamente restrittive dei nomi proprietà consentiti in EL. I valori letterali riservati Java come class non sono più consentiti. Avresti bisogno di #{entity['class'].name} e così via.

1

Un altro modo è quello di creare un metodo astratto in una classe base, che restituirà qualche segno di ciò esempio che hai, e implementare nei vostri sottoclassi, in questo modo:

public abstract class Person { 

public abstract boolean isPhysical(); 

} 

public PhysicalPerson extends Person { 

public boolean isPhysical() { 
    return true; 
} 

} 

e poi in 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> 

Tuttavia, l'approccio di controllo di classe è più universale.

+0

Ciò implicherebbe che è necessario aggiungere un getter all'interfaccia/classe astratta ogni volta che si crea una nuova implementazione di 'Persona'. Non molto utile. L'attributo booleano – BalusC

+0

può essere modificato in qualsiasi altro. ma sono d'accordo, non la soluzione più bella. –

Problemi correlati