【问题标题】:JSF validator with custom method带有自定义方法的 JSF 验证器
【发布时间】:2013-05-10 20:58:21
【问题描述】:

这是我的 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 设置名称的问题,并且它是应用程序所需要的。

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

【问题讨论】:

  • 你的 WaiterBean 的范围是什么?

标签: jsf methods validation


【解决方案1】:

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

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

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

看看JSF Lifecycle

【讨论】:

  • 所以您建议保持原样?我的意思是在操作方法中检查数据库中正确的 PIN 实现?
  • 是的,因为您所做的不仅是检查输入的有效性,而且还修改了您的 bean。你可以分别做这两个任务,验证器中的验证和 bean 中的修改 bean,导致两个选择查询,这对我来说似乎真的没有必要。
  • 好的,对我来说已经够清楚了。非常感谢。也许你也可以帮助我:stackoverflow.com/questions/16491317/jsf-outputlabel-clear
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-13
  • 2015-06-12
  • 1970-01-01
  • 2011-09-04
  • 2013-12-06
  • 2012-08-12
相关资源
最近更新 更多