作者:Vamei 出處:http://www.cnblogs.com/vamei 歡迎轉載,也請保留這段宣告。謝謝!
表單(form)是最常見的從客戶往伺服器傳遞資料的方式。Play框架提供了一些工具。它們可以從表單中提取資料,驗證提交資料的合法性,或者在檢視中顯示錶單。我先來介紹最簡單的使用表單提交資料的方式。
增加表單
我可以用純粹html的方式產生一個表單。在app/views下增加模板form.scala.html:
<!DOCTYPE html>
<html>
<body>
<form method="POST" action="/postForm">
<input type="text" name="content"></input>
<input type="submit"></input>
</form>
</body>
</html>
在Application控制器中,增加一個動作form(),顯示模板:
public static Result form() {
return ok(views.html.form.render());
}
在routes中增加導航
GET /form controllers.Application.form()
頁面如下:
資料提取
在文字框中輸入任意字元,點選submit後,表單將以POST方法提交到/postForm這一URL。增添負責處理該URL的動作,Application.postForm()
public static Result postForm() {
DynamicForm in = Form.form().bindFromRequest();
String result = in.get("content");
return ok(result);
}
DynamicForm和Form都來自play.data。Form.form().bindFormRequest()從請求中提取表單資訊,並放入到DynamicForm型別的in物件中。
我上面用get()方法,來提取表單中不同名字的輸入欄。比如上面的"content"。postForm()動作把表單中填寫的內容直接顯示。
增加routes記錄
POST /postForm controllers.Application.postForm()
在/form的頁面下輸入任意字串並提交,檢視效果。
我介紹了表單最基本的使用方式。下面瞭解Play框架提供的其它的表單工具。
表單物件
在動作內部,可以建立一個物件來指代表單。表單的每個輸入欄為表單物件的一個屬性。我可以通過增加標註(annotation)的方法,驗證表單的輸入(Form Validation)。
首先修改app/views/form.scala.html
<!DOCTYPE html>
<html>
<body>
<form method="POST" action="/postForm">
<label>Email</label>
<input type="email" name="email">
<label>Password</label>
<input type="password" name="password">
<label>Comment</label>
<input type="text" name="comment">
<input type="submit">
</form>
</body>
</html>
這個表單有三個輸入欄,名字分別為email, password和comment。
建立app/util/資料夾,在其中建立User.java。User類用於在Play內部指代上面的表單:
package util;
import play.data.validation.Constraints.Email;
import play.data.validation.Constraints.Required;
public class User {
@Email
public String email;
@Required
public String password;
public String comment;
}
User類指代一個表單的資料。我還為兩個屬性增加了標註。Play伺服器可以據此驗證輸入的合法性。比如@Email的限定就要求輸入為"*@*"的形式。@Required則要求輸入欄不為空。如果違反這些限定,那麼Play將丟擲異常。
修改動作postForm()。User類的物件user用來儲存表單資料。
public static Result postForm() {
Form<User> userForm = Form.form(User.class);
User user = userForm.bindFromRequest().get();
return ok(user.email + " " + user.password);
}
最後的ok()中呼叫了表單物件中儲存的資料。
分別輸入合法和不合法的資料,觀察Play返回的頁面。
表單模板
我上面手動建立模板中的表單,並保持檢視中的表單和表單物件一致。我還可以在模板中直接呼叫表單物件。這樣做,能讓檢視中的表單和表單物件自動的保持一致。
修改form.scala.html為
@(userForm: Form[util.User])
<!DOCTYPE html>
<html>
<body>
@helper.form(action = routes.Application.postForm()) {
@helper.inputText(userForm("email"))
@helper.inputPassword(userForm("password"))
@helper.inputText(userForm("comment"))
<input type="submit">
}
</body>
</html>
這裡使用了Play所提供的helper工具。helper可以在表單中增加表單form,再加入不同型別的輸入欄,比如inputText和inputPassword。
修改原有的動作form()
public static Result form() {
Form<User> userForm = Form.form(User.class);
return ok(views.html.form.render(userForm));
}
這裡,表單物件作為引數傳遞給模板。最後的html頁面中的表單,將由Play自動生成。
總結
表單
資料提交
歡迎繼續閱讀“Java快速教程”系列文章