这可能看起来非常基础,但我是JPA / Ebean和Play Framework的新手(Java btw并不是那么新)。
我正在尝试制作两种形式。一个登录,一个登记。我正在使用Play for Java MEAP(早期访问),官方网站文档和示例应用程序“ZenTask”代码。我必须说Play强大,强大,但文档很差。我认为这必须与大多数Play用户有关,他们是经验丰富的Java Web开发人员,但仍然是!
我创建了一个名为User
的模型@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();
}
}
然后我有这个控制器应用程序
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;
}
}
}
我甚至不明白为什么我要创建两个嵌套类,但似乎需要在Play中创建表单?所以我做了两个。这是我用来呈现页面的代码(它在Controller Application中)
public static Result index() {
return ok(index.render(form(Login.class), form(Register.class)));
}
好的,现在这里是最令人沮丧的部分。首先,我不知道登录时是否真正对用户进行了身份验证:(应用程序中的代码)
/**
* 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());
}
}
其次,如何在用户注册时说出用户的信息。我从Java for Play书中复制了这些行,但它不起作用(我的IDE说它错了......类型不匹配)
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());
}
}
我一定在这里做过一些非常错误的事情。有人能开导我一点吗?
答案 0 :(得分:0)
OK ...对不起。我已经解决了我的问题。以下是我处理类型不匹配问题的方法。事实证明,我应该直接使用模型中的User类,而不是创建新的嵌套类,如“Login”和“Register”。
我将这些行添加到我的Application controller下的register()方法中。
User user = new User();
user.email = RegisterForm.get().email;
user.displayName = RegisterForm.get().displayName;
user.password = RegisterForm.get().password;
user.save();
我现在的问题是:“validate()方法是Play框架中的一个保留方法,默认情况下会从Form.hasErrors()调用吗?如果我使用我的User类来构造我的表单并调用.hasErrors (),因为我在User类中没有validate()方法,Play框架会调用什么来检查错误呢?对我来说,使用嵌套类或者我应该直接使用模型中的类更好吗?“强>