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

时间:2013-09-08 00:21:50

标签: playframework playframework-2.0 ebean

这可能看起来非常基础,但我是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());
    }
}

我一定在这里做过一些非常错误的事情。有人能开导我一点吗?

1 个答案:

答案 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框架会调用什么来检查错误呢?对我来说,使用嵌套类或者我应该直接使用模型中的类更好吗?“强>