我對JSF/Java非常陌生,但我想知道是否有人知道創建自定義驗證控制器的好方法。我的Web應用程序中有許多表單,其中重疊的字段如First Name,SSN或電子郵件。我想創建一個控制器來處理所有這些驗證和消息。JSF 2.0驗證控制器
這是個好主意嗎?我一直在尋找文檔,但它看起來像我發現他們把驗證方法放在一個特定的bean中,而不是在控制器中的每個例子。
任何示例/指向示例/建議的一個很好的方式來實現這樣的事情會很好。
我使用JSF 2.0
我對JSF/Java非常陌生,但我想知道是否有人知道創建自定義驗證控制器的好方法。我的Web應用程序中有許多表單,其中重疊的字段如First Name,SSN或電子郵件。我想創建一個控制器來處理所有這些驗證和消息。JSF 2.0驗證控制器
這是個好主意嗎?我一直在尋找文檔,但它看起來像我發現他們把驗證方法放在一個特定的bean中,而不是在控制器中的每個例子。
任何示例/指向示例/建議的一個很好的方式來實現這樣的事情會很好。
我使用JSF 2.0
我覺得下面的例子會爲你工作: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>
這不是正常的方法。您應該將控制任務委派給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>
JSF驗證的每個組件的基礎上確定的,最適用於阻止垃圾進入你的模型。避免嘗試使用它們來執行驗證,其中一個組件的值影響另一個組件的有效性。
如果您使用的是JEE6服務器,請查看JSR 303 Bean Validation。
2版本說明書的介紹了JSR 303 Bean驗證支持。如果包含JSF運行時的環境需要JSR 303 Bean驗證,則JSF 實現必須支持JSR 303 Bean驗證。目前唯一的這種環境是JSF包含在Java EE 6運行時中。
該規範繼續定義如何以及在哪些階段執行JSF生命週期bean驗證。
如果您想擁有多個驗證器/類,那麼該怎麼辦?
例如:
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);
}
}
}
感謝您的幫助=)
歡迎來到Stackoverflow!這似乎更多的是一個問題,而不是一個答案。如果您確實有疑問,請按右上方的「Ask Question」按鈕,而不是按下「發佈您的答案」按鈕:) – BalusC 2010-12-21 20:58:42
如果使用JSF> = 2.0,我建議BalusC方法,因爲你不必修改'面孔-配置。 xml'文件。但是,如果您堅持使用JSF <2.0,則需要執行上述操作。 – 2010-08-19 16:56:34