我有一个有趣的问题。我正在尝试在Play框架上实现基本的登录机制。但是,登录表单字段值没有正确地到达UserLogin类的validate()方法,它们在该方法中被视为null,尽管它们在bindFormRequest()方法中成功使用(我通过输出表单知道这个细节)对象到屏幕)。
我错过了一点吗?这是我的代码:
对于Application.java:
package controllers;
import play.*;
import play.mvc.*;
import play.data.DynamicForm;
import play.data.Form;
import static play.data.Form.form;
import views.html.*;
import models.*;
public class Application extends Controller {
public static Result index() {
return ok(index.render("Your new application is ready."));
}
public static Result login() {
if ( session().containsKey( "nickName") ) {
return redirect( routes.Application.mainMenu() );
}
else {
return ok( login.render( form( UserLogin.class) ) );
}
}
public static Result mainMenu() {
return ok( mainMenu.render() );
}
public static Result authenticate() {
Form<UserLogin> loginForm = form( UserLogin.class).bindFromRequest();
if ( loginForm.hasErrors() ) {
return badRequest( login.render( loginForm) );
}
else {
return ok( index.render( "S.A.") );
/*
session().clear();
session( "nickName", loginForm.get().nick);
return redirect( routes.Application.mainMenu() );
*/
}
}
public static Result registerMenu() {
if ( session().containsKey( "nickName") ) {
return redirect( routes.Application.mainMenu() );
}
else {
return ok( registrationForm.render( form( UserRegistration.class) ) );
}
}
public static Result registerUser() {
Form<UserRegistration> regForm = form( UserRegistration.class).bindFromRequest();
if ( regForm.hasErrors() ) {
return badRequest( registrationForm.render( regForm) );
}
else {
return redirect( routes.Application.login() );
}
}
public static class UserLogin {
public String nick;
public String pwd;
public String validate() {
System.out.println( nick + "-" + pwd);
return null;
/*
if ( User.auth( nick, pwd) ) {
return null;
}
else {
return "Invalid user or password!";
}
*/
}
}
public static class UserRegistration {
public String name;
public String pwd1;
public String pwd2;
public String nickName;
public String validate() {
if ( !( pwd1.equals( pwd2) ) ) {
return "The passwords must match!";
}
else {
if ( User.create( name, nickName, pwd1) != null ) {
return null;
}
else {
return "The given nick name is already in use, please choose a different one.";
}
}
}
}
}
对于User.java: 包模型;
import java.util.*;
import play.modules.mongodb.jackson.MongoDB;
import net.vz.mongodb.jackson.JacksonDBCollection;
import net.vz.mongodb.jackson.Id;
import net.vz.mongodb.jackson.ObjectId;
import net.vz.mongodb.jackson.WriteResult;
import org.codehaus.jackson.annotate.JsonProperty;
import com.mongodb.BasicDBObject;
import javax.persistence.*;
public class User {
@Id
@ObjectId
public String id;
public String name;
public String nickName;
public String pwd;
private static JacksonDBCollection<User, String> collection = MongoDB.getCollection( "users", User.class, String.class);
public User() {
}
public User( String name, String nickName, String pwd) {
this.name = name;
this.nickName = nickName;
this.pwd = pwd;
}
public static List<User> all() {
return User.collection.find().toArray();
}
public static String create( User user) {
BasicDBObject query = new BasicDBObject( "nickName", user.nickName);
if ( User.collection.find( query).toArray().size() == 0 ) {
WriteResult<User, String> insertion = User.collection.insert( user);
return insertion.getSavedId();
}
else {
return null;
}
}
public static String create( String name, String nickName, String pwd) {
BasicDBObject query = new BasicDBObject( "nickName", nickName);
/*
System.out.println( "Size = " + User.collection.find( query).toArray() );*/
if ( User.collection.find( query).toArray().size() == 0 ) {
User user = new User( name, nickName, pwd);
WriteResult<User, String> insertion = User.collection.insert( user);
return insertion.getSavedId();
}
else {
return null;
}
}
public static void delete( String id) {
User user = User.collection.findOneById( id);
if ( user != null) {
User.collection.remove( user);
}
}
public static boolean auth( String nickName, String pwd) {
//System.out.println( "NickName = " + nickName + ", Password = " + pwd);
BasicDBObject query = new BasicDBObject( "nickName", nickName).append( "pwd", pwd);
//System.out.println( "Size = " + User.collection.find( query).toArray().size() );
//System.out.println( User.collection.find().toArray() );
return ( User.collection.find( query).toArray().size() ) == 1;
}
public static int edit( String id, String name, String nickName, String pwd, String pwd2) {
User user = User.collection.findOneById( id);
if ( user != null) {
if ( pwd.equals( pwd2) ) {
User updated = new User( name, nickName, pwd);
User.collection.updateById( id, updated);
return 0;
}
else {
return 1;
}
}
else {
return 2;
}
}
public static void removeAll() {
User.collection.drop();
}
public String toString() {
return "{\"id\":\"" + id + "\", \"nickName\":\"" + nickName + "\", \"pwd\":\"" + pwd + "\", \"name\":\"" + name + "\"}";
}
}
最后,模板(login.scala.html):
@(form: Form[Application.UserLogin])
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" type="text/css" href='@routes.Assets.at( "stylesheets/bootstrap.min.css")' media="screen" />
<script src='@routes.Assets.at( "javascripts/jquery-1.9.0.min.js")'></script>
<title>Log In</title>
<meta http-equiv="Content-Type" value="text/html; charset=utf-8;" />
</head>
<body>
<div class="container">
@if( form.hasGlobalErrors) {
<div class="panel panel-danger" style="width: 400px; margin: auto; margin-top: 200px;">
<div class="panel-heading"><span class="glyphicon glyphicon-log-in"></span> @form.globalError.message</div>
}
@if( !( form.hasGlobalErrors) ) {
<div class="panel panel-primary" style="width: 400px; margin: auto; margin-top: 200px;">
<div class="panel-heading"><span class="glyphicon glyphicon-log-in"></span> Log In</div>
}
<div class="panel-body">
@helper.form( routes.Application.authenticate) {
<form>
<input type="text" name="nick" class="form-control" placeholder="nick_name" /><br />
<input type="password" name="pwd" class="form-control" placeholder="Password" /><br />
<button type="submit" class="btn btn-primary btn-lg btn-block">Log In</button>
<a class="btn btn-link" href="register">Register</a>
</form>
}
</div>
</div>
</div>
</body>
</html>
提前致谢;)
答案 0 :(得分:0)
我找不到像你浏览该页面那样的确切答案,但我必须在Application.java中实现这样的转变:
public static Result authenticate() {
Form<UserLogin> loginForm = form( UserLogin.class).bindFromRequest();
UserLogin op = new UserLogin();
op.nick = loginForm.field( "nick").value();
op.pwd = loginForm.field( "pwd").value();
System.out.println( );
if ( op.validate() == null ) {
session().clear();
session().put( "nickName", loginForm.field( "nick").value() );
return redirect( routes.Application.mainMenu() );
}
else if ( loginForm.hasErrors() ) {
return badRequest( login.render( loginForm) );
}
else {
session().clear();
session().put( "nickName", loginForm.field( "nick").value() );
return redirect( routes.Application.mainMenu() );
}
}