如何与h:commandButton一起传递参数

时间:2012-10-24 12:09:23

标签: jsf jsf-2 seam parameter-passing

使用<h:selectOneMenu>更改JSF + Seam中区域设置的最常用方法之一:

<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等)以使用<h:commandButton>更新bean?也许<h:inputHidden>会有帮助吗?

1 个答案:

答案 0 :(得分:25)

作为方法参数传递(仅当您的环境支持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自动设置@ManagedProperty("#{param.language}"),但这需要bean作为请求作用域,或<f:viewParam>,另请参阅ViewParam vs @ManagedProperty(value = "#{param.id}"))< / em>的


有足够的方法将参数从视图传递到控制器。随便挑选。 <h:inputHidden>在JSF上下文中起作用的目的有些不同,它只能由onclick中的JavaScript操纵,这很丑陋。