1

这可能看起来很基本,但我是 JPA/Ebean 和 Play 框架的新手(顺便说一句,Java 不是那么新)。

我正在尝试制作两种形式。一个登录,一个注册。我正在使用 Play for Java MEAP (Early Access) 一书、官方网站文档和示例应用程序“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 中创建表单?所以我做了两个。这是我用来呈现页面的代码(它在控制器应用程序中)

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());
    }
}

我一定在这里做错了什么……有人能启发我吗?

4

1 回答 1

0

好的,对不起。我已经解决了我的问题。这是我处理类型不匹配问题的方法。事实证明,我应该直接使用模型中的 User 类,而不是创建新的嵌套类,例如“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() 调用吗?如果我使用我的 User 类来构造我的表单并调用 .hasErrors(),因为我没有'在 User 类中没有 validate() 方法,那么 Play 框架会调用什么来检查错误?对我来说是使用嵌套类更好还是应该直接使用模型中的类?

于 2013-09-08T16:51:59.490 回答