[英]JSF 2.0 validation controller
我對JSF / Java非常陌生,但是我想知道是否有人知道創建自定義驗證控制器的好方法。 我的Web應用程序中有很多表格,其中的字段重疊,例如名字,SSN或電子郵件。 我想創建一個控制器來處理所有這些驗證和消息。
這是一個好主意嗎? 我一直在網上尋找文檔,但似乎每個示例都發現他們將驗證方法放在特定的bean中而不是在控制器中。
任何示例/鏈接到示例/建議的實現此類良好方法的方法都很好。
我正在使用JSF 2.0
這不是正常的方法。 您應該將控制任務委托給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 。
根據JSF 2.0規范 :
規范的版本2引入了對JSR 303 Bean驗證的支持。 如果包含JSF運行時的環境要求JSR 303 Bean驗證,則JSF模擬必須支持JSR 303 Bean驗證。 當前,唯一的此類環境是Java EE 6運行時中包含JSF。
規范繼續定義了JSF生命周期bean驗證的方式和階段。
我認為以下示例將為您工作: http : //viralpatel.net/blogs/2009/02/javaserver-faces-jsf-validation-tutorial-error-handling-jsf-validator.html 。 它甚至以電子郵件地址驗證器為例。
例如,從該頁面:
通過實現Validator
接口編寫一個驗證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>
如果您想擁有多個驗證器/類怎么辦?
例如:
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);
}
}
}
感謝您的幫助=)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.