2010-08-19 100 views
1

我對JSF/Java非常陌生,但我想知道是否有人知道創建自定義驗證控制器的好方法。我的Web應用程序中有許多表單,其中重疊的字段如First Name,SSN或電子郵件。我想創建一個控制器來處理所有這些驗證和消息。JSF 2.0驗證控制器

這是個好主意嗎?我一直在尋找文檔,但它看起來像我發現他們把驗證方法放在一個特定的bean中,而不是在控制器中的每個例子。

任何示例/指向示例/建議的一個很好的方式來實現這樣的事情會很好。

我使用JSF 2.0

回答

1

我覺得下面的例子會爲你工作:http://viralpatel.net/blogs/2009/02/javaserver-faces-jsf-validation-tutorial-error-handling-jsf-validator.html。它甚至還有一個電子郵件地址驗證程序作爲示例。

例如,從該頁面:

通過實現Validator接口寫驗證:

package net.viralpatel.jsf.helloworld; 

import javax.faces.application.FacesMessage; 
import javax.faces.component.UIComponent; 
import javax.faces.context.FacesContext; 
import javax.faces.validator.Validator; 
import javax.faces.validator.ValidatorException; 

public class EmailValidator implements Validator{ 
    public void validate(FacesContext context, UIComponent component, Object value) 
      throws ValidatorException { 

     String email = (String) value; 

     if(!email.contains("@")) { 
      FacesMessage message = new FacesMessage(); 
      message.setSeverity(FacesMessage.SEVERITY_ERROR); 
      message.setSummary("Email is not valid."); 
      message.setDetail("Email is not valid."); 
      context.addMessage("userForm:Email", message); 
      throw new ValidatorException(message); 
     } 
    } 
} 

然後,你需要在這個驗證的參考faces-config.xml中

 
    <validator> 
     <validator-id>emailValidator</validator-id> 
     <validator-class>net.viralpatel.jsf.helloworld.EmailValidator</validator-class> 
    </validator> 

然後,使用它!

 
<h:inputText id="Email" value="#{userBean.email}" required="true"> 
    <f:validator validatorId="emailValidator" /> 
</h:inputText> 
+0

如果使用JSF> = 2.0,我建議BalusC方法,因爲你不必修改'面孔-配置。 xml'文件。但是,如果您堅持使用JSF <2.0,則需要執行上述操作。 – 2010-08-19 16:56:34

6

這不是正常的方法。您應該將控制任務委派給FacesServlet。它的工作完美無缺。如果你想要的所有東西都是與託管bean的驗證,那麼只需創建一個獨立的類來實現javax.faces.validator.Validator。要使其自動加載,只需使用適當的@FacesValidator註釋標記它即可。

這裏有一個開球例如:

package com.example; 

import javax.faces.component.UIComponent; 
import javax.faces.context.FacesContext; 
import javax.faces.validator.FacesValidator; 
import javax.faces.validator.Validator; 
import javax.faces.validator.ValidatorException; 

@FacesValidator(value="ssnValidator") 
public class SSNValidator implements Validator { 

    @Override 
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException { 
     // Implement as you did originally in the bean method. 
    } 

} 

您可以在任何UIInput組件,如下聲明爲<f:validator>

<h:inputText value="#{bean.ssn}"> 
    <f:validator validatorId="ssnValidator" /> 
</h:inputText> 
2

JSF驗證的每個組件的基礎上確定的,最適用於阻止垃圾進入你的模型。避免嘗試使用它們來執行驗證,其中一個組件的值影響另一個組件的有效性。

如果您使用的是JEE6服務器,請查看JSR 303 Bean Validation

JSF 2.0 spec

2版本說明書的介紹了JSR 303 Bean驗證支持。如果包含JSF運行時的環境需要JSR 303 Bean驗證,則JSF 實現必須支持JSR 303 Bean驗證。目前唯一的這種環境是JSF包含在Java EE 6運行時中。

該規範繼續定義如何以及在哪些階段執行JSF生命週期bean驗證。

0

如果您想擁有多個驗證器/類,那麼該怎麼辦?

例如:

public class UserValidator implements Validator { 

    public void oneMoreValidator(FacesContext context, UIComponent component, Object value) 
      throws ValidatorException { 

     if(username.equals("erik") { 
      // some code here...   
      throw new ValidatorException("No Eriks is allowed here.."); 
     } 
    } 

    public void validate(FacesContext context, UIComponent component, Object value) 
      throws ValidatorException { 

     String email = (String) value; 

     if(!email.contains("@")) { 
      FacesMessage message = new FacesMessage(); 
      message.setSeverity(FacesMessage.SEVERITY_ERROR); 
      message.setSummary("Email is not valid."); 
      message.setDetail("Email is not valid."); 
      context.addMessage("userForm:Email", message); 
      throw new ValidatorException(message); 
     } 
    } 
} 

感謝您的幫助=)

+1

歡迎來到Stackoverflow!這似乎更多的是一個問題,而不是一個答案。如果您確實有疑問,請按右上方的「Ask Question」按鈕,而不是按下「發佈您的答案」按鈕:) – BalusC 2010-12-21 20:58:42