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?
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
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
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) –