日期:2014-05-20  浏览次数:21198 次

Playframework(4)Java Project and Handling form Submission
Playframework(4)Java Project and Handling form Submission
4. Handling Form Submission
Defining a form 
play.data.Form   just defining the form with a class
public class User{
     public String email;
     public String password;
}

Form<User> userForm = form(User.class);

It works using Spring data binder.
Map<String, String> anyData = new HashMap();
anyData.put("email","test@gmail.com");
anyData.put("password","111111");
User user = userForm.bind(anyData).get();

If we have a request available in the scope, we can bind directly from the request content:
User user = userForm.bindFromRequest().get();

Defining Constraints
JSR-303(Bean Validation) annotations:
…snip…
@Required
public String email;
…snip...

We can also define an ad-hoc validation by adding a validate method to my top object:
public class User{
     …snip…
     public String validate(){
          …snip...
     }
}

Handling binding failure
if(userForm.hasErrors()){
     ...
}else{
     ...
}

Filling a form with initial default values
userForm = userForm.fill(new User("email address","password"));

Register a custom DataBinder
Formatters.register(LocalTime.class, new SimpleFormatter<LocalTime>()

Form Template Helpers in templates
@(myForm: Form[User])
@helper.form(action = routes.Application.submit()){
     @helper.inputText(myForm("username"))
     @helper.inputPassword(myForm("password"))
}

There is Field constructors and we can write our own.

5. Handling and serving JSON requests
Handling a JSON request
A JSON request is an HTTP request using a valid JSON payload as request body. Its Content-Type header must specify the text/json or application/json MIME type.
public static index sayhi(){
     JsonNode json = request().body().asJson();
     …snip…
     String name = json.findPath("name").getTextValue();
}

We can verify JSON request via cURL
>curl
     --header "Content-type: application/json"
     --request POST
     --data '{"name": "Carl" }'
     http://localhost:9000/sayhi

curl is a amazing tool to verify JSON REST API from command line.

Serving a JSON response
We will not only handle a JSON request, but also send back a valid JSON HTTP response.
@BodyParser.Of(Json.class)
public static index sayhi(){
     JsonNode json = request().body().asJson();
     ObjectNode result = Json.newObject();
     String name = json.findPath("name").getTextValue();
     …snip…
     result.put("status", "OK");
     result.put("message", "Hello " + name);
     return ok(result);
}

6. Working with XML
An XML request is an HTTP request using a valid XML payload as request body. It should specify the text/xml MIME type in its Content-Type header.
org.w3c.Document

public static index sayhi(){
     Document dom = request().body().asXml();
     …snip…
     String name = XPath.selectText("//name", dom);
     …snip...
}

Or

@BodyParser.Of(Xml.class)
public static index sayhi(){
     String name = XPath.selectText("//name", dom);
     …snip...
}

Play with cURL
>curl
     --header "Content-type: text/xml"
     --request POST
     --data '<name>Sillycat</name>'
     http://localhost:9000/sayhi

Serving an XML response
@BodyParser.Of(Xml.class)
public static index sayhi(){
     String name = XPath.selectText("//name", dom);
     return ok("<message \"status\"=\"ok\">Hello " + name + "</message>");
}

7 Handling file Upload
Uploading files in a form using multipart/form-data
The special multipart/form-data encoding allows to mix standard form data with file attachments.
@form(action = routes.Application.upload, enctype -> "multipart/form-data"){
     <input type="file" name="picture">
     <p><input type="submit"></p>
}

Actions to fetch the data from form.

public static Result upload(){
     MultipartFormData body = request().body().asMultipartFormData();
     FilePart picture = body.getFile("picture");
     if(picture != null){
          String fileName = picture.getFilename();
          String contentType = picture.getContentType();
          File file = picture.getFile();
          return ok("File upload");
     }
}

Direct file upload
Another way to send files to the server is to use ajax to upload files asynchronously from a form. The request body will not be encoded as multipart/form-data. It will contain the plain file contents.
public static Request upload(){
     File file = request().body().asRaw().asFile();
     …snip...
}

References:
http://www.playframework.org/documentation/2.0.4/JavaHome
http://www.playframework.org/documentation/2.0.4/JavaForms