play framework: http requests : server : get(),post(),put() - 无法理解它是如何工作的

play framework: http requests : server : get(),post(),put() - can't understand how it works

太棒了,我环顾四周并试图了解 'http' 请求是如何工作的...我尝试了一些方法,但我失败了 'with flying colors'(好的,很抱歉). 我想我在理解一切如何运作时遇到问题....

例如...我有这个注册表:

@(page: String, isLoggedIn: Boolean, userInfo: NewUser)

@import bootstrap3._

@Main(page, isLoggedIn, userInfo) {

    <script src='@routes.Assets.at("javascript/index.js")'></script>
    <br><br><br>

   <br>
    <form action="@routes.Application.addUser()" method="POST">

    <div class="col-md-offset-1 col-md-4">
    <h3><b>Register : </b></h3>
    <br>
    Username :
    <input type="input" name="username" class="form-control"><br>
    First Name :
    <input type="input" name="first_name" class="form-control"><br>
    Last Name :
    <input type="input" name="last_name" class="form-control"><br>
    Password:
    <input type="password" name="password" class="form-control"><br>
    Repeat Password : 
    <input type="password" name="re_password" class="form-control"><br>
    <input type="submit"  class="btn">
    </div>

    </form>

}

使用此模型:

...
public class NewUser extends Model{

    @Id
    public String Id;

    public String username;
    public String first_name;
    public String last_name;
    public String password;
    public String re_password;

 +getters and setters

}

我想创建一种方法,使用我的服务器将用户添加到我的数据库中...

 public static Result addUser(){

      String url = "http://localhost/my-server-url";      
      NewUser user = Form.form(NewUser.class).bindFromRequest().get();


//    ? String charset = "ISO-8859-1";
//   ?  WSRequest wsRequest = WS.url(url);

//   ? HttpResponse wsResponse = wsRequest.post();
//    ? String responseString = wsResponse.getString(charset);
}

************ 现在怎么办……!? - 服务器如何知道如何填充我的数据库? (我认为 url 在这里有帮助......注册表单应该具有与我的数据库相同的结构?) ********* 或者我怎样才能告诉他从列表中的数据库中给我一些东西(例如)?


谁能解释一下这一切是如何运作的!? 非常感谢...

How does the server know how to fill my database?the register form should have the same structure like my DB?

Play 包含几种不同的 bind() 方法。其中一些支持 JSON 或请求值,其他 Map<String, String[]> 个实例。它们都在内部指向 public Form<T> bind(Map<String,String> data, String... allowedFields) 方法。正如这个方法的名字所暗示的那样,它负责处理提交的数据。这意味着在这个方法里面我们可以找到一个片段:

接收数据规范化(将无序数据转换为解释对象,在本例中为 DataBinder 实例):

DataBinder dataBinder = null;
Map<String, String> objectData = data;
if(rootName == null) {
    dataBinder = new DataBinder(blankInstance());
} else {
    dataBinder = new DataBinder(blankInstance(), rootName);
    objectData = new HashMap<String,String>();
    for(String key: data.keySet()) {
        if(key.startsWith(rootName + ".")) {
            objectData.put(key.substring(rootName.length() + 1), data.get(key));
        }
    }
}

所以行

Form.form(NewUser.class).bindFromRequest() 

在您的控制器中创建一个 NewUser 类型的表单对象并将请求内部映射到 NewUser 对象字段,如上所示 code.So 表单字段名称应与您的实体字段名称,以便持久保存在数据库中。

And what now ... !?

现在做了之后

 NewUser user = Form.form(NewUser.class).bindFromRequest().get();

在你的控制器中你必须通过做

来阻止这个实体
user.save();

它会被保存在database.You也可以将这个对象发送给你模型调用那里的保存方法。

How can i tell him to give me back something from the data base in a list (for example)?

假设你必须找到所有保存在数据库中的新用户。所以你可以通过

获取列表
public static Finder<Integer, Member> find = new Finder(Integer.class, NewUser.class);
public static List<NewUser> all(){
        return find.all();
    }

在您的模型中 class 并在您的控制器中调用此 all() 方法。

您随时可以从您下载的文件夹中提供的游戏 samples 中获得帮助。

注意:我在这里假设您使用的是默认的游戏规则,即 ebean

Source1 Source2