谁能给我一个简单表格的例子,当给定一个简单的对象时,您可以点击保存并知道它具有保存对象所需的所有数据(包括id?)
使用在这里找到的剧本
(这只是一个占位符,所以我可以发布答案 - 为什么没有人喜欢给出在他们的框架中工作的例子?叹息)
谁能给我一个简单表格的例子,当给定一个简单的对象时,您可以点击保存并知道它具有保存对象所需的所有数据(包括id?)
使用在这里找到的剧本
(这只是一个占位符,所以我可以发布答案 - 为什么没有人喜欢给出在他们的框架中工作的例子?叹息)
这不是我想要的那么明显 - 我来自你在表格中“隐藏” id 的学校,在某种隐藏字段或类似的地方。
也许 play-bootstrap 代码库有一些不错的方法,但我没有在文档中看到它 - 所以,我的朋友,这里是如何获取一些对象,为它制作一个表格然后能够更新它对象文本。
为简洁起见,我将数据库代码省略了。
首先,这是我的操作 - 在我的控制器类中 - 从数据库中获取我的模型。请注意,我使用的支持模型与数据库返回的支持模型相同,带有私有字段等(所以,你知道,只是一个通用的 POJO)。
public Result editLesson(int languageId){
Form<Language> languageForm = formFactory.form(Language.class);
try {
//here da is just how i get things from the database.
Language language = da.getLanguage(languageId);
languageForm = languageForm.fill(language);
} catch (SQLException e){ //SAD! }
return ok(editLesson.render(languageForm));
}
整洁的。这样就可以获取表单并将其发送到某个页面以查看。请注意,formFactory 需要神奇地注入到您的控制器中。接下来,页面是什么样的?
好吧,这是一个常用的模板,只有:
我有这个作为我的第一行:@import b3.vertical.fieldConstructor
我想在哪里展示我的表格
@b3.form(routes.HomeController.saveLesson) {
@b3.hidden( "id", languageForm("id").value, 'attr -> false )
@b3.text( languageForm("name"), '_label -> "Title", 'placeholder -> "The Title" )
@b3.text( languageForm("description"), '_label -> "Description", 'placeholder -> "The Description" )
@b3.submit('class -> "btn btn-default"){ <span class="glyphicon glyphicon-ok"></span> Save }
}
好的,现在我们有了表单——它告诉表单去哪里(我们将在 5 秒内查看路线),并放置可编辑字段。我在这里将 id 字段设置为隐藏。如何访问它对我来说并不直观——但你就在那里。
我的路线文件有这个:
GET /edit-lesson/:languageId controllers.HomeController.editLesson(languageId: Integer)
POST /save-lesson/ controllers.HomeController.saveLesson()
第一行是我如何开始编辑页面。第二行是我想保存这些编辑过的课程的地方。我使用routes.HomeController.saveLesson
to 反向指向保存课程。如果您的控制器称为 Bob(哑名称),您将改为使用routes.Bob.saveLesson
链接到该saveLesson
方法。
最后,我的 saveLesson 代码如下所示(在 Bob ~ erm, HomeController 中)
public Result saveLesson(){
Form<Language> languageForm = formFactory.form(Language.class).bindFromRequest();
if (languageForm.hasErrors()){
return badRequest(editLesson.render(languageForm));
} else {
Language language = languageForm.get();
try {
da.saveLanguage(language);
return ok(share.render());
} catch (SQLException e){
//TODO: log this, but really we don't have much to do, do we?
return ok(e.getMessage());
}
}
}
注意数据绑定在 Play 中搞砸了——如果你的表单有错误,调用.get()
将失败,所以如果在你的控制器中你出于某种原因需要一些表单数据,你需要检查表单是否有错误——如果它不,随便。如果是这样,您需要.field(String).value()
在表单对象上使用,您无法将表单对象转换为绑定(通过get()
)~这在 scala 页面上有所解释,但在 java 页面上没有!