Playframework(四)Java Project and Handling form Submission

Playframework(4)Java Project and Handling form SubmissionPlayframework(4)Java Project and Handling

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