2012-09-18 9 views
6

Come descritto in this question, provo a eseguire la convalida del campo in un modulo sul lato del bean di supporto. Per questo vorrei accedere ai campi violatori per contrassegnarli. Dalla ricerca sul web sembra che ci siano due modi per farlo:binding di componenti vs findComponent() - quando utilizzare quale?

  • memorizzare i componenti del backing bean per l'accesso e utilizzarli nelle pagine JSF tramite l'attributo binding.
  • Usa valore standard vincolanti nelle pagine JSF e quando ha bisogno di accedere ad un componente dal fagiolo, cercarlo tramite UIViewRoot.findComponent(String id)

Per quanto posso vedere entrambi i modi hanno svantaggi: associazione ai componenti soffia il backing bean con variabili e getter/setter, alcuni siti scoraggiano fortemente l'uso del binding di componenti. In ogni caso, si consiglia un ambito di richiesta. D'altra parte, findComponent() attraversa sempre l'albero, che può essere o non essere costoso, giusto? (Inoltre, al momento non riesco a trovare il mio componente, ma questo è un altro problema)

Quale sarebbe la strada da percorrere? Sono queste alternative intercambiabili e in caso contrario, in base a quali criteri hai scelto? Attualmente non ho abbastanza informazioni per prendere una decisione decente ...

+0

La stessa domanda in [questo altro forum] (http://www.jguru.com/forums/view.jsp?EID = 1522894 #), ma ahimè, nessuna risposta;) – Louise

risposta

8

Prima di tutto, indipendentemente dalla scelta, entrambi sono una pratica mediocre. Vedi anche How does the 'binding' attribute work in JSF? When and how should it be used?

Se si doveva fare la scelta, i collegamenti dei componenti sono decisamente più veloci ed economici. Rende logicamente completamente logico che una scansione ad albero eseguita da UIComponent#findComponent() abbia le sue implicazioni in termini di prestazioni.

Infatti, la backing bean tenendo le associazione ai componenti deve essere richiesta ambito, ma si potrebbe facilmente iniettare una diversa backing bean ambito tenendo la logica di business in essa @ManagedProperty.

Un approccio più pulito sarebbe quello di utilizzare uno Map come titolare di tutte le associazioni di componenti. Hai solo bisogno di aggiungere la seguente voce al faces-config.xml:

<managed-bean> 
    <managed-bean-name>components</managed-bean-name> 
    <managed-bean-class>java.util.HashMap</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
</managed-bean> 

Questo può solo essere utilizzato come

<h:inputSome binding="#{components.input1}" /> 
<h:inputSome binding="#{components.input2}" /> 
<h:inputSome binding="#{components.input3}" /> 

e questo può essere ottenuto in altri fagioli come

Map<String, UIComponent> components = (Map<String, UIComponent>) externalContext.getRequestMap().get("components"); 

In questo modo si non devi preoccuparti di specificare le singole proprietà/getter/setter. Nell'esempio sopra, Map conterrà tre voci con le chiavi input1, input2 e input3, ciascuna con l'istanza UIComponent corrispondente come valore.


Estranei alla questione concreta, ci può essere una soluzione molto più semplice al problema concreto come lei ha descritto in altra domanda che eseguire la convalida del metodo di azione (che in realtà è cattivo design). Ho postato una risposta laggiù.

+0

vuol dire che l'utilizzo di normali legami di proprietà non è una buona pratica. Dovremmo preferire i binding di componenti in questo caso? – benz

+0

Non intendevo implicarlo. Si dovrebbe preferire l'uso dei binding dei valori dei componenti, ma questa è fuori dalla tua domanda attuale, giusto? – BalusC

+0

Questo è corretto. Ho visto la domanda e ho pensato di chiedere. Farò una domanda a parte separatamente. – benz

Problemi correlati