2013-05-10 2 views
1

C'est le fragment de mon Bean:validateur JSF avec méthode personnalisée

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

C'est haricot validateur:

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

Et voilà comment je l'utilise:

<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> 

Tout fonctionne bien, mais je pense que c'est une bonne pratique d'inclure la méthode isPINCorrect dans la classe de validateur (ai-je tort?). Je peux implémenter la méthode dans le validateur, mais ensuite j'ai un problème comment setName pour le WaiterBean et c'est nécessaire pour l'application.

Comment résoudre le problème? Ou une autre question, devrais-je même essayer de le résoudre?

+0

Quelle est la portée de votre WaiterBean? –

+0

c'est SessionScope –

Répondre

2

Vous pouvez accéder à une session SCOPED gérée par le bean d'un validateur comme celui-ci:

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

Mais je ne pense pas que ce soit la meilleure pratique dans votre cas, car un validateur ne devrait pas modifier les données, devrait seulement vérifier la validité de l'entrée. La raison principale de ceci lors de la phase de validation du modèle n'est pas encore mise à jour, et la modification de votre bean dans le validateur peut provoquer des effets secondaires.

Jetez un oeil à JSF Lifecycle

+0

donc vous suggérez de le laisser tel quel? Je veux dire vérifier la base de données pour le bon code PIN dans la méthode d'action? –

+0

Oui, parce que ce que vous faites n'est pas seulement de vérifier la validité de l'entrée, mais aussi de modifier votre bean. Vous pouvez faire les deux tâches séparément, valider dans le validateur et modifier le bean dans le bean, ce qui entraîne deux requêtes select qui me semblent vraiment inutiles. –

+0

Ok, c'est assez clair pour moi. Merci beaucoup. Peut-être que vous pouvez également m'aider avec ceci: http://stackoverflow.com/questions/16491317/jsf-outputlabel-clear –

Questions connexes