來玩Play框架04 表單

Vamei發表於2014-05-07

作者: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);
}

DynamicFormForm都來自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快速教程”系列文章

 

相關文章