2012-10-24 8 views
9

Einer der häufigsten Ansätze locale in JSF + Naht ändern - mit <h:selectOneMenu>:eines Parameters zusammen mit h weitergeben müssen: command

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

I locale Änderungen mit den Tasten implementieren möchten. Also, die Frage ist - wie man den Parameter (en, fr, etc.) übergeben, um die Bean mit <h:commandButton> zu aktualisieren? Vielleicht würde <h:inputHidden> helfen?

+0

Warum möchten Sie den Wert senden? Wenn das Formular gesendet wird, wird automatisch die Methode setLanguage() in Ihrem Bean localeSelector aufgerufen. – santedicola

+0

Ihre '' ist übrigens seltsam. Dies ist kein gültiger JSF. Hast du das von Kopf bis Kopf geschrieben anstatt etwas zu kopieren? @Sante: OP fragt konkret, wie man dasselbe mit nur ein paar Buttons machen kann (also * ohne * die Dropdown-Liste). – BalusC

Antwort

23

passieren Entweder als Methode Argument (nur wenn Ihre Umgebung unterstützt 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')}" /> 

mit

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

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

mit

private String language; 

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

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

mit

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

(Sie auch von einem @ManagedProperty("#{param.language}") JSF automatisch verwenden lassen gesetzt, aber dies erfordert die Bean-Anfrage zu sein Bereich, oder ein <f:viewParam>, siehe auch ViewParam vs @ManagedProperty(value = "#{param.id}"))


genügend Möglichkeiten, um einen Parameter von der Ansicht an den Controller zu übergeben. Treffen Sie Ihre Wahl. Die <h:inputHidden> dient im JSF-Kontext einem etwas anderen Zweck und kann nur durch JavaScript in der onclick manipuliert werden, was hässlich ist.

+0

Vielen Dank für die vollständige Antwort! Ich habe EL2 nicht genutzt, weil es in der Seam LocaleSelector-Klasse keine Methode gibt, die das Gebietsschema als Parameter akzeptiert. Ich habe auch versucht, , aber es hat nicht funktioniert, weil der Parameter nicht bind mit localeSelector.language (oder vielleicht fehlt mir etwas in diesen Fällen?). Anyway hat mein Problem gelöst – Serga

+0

Gern geschehen. Ich habe nicht erwartet, dass '# {localeSelector}' eine Seam-proprietäre Bean ist (ich mache keinen Seam). Ich habe einfach den Standard JSF mit voller Kontrolle über den eigenen Code angenommen. – BalusC

+0

Ja, ich habe das - ich sollte es in meiner Post klarstellen. Ich wollte nur klarstellen. Danke noch einmal) – Serga