2013-04-20 38 views
3

我想创建一个基于播放框架示例'zentask'的登录页面。播放框架:表单数据不通过

当我尝试在登录页面提交表单时,user_name和user_pass为空。

命令提示符输出:

[info] play - database [default] connected at jdbc:mysql://localhost/smgts2 
[info] play - Application started (Dev) 
null null 

Application.java:

package controllers; 

import play.*; 
import play.mvc.*; 
import play.data.*; 
import static play.data.Form.*; 

import models.*; 
import views.html.*; 

public class Application extends Controller { 

    // -- Authentication 

    public static class Login { 

     public String user_name; 
     public String user_pass; 

     public String validate() { 
      if(Accounts.authenticate(user_name, user_pass) == null) { 
       return "Invalid user or password"; 
      } 
      return null; 
     } 

    } 

    /** 
    * Login page. 
    */ 
    public static Result login() { 
     return ok(
      login.render(form(Login.class)) 
     ); 
    } 

    /** 
    * Handle login form submission. 
    */ 

    public static Result authenticate() { 
     Form<Login> loginForm = form(Login.class).bindFromRequest(); 
     if(loginForm.hasErrors()) { 
      return badRequest(login.render(loginForm)); 
     } else { 
      session("user_name", loginForm.get().user_name); 
      return redirect(
       routes.Home.index() 
      ); 
     } 
    } 

    /** 
    * Logout and clean the session. 
    */ 

    public static Result logout() { 
     session().clear(); 
     flash("success", "You've been logged out"); 
     return redirect(
      routes.Application.login() 
     ); 
    } 
} 

login.scala.html

@(form: Form[Application.Login]) 

@main(Html("School Management System")) { 
    <style type="text/css"> 
    body { 
      padding-top: 60px; 
      padding-bottom: 40px; 
      background-color: #f5f5f5; 
    } 
    </style> 

    @helper.form(routes.Application.authenticate, 'class -> "form-signin") { 

      <h2 class="form-signin-heading">Sign-in to SMGTS</h2> 

      @if(form.hasGlobalErrors) { 
       <p class="text-error"> 
        @form.globalError.message 
       </p> 
      } 

      @if(flash.contains("success")) { 
       <p class="text-success"> 
        @flash.get("success") 
       </p> 
      } 

      <p> 
       <input type="text" class="input-block-level" name="user_name" placeholder="Username" value='@form("user_name").value'> 
      </p> 
      <p> 
       <input type="password" class="input-block-level" name="user_pass" placeholder="Password"> 
      </p> 
      <p> 
       <button class="btn btn-large btn-primary" type="submit">Sign in</button> 
      </p> 


} 
} 

routes文件:

# Routes 
# This file defines all application routes (Higher priority routes first) 
# ~~~~ 

# Home page 
GET /       controllers.Home.index() 

# Authentication 
GET  /login      controllers.Application.login() 
POST /login      controllers.Application.authenticate() 
GET  /logout      controllers.Application.logout() 

# Map static resources from the /public folder to the /assets URL path 
GET  /assets/*file    controllers.Assets.at(path="/public", file) 

Accounts.java(模型类):

package models; 

import java.util.*; 
import javax.persistence.*; 

import play.db.ebean.*; 
import play.data.format.*; 
import play.data.validation.*; 

import com.avaje.ebean.*; 

@Entity 
@Table(name="user_account") 
public class Accounts extends Model { 

    @Id 
    @Constraints.Required 
    public Long acc_id; 

    @Constraints.Required 
    @Formats.NonEmpty 
    public String user_name; 

    @Constraints.Required 
    @Formats.NonEmpty 
    public String user_pass; 

    @Constraints.Required 
    public int group_id; 

    // Queries 

    public static Finder<Long,Accounts> find = new Finder<Long,Accounts>(Long.class, Accounts.class); 

    public static Accounts authenticate(String user_name, String user_pass) { 

     System.out.println(user_name + " " + user_pass); // Check if form data is passed. 

     return find.where() 
      .eq("user_name", user_name) 
      .eq("user_pass", user_pass) 
      .findUnique(); 

    } 

} 

I've been checking if the variable names in Application.java and they're the same with the input fields in login.scala.html. 
+0

凡在你的代码,你把像'Logger.debug()'或'是System.out.print()'产生''为和user_name''user_pass null'值'。当我尝试上面提供的代码时,它似乎很好。在'login'形式提交非''null'值后,它不会产生'null'值。 – 2013-04-21 00:42:47

+0

对不起,我发布了错误的代码。重新编辑我的帖子。 我在'Accounts.java' - >'public static Accounts authenticate'模型类中插入''System.out.println(“user_name +”“user_pass”);''。 我仍然试图编辑代码,在字段中输入admin/admin,但我最终仍然在输出中有空值。 – Jigs 2013-04-21 01:11:16

+0

我已经将它上传到github的回购站中,如果它能让它更容易。这里是链接:https://github.com/gscruz/smgts2-git – Jigs 2013-04-21 01:12:34

回答

14

尝试运行起到清洁。它应该神奇地修复它!

+0

谢谢!它的工作,这真的很奇怪。 – Jigs 2013-07-09 05:25:22

+0

还要确保窗体试图膨胀的字段是公开的..花了几个小时弄清楚。 – toidiu 2015-02-07 08:01:58

0

我在通读“Play for Java”一书时偶然发现了同样的问题。我正在使用Play 2.5.x,并且这些示例使用了2.2.x.经过几个小时的搜索解决方案,与其他示例相比,我终于找到了解决方案:

缺少模型类中的setter和getters。

当我添加getters和setters后,表单数据终于通过了。

替代解决方案:PlayEnhancer