JSF验证器与自定义方法

时间:2013-05-10 20:58:21

标签: jsf methods validation

这是我的Bean片段:

public class WaiterBean extends Connector
{
    private String PIN;
    private String name = null;

    public void setPIN(String PIN)
    {
        this.PIN = PIN;
    }
    public String getPIN() 
    {
        return PIN;
    }
    public String getName() 
    {
        return name;
    }
    public String isPINCorrect(String PIN) 
    {
        try 
        {
            resultSet = statement.executeQuery(
                "SELECT name FROM dbo.waiters WHERE PIN=" + PIN);
            while(resultSet.next())
            {
                name = resultSet.getString("name"); 
            }
        } 
        catch (SQLException se) 
        {
            System.out.println(se.getMessage() + "**"
                + se.getSQLState() + "**" + se.getErrorCode());
        }
        if(name == null)
            return "invalid";
        else
            return "valid";
    }
}

这是验证器bean:

public class PINValidator implements Validator
{

    @Override
    public void validate(FacesContext fc, UIComponent uic, Object o) throws ValidatorException 
    {
        String PIN = o.toString();
        if(PIN.length() < 4)
        {
            FacesMessage msg = new FacesMessage("PIN too short");
            msg.setSeverity(FacesMessage.SEVERITY_ERROR);
            throw new ValidatorException(msg);
        }
    }
}

这就是我使用它的方式:

<h:form>
    <h:panelGrid columns="2">
        ENTER PIN
        <h:inputText id="PIN" maxlength="4" size="4" value="#{waiterBean.PIN}">
            <f:validator validatorId="com.jsf.PINValidator" />
        </h:inputText>
    </h:panelGrid>
    <h:message for="PIN"/> 
    <br />
    <h:commandButton value="SEND" action="#{waiterBean.isPINCorrect(waiterBean.PIN)}" />
    <br />
</h:form>

一切正常,但我认为将isPINCorrect方法包含在验证器类中是一种好习惯(我错了吗?)。我可以在验证器中实现该方法,但是我遇到了如何为WaiterBean设置名称的问题,并且它是应用程序所需的。

我该如何解决这个问题?或者另一个问题,我是否应该尝试解决它?

1 个答案:

答案 0 :(得分:2)

您可以从验证程序访问会话范围的托管bean,如下所示:

facesContext.getExternalContext().getSessionMap().get("waiterBean");

但我不认为这是您的最佳做法,因为验证者不应该修改数据,只应检查输入的有效性。在验证阶段,模型尚未更新的主要原因是,在验证器中修改bean会导致一些副作用。

查看JSF Lifecycle