2012-10-24 15 views
9

一個改變區域在JSF + Seam的最常用的方法 - 用<h:selectOneMenu>如何傳遞參數與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> 

我想要實現的按鈕區域的變化。所以,問題是 - 如何通過參數(en,fr等)來更新豆<h:commandButton>?也許<h:inputHidden>會有幫助嗎?

+0

爲什麼要發送值?提交表單時,Bean localeSelector上的方法setLanguage()將自動調用。 – santedicola

+0

你的''順便說一句,這是無效的JSF。你是從頭頂上寫下來的東西而不是副本嗎? @Sante:OP具體詢問如何只用一堆按鈕來做同樣的事情(因此,*沒有*下拉列表)。 – BalusC

回答

23

無論是作爲傳遞方法參數(僅當您的環境支持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}")


有足夠的方法將參數從視圖傳遞到控制器。拿你的選擇。 <h:inputHidden>在JSF上下文中有一個不同的用途,它只能由onclick中的JavaScript操作,這很醜陋。

+0

謝謝你的完整答案!我沒有利用EL 2.2,因爲Seam LocaleSelector類中沒有方法將locale作爲參數。我也試過,但它沒有工作,因爲參數不與localeSelector.language綁定(或者我在這些情況下丟失了一些東西?)。無論如何解決了我的問題 – Serga

+0

不客氣。我沒想到'#{localeSelector}'是一個Seam專有的bean(我沒有做Seam)。我只是假設完全控制自己的代碼的標準JSF。 – BalusC

+0

是的,我明白了 - 我應該在帖子中說清楚。我只是想澄清。再次感謝) – Serga