2013-09-08 2 views
1

Cela peut sembler très basique, mais je suis nouveau à JPA/Ebean et Play Framework (pas si nouveau avec Java btw).Confus au sujet de Play2 Form Submission (login/register)

J'essaie de faire deux formes. Un pour se connecter et un pour s'inscrire. J'utilise à la fois le livre Play for Java MEAP (Accès anticipé), la documentation du site officiel et l'exemple de code "ZenTask". Je dois dire que le jeu est fort, robuste, mais la documentation est si pauvre. Je comprends que cela doit avoir quelque chose à voir avec la plupart des utilisateurs de Play sont des développeurs Web Java chevronnés, mais quand même!

J'ai créé un modèle appelé utilisateur

@Entity 
@Table(name="account") 
public class User extends Model { 

    @Id 
    @Constraints.Required 
    @Formats.NonEmpty 
    public String email; 

    @Constraints.Required 
    public String displayName; 

    @Constraints.Required 
    public String password; 

    public static Model.Finder<String, User> find = new Model.Finder(String.class, User.class); 

    public static User authenticate(String email, String password) { 
    return find.where() 
      .eq("email", email) 
      .eq("password", password) 
      .findUnique(); 
    } 
} 

J'ai ce contrôleur d'application

public class Application extends Controller { 

    public static class Login { 
     @Constraints.Required 
     public String email; 
     public String password; 

     public String validate() { 
      if (User.authenticate(email,password)==null) { 
       return "Invalid email or password."; 
      } 
      return null; 
     } 
    } 

    public static class Register { 

     @Constraints.Required 
     public String email; 
     public String password; 
     public String cfmPassword; 
     public String displayName; 

     public String validate() { 
      if (cfmPassword.equals(password)) { 
       return "Passwords typed in does not match."; 
      } else if (displayName.contains(" ")) { 
       return "Display name cannot contain space"; 
      } 
      return null; 
     } 
    } 
} 

Je ne comprends même pas pourquoi je suis en train de créer deux classes imbriquées, mais il semble comme une exigence créer des formulaires dans Play? Alors j'en ai fait deux. Voici le code que j'utilise pour rendre la page (il est à l'intérieur du contrôleur d'application)

public static Result index() { 
    return ok(index.render(form(Login.class), form(Register.class))); 
} 

OK, est maintenant ici la partie la plus frustrée. Tout d'abord, je ne sais pas si je suis vraiment authentifié l'utilisateur lorsque vous êtes connecté: (codes dans la demande)

/** 
* Handle login form submission. 
*/ 
public static Result authenticate() { 
    Form<Login> loginForm = form(Login.class).bindFromRequest(); 
    if (loginForm.hasErrors()) { 
     return badRequest(index.render(loginForm, form(Register.class))); 
    } else { 
     session("email", loginForm.get().email); 
     return redirect(controllers.routes.Wall.index()); 
    } 
} 

Deuxièmement, comment puis-je dire les informations d'un utilisateur quand il/elle enregistre. Je copiais ces lignes de Java pour Play livre, mais il ne fonctionne pas (mon IDE dit qu'il est non-concordance wrong..type)

public static Result register() { 
    Form<Register> RegisterForm = form(Register.class).bindFromRequest(); 

    if (RegisterForm.hasErrors()) { 
     return badRequest(index.render(form(Login.class), RegisterForm)); 
    } else { 
     User user = RegisterForm.get(); 
     session("email", RegisterForm.get().email); 
     return redirect(controllers.routes.Wall.initiate()); 
    } 
} 

Je dois avoir fait quelque chose de vraiment quelqu'un here..can vraiment mal me éclairez un peu?

+0

1. Que voulez-vous dire que vous ne connaissez pas? loginForm.hasErrors() appelle validate() de votre classe Login, qui vérifie si l'utilisateur avec un tel email et mot de passe existe. – cosmolev

+0

2. Vous devriez avoir la méthode save() dans votre contrôleur. Il devrait lier registerForm à partir de la requête. Obtenez l'utilisateur. Et sauvez l'utilisateur. – cosmolev

+0

Ha! J'ai deviné la première question à droite! En fait, je ne peux même pas trouver quelque chose dans la documentation Play à ce sujet. Pour la seconde, j'ai essayé de lier registerForm ... et ce n'était pas très réussi (incompatibilité de type) –

Répondre

0

OK ... désolé. J'ai résolu mon problème. Voici comment j'ai géré le problème de discordance de type. Il s'avère que j'aurais dû utiliser la classe User du modèle directement au lieu de créer de nouvelles classes imbriquées telles que "Login" et "Register".

J'ajoute ces lignes dans ma méthode register() sous mon contrôleur d'application.

User user = new User(); 
user.email = RegisterForm.get().email; 
user.displayName = RegisterForm.get().displayName; 
user.password = RegisterForm.get().password; 
user.save(); 

Ma question est maintenant: méthode « est validate() une méthode réservée dans le cadre de lecture qui sera appelé par défaut de Form.hasErrors() Si j'utilise ma classe utilisateur pour construire ma forme et invoquer .hasErrors(), étant donné que je n'ai pas de méthode validate() dans User class, que va-t-il invoquer Play framework pour vérifier l'erreur? Est-il mieux pour moi d'utiliser une classe imbriquée ou devrais-je utiliser directement des classes?

+0

À mon humble avis, je ne vois pas de raisonnement fort pour utiliser les classes internes dans un cas général. Je construisais les formes directement à partir des modèles. – 2manyprojects

+1

Voilà ce que je ressens !! Merci, mais qu'arrivera-t-il si vous invoquez Form.hasErrors() lorsqu'une classe Model est utilisée? Quelle méthode (créée dans la classe de modèle) Play invoque pour valider vos données? –

+0

TL; DR: Form.hasErrors() continuera à fonctionner. Aucun, c'est automagique. Réponse longue: J'ai essayé de confirmer cela en regardant la source mais je ne l'ai pas encore trouvée, donc je suis en train de faire un WASG, mais je pense que la seule validation est basée sur les contraintes que vous avez mises les champs dans le modèle. (Les champs @Required ne sont pas NULL, les champs @Format ont un formatage conforme, etc) Je vais essayer de trouver une référence source, mais je peux dire que c'est ainsi que mon application semble fonctionner. – 2manyprojects