2013-05-10 113 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