2012-05-15 7 views
5

Con JSF, fagioli Managed, & EL 2.2 so in generale che un'espressione della forma:JSF, EL, Managed Beans - Come dire quali sono le firme getter & setter?

#{bean.value} 

Sarà mappare ad un corrispondente insieme di funzioni in una classe bean gestito in questo modo:

@ManagedBean 
class Bean { 
    private String value; 
    public String getValue() { return value; } 
    public void setValue(String s) { value = s; } 
} 

e 'anche possibile ottenere e impostare le proprietà di una mappa:

#{bean.value['key']} 

Sostenuta da qualcosa come:

@ManagedBean 
class Bean { 
    private Map<String, Boolean> kvMap; 
    public boolean getValue(String key) { return kvMap.get(key); } 
    public void setValue(String key, boolean value) { kvMap.put(key, value); } 
} 

Fin qui tutto bene.

Sto trovando mentre trascorro più tempo con JSF, tuttavia sto cercando di scrivere blocchi di codice riutilizzabili. In particolare, piccoli blocchi di xhtml nei blocchi <ui:composition> che posso includere tramite <ui:include>. Per di più, molte delle cose più utili per me sono cose come set di caselle annidate (il nostro designer di UI è solo su di loro ;-), e lì <ui:repeat> diventa molto utile.

Invariabilmente, al fine di utilizzare <ui:repeat> e <ui:include> senza una quantità assurda di digitazione, ho usato pseudonimi, sia creati tramite <ui:param> o in linea con qualcosa come l'attributo var di <ui:repeat>.

Come ho scritto più UIComponents nidificati, in particolare le cose che ottengono i loro valori dalle mappe all'interno delle mappe, trovo sempre più difficile dedurre la firma del metodo setter corretta che JSF cercherà quando invierà un forma (per qualche motivo scrivere getter sembra essere più naturale).

La mia domanda per voi guru allora è:

C'è qualche modo per arrivare JSF a dirmi che cosa si aspetta una firma setter per assomigliare? Poiché JSF generalmente non si lamenta di un'espressione che si risolve in un solo getter (pensando che sia una proprietà di sola lettura), trovo che la mancanza di feedback sia frustrante e sembra che richieda un sacco di manipolazione con differenti firme di metodo prima che io finalmente colpito quella magia a destra uno.

Spero ci sia una tecnica, diciamo una query FacesContext ... in fase di esecuzione o guardando in qualche intermediario compilato come un file di classe che mi indirizza alla firma setter corretta per una proprietà profondamente annidata. Se c'è una cosa del genere, penso che mi risparmierebbe un sacco di tempo cercando di capire come ottenere un setter costruito per tentativi ed errori.

Spero di aver espresso chiaramente quello che sto cercando, grazie in anticipo per le vostre risposte.

+0

+1 per una domanda eccellente ... Penso che quello che io e te vogliamo entrambi è qualcosa come la finestra di visualizzazione prospettiva di debug di Eclipse ad eccezione delle espressioni JSF ed EL ad-hoc. Se non riusciamo a trovarlo, sembrerà un cattivo progetto per un plugin Eclipse open source! –

+0

Dopo aver postato questa domanda ho passato un po 'di tempo (ri) a leggere le specifiche EL 2.2 e sembra che ci siano eccellenti strutture nell'ELResolver e nelle sue controparti per creare alcuni buoni strumenti. Comunque dal vedere chiaramente che JSF non ha problemi nell'impostazione dei valori nelle espressioni Map, non importa quanto sembrino brutti (es. # {Blah.foo [nome] ['x'] [otherThing]}) Non so se ne vale la pena. Grazie per il +1 però :) – par

+0

'getValue (chiave di stringa)', 'setValue (chiave di stringa, valore booleano)' - Non penso che funzioni. Java Beans 1.01 specifica le proprietà indicizzate, ma le chiavi devono essere 'int'. –

risposta

6

Capisco che la tua domanda si riduce fondamentalmente a "Come dovrebbe apparire un setter per un Map?".

La risposta è semplice: non è necessario nessuno. EL utilizza il metodo put() nello stesso Map. Hai solo bisogno di fornire un getter per l'intero Map. Quando si ottengono i valori della mappa, EL utilizzerà il metodo get() dello stesso Map. Questo è tutto dietro le quinte fatte dall'integrato MapELResolver.

Quindi questo dovrebbe fare:

@ManagedBean 
class Bean { 
    private Map<String, Boolean> kvMap; 
    public Map<String, Boolean> getValue() { return kvMap; } 
} 

che è quello di essere utilizzato come #{bean.value['key']} o #{bean.value.key} se la chiave non contiene i periodi. Puoi semplicemente usarlo anche nei componenti di input.

<h:selectBooleanCheckbox value="#{bean.value.key}" /> 

Per quanto riguarda le attrezzature, beh, il plug-in strumenti di JBoss per Eclipse ha un buon supporto completamento automatico EL per JavaBeans normali, ma non può chiavi della mappa di completamento automatico. Ulteriore Eclipse ha le proprie strutture per la generazione automatica di proprietà dei bean insieme a getter e setter in base a un elenco o proprietà esistenti.

+0

Grazie BalusC, e purtroppo hai ragione, alla fine la mia domanda si riduce a come gestire i valori di impostazione sulle mappe, che hai già affrontato in diversi post e commenti su SO. Avevo un'espressione EL con alias molto complessa che ha afferrato una mappa in profondità all'interno di altre strutture dati e JSF * stava * impostando correttamente i suoi valori. Ho avuto un bug in un'altra routine che nascondeva il fatto che stava facendo il suo lavoro correttamente. :(Alla fine ho sottoclassato HashMap e overrode put() per convincermi che JSF stava impostando correttamente i valori, il che ha portato a trovare il mio bug. Grazie ancora! – par

+0

Prego. – BalusC