2012-10-24 9 views
9

Uno degli approcci più comuni per cambiare locale in JSF + Seam - con <h:selectOneMenu>:Come passare un parametro con h: commandButton

<h:form action="#{localeSelector.select}" rendered="false"> 
    <h:selectOneMenu value="#{localeSelector.language}" onchange="submit()"> 
     <f:selectItem itemLabel="English" itemValue="en" /> 
     <f:selectItem itemLabel="Francais" itemValue="fr" /> 
    </h:selectOneMenu> 
</h:form> 

voglio implementare le modifiche delle impostazioni internazionali con bottoni. Quindi, la domanda è: come passare il parametro (en, fr, ecc.) Per aggiornare il bean con <h:commandButton>? Forse <h:inputHidden> sarebbe d'aiuto?

+0

Perché si desidera inviare il valore? Quando il modulo viene inviato, viene chiamato automaticamente il metodo setLanguage() sul tuo localizzatore di settore Bean. – santedicola

+0

Il tuo '' è strano. Questo non è valido JSF. Hai scritto questo da cima a capo o qualcosa invece di copypasting? @ Sante: OP sta chiedendo concretamente come fare lo stesso con solo un gruppo di pulsanti (quindi, * senza * l'elenco a discesa). – BalusC

risposta

23

Entrambi passano come metodo di argomento (solo se l'ambiente supporta EL 2.2),

<h:commandButton value="English" action="#{localeSelector.change('en')}" /> 
<h:commandButton value="Deutsch" action="#{localeSelector.change('de')}" /> 
<h:commandButton value="Français" action="#{localeSelector.change('fr')}" /> 

con

public void change(String language) { 
    locale = new Locale(language); 
    // ... 
} 

Oppure utilizzare <f:setPropertyActionListener>

<h:commandButton value="English" action="#{localeSelector.change}"> 
    <f:setPropertyActionListener target="#{localeSelector.language}" value="en" /> 
</h:commandButton> 
<h:commandButton value="Deutsch" action="#{localeSelector.change}"> 
    <f:setPropertyActionListener target="#{localeSelector.language}" value="de" /> 
</h:commandButton> 
<h:commandButton value="Français" action="#{localeSelector.change}"> 
    <f:setPropertyActionListener target="#{localeSelector.language}" value="fr" /> 
</h:commandButton> 

con

private String language; 

public void change() { 
    locale = new Locale(language); 
    // ... 
} 

o utilizzare <f:param>

<h:commandButton value="English" action="#{localeSelector.change}"> 
    <f:param name="language" value="en" /> 
</h:commandButton> 
<h:commandButton value="Deutsch" action="#{localeSelector.change}"> 
    <f:param name="language" value="de" /> 
</h:commandButton> 
<h:commandButton value="Français" action="#{localeSelector.change}"> 
    <f:param name="language" value="fr" /> 
</h:commandButton> 

con

public void change() { 
    locale = new Locale(FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("language")); 
    // ... 
} 

(si può anche lasciare JSF impostata automaticamente da un @ManagedProperty("#{param.language}"), ma questo richiede il fagiolo di essere richiesta scoped, o <f:viewParam>, vedere anche ViewParam vs @ManagedProperty(value = "#{param.id}"))


modi sufficiente per passare un parametro da vista controllore. Fai la tua scelta. Il <h:inputHidden> serve in contesto JSF uno scopo un po 'diverso e può essere manipolato solo da JavaScript nello onclick che è brutto.

+0

Grazie per la risposta completa! Non ho approfittato di EL 2.2 perché sembra che non ci sia alcun metodo nella classe Seam LocaleSelector che prende le impostazioni locali come parametro. Ho anche provato , ma non ha funzionato perché il parametro non era associato a localeSelector.language (o forse mi manca qualcosa in questi casi?). Comunque ha risolto il mio problema – Serga

+0

Prego. Non mi aspettavo che # # {localeSelector} 'fosse un bean proprietario di Seam (non lo faccio Seam). Ho appena assunto lo standard JSF con il pieno controllo del proprio codice. – BalusC

+0

Sì, l'ho capito - dovrei metterlo in chiaro nel mio post. Volevo solo chiarire. Grazie ancora) – Serga