2008-11-24 30 views
37

Trong JSF/app Facelets của tôi, đây là một phiên bản đơn giản của một phần của hình thức của tôi:Làm thế nào để hiển thị lỗi ứng dụng của tôi trong JSF?

<h:form id="myform"> 
    <h:inputSecret value="#{createNewPassword.newPassword1}" id="newPassword1" /> 
    <h:message class="error" for="newPassword1" /> 
    <h:inputSecret value="#{createNewPassword.newPassword2}" id="newPassword2" /> 
    <h:message class="error" for="newPassword2" /> 
    <h:commandButton value="Continue" action="#{createNewPassword.continueButton}" /> 
</h:form> 

Tôi muốn để có thể gán một lỗi đến một h cụ thể: Thẻ thông điệp dựa trên một cái gì đó xảy ra trong phương thức continueButton(). Các lỗi khác nhau cần được hiển thị cho newPassword và newPassword2. Trình xác thực sẽ không thực sự hoạt động, bởi vì phương thức sẽ cung cấp kết quả (từ DB) được chạy trong phương thức continueButton() và quá đắt để chạy hai lần.

Tôi không thể sử dụng thẻ h: messages vì ​​trang có nhiều địa điểm tôi cần để hiển thị các thông báo lỗi khác nhau. Khi tôi thử điều này, trang hiển thị bản sao của mọi thư.

tôi đã cố gắng này như một đoán tốt nhất, nhưng không có may mắn:

public Navigation continueButton() { 
    ... 
    expensiveMethod(); 
    if(...) { 
    FacesContext.getCurrentInstance().addMessage("newPassword", new FacesMessage("Error: Your password is NOT strong enough.")); 
    } 
} 

tôi thiếu gì? Bất kỳ trợ giúp sẽ được đánh giá cao!

Trả lời

22

Trong trường hợp ai đó tò mò, tôi đã có thể tìm ra điều này dựa trên tất cả các câu trả lời của bạn được kết hợp!

này nằm trong Facelet:

<h:form id="myform"> 
    <h:inputSecret value="#{createNewPassword.newPassword1}" id="newPassword1" /> 
    <h:message class="error" for="newPassword1" id="newPassword1Error" /> 
    <h:inputSecret value="#{createNewPassword.newPassword2}" id="newPassword2" /> 
    <h:message class="error" for="newPassword2" id="newPassword2Error" /> 
    <h:commandButton value="Continue" action="#{createNewPassword.continueButton}" /> 
</h:form> 

này nằm trong phương pháp continueButton():

FacesContext.getCurrentInstance().addMessage("myForm:newPassword1", new FacesMessage(PASSWORDS_DONT_MATCH, PASSWORDS_DONT_MATCH)); 

Và nó hoạt động! Cảm ơn đã giúp đỡ!

1

Tìm thấy this trong khi Googling. Bài thứ hai làm cho một điểm về các giai đoạn khác nhau của JSF, có thể khiến thông báo lỗi của bạn bị mất. Ngoài ra, hãy thử null thay cho "newPassword" bởi vì bạn không có bất kỳ đối tượng nào với id newPassword.

+0

Tôi biết rằng nó không bị mất vì các h: thẻ thông điệp spits ra lỗi tốt ... Tôi chỉ không biết làm thế nào để cân bằng tỉ số lỗi để một h: thẻ thông điệp cụ thể. Thay đổi id cũng không giúp được gì. –

2

JSF là một con thú. Tôi có thể bị thiếu một cái gì đó, nhưng tôi sử dụng để giải quyết vấn đề tương tự bằng cách tiết kiệm thông điệp mong muốn để một tài sản của đậu, và sau đó hiển thị các tài sản thông qua một outputText:

<h:outputText 
    value="#{CreateNewPasswordBean.errorMessage}" 
    render="#{CreateNewPasswordBean.errorMessage != null}" /> 
+0

Tôi có thể xem cách thức này sẽ hoạt động, nhưng phải có một cách duyên dáng hơn để xử lý các thông báo lỗi! –

+0

Tôi phải thừa nhận rằng tôi đã giải quyết cùng một điều khi tôi không thể kết bạn với h: (các) thư và giàu: tin nhắn –

1

tôi đã cố gắng này như một đoán tốt nhất , nhưng không may mắn:

Có vẻ phù hợp với tôi. Bạn đã thử đặt mức độ nghiêm trọng của thư một cách rõ ràng chưa? Ngoài ra tôi tin rằng ID cần phải giống với một thành phần (tức là, bạn cần phải sử dụng newPassword1 hoặc newPassword2, nếu đó là ID của bạn và không phải newPassword như bạn đã có trong ví dụ).

FacesContext.getCurrentInstance().addMessage("newPassword1", 
        new FacesMessage(FacesMessage.SEVERITY_ERROR, "Error Message")); 

Sau đó sử dụng <h:message for="newPassword1" /> để hiển thị thông báo lỗi trên trang JSF.

6

Bạn cũng phải bao gồm FormID trong lệnh gọi hàm addMessage().

FacesContext.getCurrentInstance().addMessage("myform:newPassword1", new FacesMessage("Error: Your password is NOT strong enough.")); 

Điều này cần thực hiện thủ thuật.

Trân trọng.

55

FacesContext.addMessage(String, FacesMessage) đòi hỏi của phần ClientId, khôngid. Nếu bạn băn khoăn tại sao, hãy nghĩ đến việc có một điều khiển như là một con của một DataTable, dán các giá trị khác nhau với cùng một điều khiển cho mỗi hàng - nó sẽ có thể có một thông điệp khác nhau được in cho mỗi hàng. id luôn giống nhau; clientId là duy nhất trên mỗi hàng.

Vì vậy, "myform: mybutton" là giá trị chính xác, nhưng khó mã hóa điều này là không đúng. Một tra cứu sẽ tạo ra ít sự kết nối giữa khung nhìn và logic nghiệp vụ và sẽ là một cách tiếp cận hoạt động trong các môi trường hạn chế hơn như các portlet.

<f:view> 
    <h:form> 
    <h:commandButton id="mybutton" value="click" 
     binding="#{showMessageAction.mybutton}" 
     action="#{showMessageAction.validatePassword}" /> 
    <h:message for="mybutton" /> 
    </h:form> 
</f:view> 

Managed Logic đậu:

/** Must be request scope for binding */ 
public class ShowMessageAction { 

    private UIComponent mybutton; 

    private boolean isOK = false; 

    public String validatePassword() { 
     if (isOK) { 
      return "ok"; 
     } 
     else { 
      // invalid 
      FacesMessage message = new FacesMessage("Invalid password length"); 
      FacesContext context = FacesContext.getCurrentInstance(); 
      context.addMessage(mybutton.getClientId(context), message); 
     } 
     return null; 
    } 

    public void setMybutton(UIComponent mybutton) { 
     this.mybutton = mybutton; 
    } 

    public UIComponent getMybutton() { 
     return mybutton; 
    } 
} 
+0

Đọc OP, mô hình trình xác thực không thể áp dụng cho điều này tình hình. –

+0

Các nội dung khác về cách sử dụng clientIds: http://illegalargumentexception.blogspot.com/2009/02/jsf-working-with-component-ids.html – McDowell

+0

@StudioWorks - _UIComponent_ trường hợp là các đối tượng phạm vi yêu cầu; nó sẽ là một rò rỉ phạm vi để tiêm nó vào một đối tượng phạm vi phiên. – McDowell

3

Hãy nhớ rằng:

FacesContext context = FacesContext.getCurrentInstance(); 
context.addMessage(null, new FacesMessage("The message to display in client"));    

cũng là hợp lệ, bởi vì khi rỗng được quy định như tham số đầu tiên, nó được áp dụng cho toàn bộ hình thức .

Thông tin thêm: coreservlets.com // lỗi thời

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