15

JSF+Seam でロケールを変更する最も一般的な方法の 1 つ - 以下を使用<h:selectOneMenu>:

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

ボタンでロケールの変更を実装したい。問題は、パラメーター (en、fr など) を渡して Bean を更新する方法<h:commandButton>です。多分<h:inputHidden>助けになるでしょうか?

4

1 に答える 1

30

メソッド引数として渡すか (環境が 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')}" />

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

または使用<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>

private String language;

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

または使用<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>

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

(JSF に a によって自動的に設定させることもできますが@ManagedProperty("#{param.language}")、これには Bean がリクエスト スコープである必要があります。または、ViewParam と @ManagedProperty(value = "#{param.id}")<f:viewParam>も参照してください)


ビューからコントローラーにパラメーターを渡すには十分な方法です。好きなのを選びな。は<h:inputHidden>、JSF コンテキストで多少異なる目的を果たしますonclick。これは、醜い JavaScript によってのみ操作できます。

于 2012-10-24T12:31:07.253 に答える