2012-10-01 16 views
7

Sto costruendo un'applicazione web usando JSF/Primefaces. Ho bisogno di avere una classe "costanti", cioè una classe che consisterà di costanti. Queste costanti sono principalmente comandi di navigazione che verranno utilizzati in tutta l'applicazione. La ragione per cui sto facendo questo è di evitare di creare istanze di stringhe su una base ad-hoc.Avere una classe "costanti" in JSF

Come ottengo ciò, rendendo le costanti accessibili sia da backing bean che da file XHTML?

Ho provato a utilizzare @ApplicationScoped e ad utilizzare il modello Singleton (classe Singleton) ma non riesco a farlo funzionare a causa di problemi di ambito.

O forse sto solo usando l'approccio sbagliato. Qualsiasi idea/suggerimento è benvenuto.

+0

Perché non si dispone di una classe con 'public static final string page1 =" page1.xhtml "'. Ricorda che questa classe verrà utilizzata nei bean gestiti. Se intendi utilizzare uno qualsiasi di questi valori nel tuo codice JSF, puoi aggiungere @ApplicationScope alla classe e ai getter per le 'String' che utilizzerai. –

+0

Puoi spiegare con un esempio? – javaMS

risposta

12

Come ottengo ciò, rendendo le costanti accessibili sia da backing bean che da file XHTML?

In backing beans, è ovviamente facile. Poiché sono solo classi Java, non è diverso dal "normale" modo Java. È possibile utilizzare i campi enum se public static final. Nelle viste, questa è una storia diversa. Fino alla prossima versione 3.0, EL non supporta in alcun modo le costanti.

Suggerirei di usare enumerazioni poiché EL ha un supporto implicito per loro nei confronti tra stringhe. Non esegue alcuna verifica di sicurezza del tipo compiletime/runtime, ma è possibile utilizzare il nome enum come stringa. Per esempio.

<h:someComponent ... rendered="#{order.status == 'SHIPPING'}" /> 

Se preferite più codice di autoregolamentazione documentazione e un assegno di runtime (no, un assegno compiletime non è possibile), allora si potrebbe considerare l'utilizzo di OmniFaces<o:importConstants>.

<o:importConstants type="com.example.OrderStatus" /> 
<h:someComponent ... rendered="#{order.status == OrderStatus.SHIPPING}" /> 

Questo è solo IMO un po 'più maldestro. Il controllo runtime è comunque utile durante lo sviluppo. Un errore è facilmente controllato.

Nel prossimo EL 3.0 (JSR-341, parte di Java EE 7), è possibile fare riferimento alle costanti nello stesso modo. Vedi anche How to reference constants in EL? Questo richiede solo l'importazione programmatica delle costanti in quanto non esiste un tag JSP/Facelets standard per questo.

+0

Ho usato le enumerazioni e funzionano bene a livello di bean. Tuttavia, quando provo a usare omnifaces per importare l'enum, ottengo un'eccezione. La mia vista ha questo: e poi ho il comando public String add (Object object, Object command) {(...) NavigationHelper nh = (NavigationHelper); nel fagiolo L'eccezione è java.lang.NullPointerException – javaMS

+0

Ok, ho trovato il problema. Devo inserire nel blocco . L'avevo messo al di fuori di esso che ha portato a questa eccezione. Puoi spiegare cosa intendi per maldestro? – javaMS

+0

I tag devono essere posizionati all'interno della vista, non all'esterno. Se stai utilizzando un modello principale, puoi anche posizionarlo lì, in modo che non sia necessario ripeterlo su tutti i client del modello. "Impacciato" significa qui "non abbastanza semplice". Mi piace la semplicità. – BalusC

Problemi correlati