本书第六章以一个实例介绍了Play Framework中Form的使用,如何绑定数据,如何进行验证,如何处理文件上传
一、项目结构
二、Play中表单的使用
1. 在Controller中使用Form
在play.data包中包含了处理HTTP表单数据提交和验证(HTTP form data submission and
validation)的一些
helpers,一般步骤是定义一个play.data.Form
并包裹其class,如:
Form<User> userForm =Form.form(User.class);
//Model—— User Object public class User { public String email; public String password; } //controller—— userForm Form<User> userForm = Form.form(User.class); //1. 定义 //This form can generate a User result value from HashMap<String,String> data Map<String,String> anyData = new HashMap(); //2. 写入数据到HashMap--mocking data anyData.put("email", "bob@gmail.com"); anyData.put("password", "secret"); User user = userForm.bind(anyData).get(); //3. 写入数据到表单--绑定(保存数据) //If have a request available in the scope, bind directly from the request content User user = userForm.bindFromRequest().get();
用预设值显示表单——Displaying a form with preset values
public class Products extends Controller { private static final Form<Product> productForm = Form.form(Product.class); ... public static Result details(String ean) { final Product product = Product.findByEan(ean); if (product == null) { return notFound(String.format("Product %s does not exist.", ean)); } Form<Product> filledForm = productForm.fill(product); return ok(details.render(filledForm)); } ... }
route是
GET /products/:ean controllers.Products.details(ean: String)
2. 在模板中使用表单(Form template helpers)
在模板中我们可以使用Form
template的helpers来处理表单各个项
2.1 引入helper
- @(productForm: Form[Product]) ——
action传入的参数
- @import helper._ ——
Form helpers
@import helper.twitterBootstrap._ ——
bootstrap helpers
2.2 生
成<form>
tag
@helper.form(action = routes.Products.save()) { ... }
可在生成的时候加入参数
@helper.form(action
= routes.Products.save(),‘‘id -> "form") { ... }
2.3 生成 <input>
element
还可以自定义HTML输入
@helper.input(myForm("email")) { (id, name, value, args) =>
<inputtype="date"name="@name"id="@id" @toHtmlArgs(args)>
}
3. 处理表单的输入
① 创建boundForm对象,用于接受从HTTP传入的数据信息
② boundForm
将接受的表单数据传给Product的实例
③ produce.save()保存表单数据到Product的实例
三、数据绑定
PLay中有三种绑定方式
- 表单绑定(Form binding),见前所述
- URL查询参数绑定(URL query parameters binding)
- URL路径绑定(URL path binding)