2012-10-24 31 views
9

Một trong những phương pháp phổ biến nhất để thay đổi ngôn ngữ trong JSF + Seam - với <h:selectOneMenu>:Làm thế nào để vượt qua một tham số cùng với 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> 

Tôi muốn thực hiện những thay đổi miền địa phương với các nút. Vì vậy, câu hỏi là - làm thế nào để vượt qua các tham số (en, fr, vv) để cập nhật đậu với <h:commandButton>? Có lẽ <h:inputHidden> sẽ giúp ích?

+0

Tại sao bạn muốn gửi giá trị? Khi biểu mẫu được gửi, phương thức setLanguage() trên Bean localeSelector của bạn sẽ tự động được gọi. – santedicola

+0

'' của bạn theo cách lạ. Đây không phải là JSF hợp lệ. Bạn đã viết điều này từ đầu của đầu hoặc một cái gì đó thay vì copypasting? @Sante: OP là cụ thể yêu cầu làm thế nào để làm tương tự với chỉ một loạt các nút (do đó, * mà không có * danh sách thả xuống). – BalusC

Trả lời

23

Hoặc vượt qua như là đối số phương pháp (chỉ khi môi trường của bạn hỗ trợ 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')}" /> 

với

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

Hoặc sử dụng <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> 

với

private String language; 

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

Hoặc sử dụng <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> 

với

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

(bạn cũng có thể cho JSF tự động thiết lập nó bằng một @ManagedProperty("#{param.language}"), nhưng điều này đòi hỏi phải đậu được yêu cầu phạm vi hoặc <f:viewParam>, xem thêm ViewParam vs @ManagedProperty(value = "#{param.id}"))


Đủ cách để chuyển thông số từ chế độ xem sang bộ điều khiển. Bạn chọn đi. Các <h:inputHidden> phục vụ trong bối cảnh JSF một mục đích hơi khác nhau và nó chỉ có thể được thao tác bởi JavaScript trong onclick đó là xấu xí.

+0

Cảm ơn bạn đã trả lời đầy đủ! Tôi đã không tận dụng lợi thế của EL 2.2 bởi vì dường như không có phương thức nào trong lớp Seam LocaleSelector lấy locale làm tham số. Tôi cũng đã thử , nhưng nó đã không làm việc vì tham số không được ràng buộc với localeSelector.language (hoặc có lẽ tôi đang thiếu một cái gì đó trong những trường hợp này?). Dù sao đã giải quyết được vấn đề của tôi – Serga

+0

Bạn được chào đón. Tôi không mong đợi '# {localeSelector}' là một bean độc quyền của Seam (tôi không làm Seam). Tôi chỉ giả định JSF tiêu chuẩn hoàn toàn với toàn quyền kiểm soát mã riêng. – BalusC

+0

Có, tôi hiểu điều đó - tôi nên làm rõ trong bài đăng của mình. Tôi chỉ muốn làm rõ. Cảm ơn một lần nữa) – Serga

Các vấn đề liên quan