簡體   English   中英

JSF 2.0驗證控制器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM