2013-05-10 115 views
1

这是我的豆的片段:用自定义的方法JSF验证

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"; 
    } 
} 

这是验证豆:

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的setName。

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

+0

WaiterBean的范围是什么? – 2013-05-10 21:33:33

+0

它的SessionScope – 2013-05-10 21:35:01

回答

2

您可以访问会话范围的受管Bean会从验证程序是这样的:

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

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

看看JSF Lifecycle

+0

所以你建议离开它,因为它是?我的意思是在操作方法中检查数据库中正确的PIN工具? – 2013-05-10 21:55:32

+0

是的,因为你所做的不仅仅是检查输入的有效性,还要修改你的bean。你分别做了两个任务,在验证器中进行验证并在bean中修改bean,结果产生了两个对我来说真的没有必要的select查询。 – 2013-05-10 21:59:29

+0

好的,它对我来说足够清楚。非常感谢你。也许你也可以帮助我:http://stackoverflow.com/questions/16491317/jsf-outputlabel-clear – 2013-05-10 22:00:03