Playframework 对Play2表单提交感到困惑(登录/注册)

Playframework 对Play2表单提交感到困惑(登录/注册),playframework,playframework-2.0,ebean,Playframework,Playframework 2.0,Ebean,这可能看起来很基本,但我对JPA/Ebean和Play框架不太熟悉(顺便说一句,Java并不太新) 我试着做两种形式。一个登录,一个注册。我正在使用书籍PlayforJavaMEAP(早期访问)、官方网站文档和示例应用程序“ZenTask”代码。我必须说游戏很强大,很健壮,但是文档太差了。我明白这一定与大多数Play用户都是经验丰富的Java Web开发人员有关,但仍然如此 我创建了一个名为User的模型 @Entity @Table(name="account") public class U

这可能看起来很基本,但我对JPA/Ebean和Play框架不太熟悉(顺便说一句,Java并不太新)

我试着做两种形式。一个登录,一个注册。我正在使用书籍PlayforJavaMEAP(早期访问)、官方网站文档和示例应用程序“ZenTask”代码。我必须说游戏很强大,很健壮,但是文档太差了。我明白这一定与大多数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();
    }
}
我甚至不明白为什么要创建两个嵌套类,但似乎需要在游戏中创建表单?所以我做了两个。这是我用来呈现页面的代码(在控制器应用程序内部)

好了,现在是最沮丧的部分。首先,我不知道登录时是否对用户进行了真正的身份验证:(应用程序中的代码)

/**
*处理登录表单提交。
*/
公共静态结果验证(){
Form loginForm=Form(Login.class).bindFromRequest();
if(loginForm.hasErrors()){
返回badRequest(index.render(loginForm,form(Register.class));
}否则{
会话(“电子邮件”,loginForm.get().email);
返回重定向(controllers.routes.Wall.index());
}
}
第二,当用户注册时,我如何说出用户的信息。我从Java for Play book中复制了这些行,但它不起作用(我的IDE说它错了..类型不匹配)

公共静态结果寄存器(){
Form RegisterForm=Form(Register.class).bindFromRequest();
if(registerPerform.hasErrors()){
返回badRequest(index.render(form(Login.class)、RegisterForm));
}否则{
User=RegisterForm.get();
会话(“电子邮件”,RegisterForm.get().email);
返回重定向(controllers.routes.Wall.initiate());
}
}

我一定是做错了什么事……谁能给我点启发吗?

好的……对不起。我已经解决了我的问题。下面是我如何处理类型不匹配问题的。事实证明,我应该直接使用模型中的用户类,而不是创建新的嵌套类,如“Login”和“Register”

我将这些行添加到我的应用程序控制器下的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()调用该方法?如果我使用我的用户类构造表单并调用.hasErrors(),因为我没有validate())在用户类中,什么将播放框架调用来检查错误?我最好使用嵌套类还是直接使用模型中的类?

1。你不知道是什么意思?hasErrors()调用Login类的validate(),该类检查具有此类电子邮件和密码的用户是否存在。2。控制器中应该有save()方法。它应该从请求绑定registerForm。获取用户。并保存用户。哈!我猜对了第一个问题!事实上,我甚至在剧本文档中找不到关于这件事的任何东西。对于第二种情况,我尝试绑定registerForm…但并不是很成功(类型不匹配)。根据您的解释,我不知道类型不匹配发生在哪一行。您正在返回badRequest(index.render(form(Login.class)、RegisterForm))。可能应该是badRequest(index.render(RegisterForm(Register.class))。抱歉,cosmolev.User User=RegisterForm.get()不匹配,因为RegisterForm.get()返回一个寄存器类,但User是一个用户(model)class.IMHO,在一般情况下,我看不到使用内部类的有力理由。我会直接从模型中构建表单。这就是我的感受!!谢谢,但是如果使用模型类时调用Form.hasErrors(),会发生什么?Play调用哪个方法(在模型类中创建)来验证数据?TL;DR:Form.hasErrors()将继续工作。没有,这是automagic。详细回答:我试图通过查看源代码来确认这一点,但还没有确定,所以我只是制作了一个WASG,但我认为唯一的验证是基于您对模型中的字段施加的约束。(@Required字段不为null,@Format字段具有兼容的格式,等等)我将尝试查找源引用,但我可以说这就是我的应用程序的工作方式。我同意使用模型类时,Form.hasErrors()检查约束。当我的控制器中有一个子类带有“validation()”时方法,它实际上继续并调用了这个方法..所以我想知道它是否是由诸如validate之类的保留字实现的。无论如何,谢谢:)
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());
    }
}
 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());
    }
}
User user = new User();
user.email = RegisterForm.get().email;
user.displayName = RegisterForm.get().displayName;
user.password = RegisterForm.get().password;
user.save();