更新
这通常可以通过隐藏的输入字段来完成。根据this的说法,隐藏输入的渲染方式有两种,但我更喜欢最简单的一种:
<input type="hidden" name="hiddenData" value="@data" />
在服务器端,您可以从 HashMap filledForm.data().get("hiddenData") 或通过常规数据绑定机制获取数据。
由于您的数据是不确定的,您可以更改输入控件上的名称和值或将 HashMap 作为data 传递。它将像这样呈现:value="{A=B, B=B}" 并且在服务器端您将收到 HashMap。
要通过 GET 发送请求,您需要使用通过 GET 在路由文件中访问的控制器,如下所示:
@helper.form(routes.Application.doLoginGetMethod)
通用表格
Play 框架通常缺少许多重要功能的文档,但至少它在安装文件夹中有示例。 %PLAYINSTALLFODLER%\samples\java\forms 就是你所需要的。
文档在这里:Play framework Forms (Scala)Server side(Java),Templates
无论如何,想法很简单 - 您可以使用相同的表单 API 在客户端和服务器端处理表单。
首先创建 pojo 来存储数据。验证和视觉调优所需的属性:
public static class Login
@Required
@Email
public String email;
@Required
@MinLength(5)
public String password;
}
第二,你需要创建你的表单——它是无状态的,所以可以重复使用。将其传递给您的视图:
public static final Form<Login> LOGIN_FORM = form(Login.class);
...
public static Result login() {
return ok(loginView.render(LOGIN_FORM));
}
在您的模板上使用来自views.html.helper 的helpers api 来呈现表单和控件。有很多:checkbox、select、options、textarea 和 others。
@(loginForm: Form[_])
@import helper._
...
@helper.form(routes.Application.doLogin) { // this differ from original login method
@if(loginForm.hasGlobalErrors) { // example of validation and form data
<p class="error">
@loginForm.globalError.message</span>
</p>
}
@inputText( // Notice the helper
loginForm("email"),
'_showConstraints -> false,
'_label -> "Your email"
)
@inputPassword( // Another helper
loginForm("password"),
'_showConstraints -> true,
'_label -> "Password"
)
<input type="submit" value="Login"> // submit button
}
然后在服务器端接收表单:
public static Result doLogin() {
final Form<Login> filledForm = LOGIN_FORM.bindFromRequest();
// User did not fill everything properly
if (filledForm.hasErrors()) return badRequest(login.render(filledForm));
return Controller.redirect("Hey!");
}
当然你需要路线:
GET /login controllers.Application.login
POST /login controllers.Application.doLogin