1

这是我的 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并且它是应用程序所需要的。

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

4

1 回答 1

2

您可以像这样从验证器访问会话范围的托管 bean:

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

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

看看JSF 生命周期

于 2013-05-10T21:44:25.367 回答