Статьи

Play Framework опубликовал пересмотренные значения

Работа с опубликованными значениями в Play Framework 2.0 без определения сопоставления форм может быть не такой очевидной, как в Play 1.x, поэтому я пишу этот краткий перечень.

Для этого быстрого примера давайте определим следующее представление:

приложение / просмотров / index.scala.html

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
@(message: String)
 
message: @message <br />
 
<h2>Scala form</h2>
 
<form action="@routes.ScalaPoster.save()" method="POST">
  scala name: <input name="scala_name"> <br />
  scala surname: <input name="scala_surname"> <br />
  <input type="submit" value="save">
</form>
 
<h2>Java form</h2>
 
<form action="@routes.JavaPoster.save()" method="POST">
  java name: <input name="java_name"> <br />
  java surname: <input name="java_surname"> <br />
  <input type="submit" value="save">
</form>

И следующий файл маршрутов:

Conf / маршруты

1
2
3
4
5
# Home page
GET     /                         controllers.Application.index
 
POST    /scala                    controllers.ScalaPoster.save
POST    /java                     controllers.JavaPoster.save

С java, напрямую обращаясь к телу запроса:

приложение / контроллеры / JavaPoster.java

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
package controllers;
 
import play.mvc.*;
 
import views.html.*;
 
import java.util.Map;
 
public class JavaPoster extends Controller {
   
  public static Result save() {
 
    final Map<String, String[]> values = request().body().asFormUrlEncoded();
    final String name = values.get("java_name")[0];
    final String surname = values.get("java_surname")[0];
     
    return ok(index.render(String.format("You are %s, %s",surname, name)));
  }
   
}

Или используя DynamicForm:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
package controllers;
 
import play.mvc.*;
 
import views.html.*;
 
import play.data.DynamicForm;
 
public class JavaPoster extends Controller {
   
  public static Result save() {
 
    final DynamicForm form = form().bindFromRequest();
    final String name = form.get("java_name");
    final String surname = form.get("java_surname");
    return ok(index.render(String.format("You are %s, %s",surname, name)));
  }
   
}

Теперь версия Scala, доступ к телу:

приложение / контроллеры / ScalaPoster.java

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
package controllers
 
import play.api.mvc._
 
object ScalaPoster extends Controller {
 
  def save = Action { request =>
 
    def name = request.body.asFormUrlEncoded.get("scala_name")(0)
    def surname = request.body.asFormUrlEncoded.get("scala_surname")(0)
 
    Ok(views.html.index("You are %s, %s".format(surname, name)))
  }
 
}

И определение формы

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package controllers
 
import play.api.mvc._
 
import play.api.data.Form
import play.api.data.Forms.tuple
import play.api.data.Forms.text
 
object ScalaPoster extends Controller {
 
  val form = Form(
    tuple(
      "scala_name" -> text,
      "scala_surname" -> text
    )
  )
 
  def save = Action { implicit request =>
  
    def values = form.bindFromRequest.data
    def name = values("scala_name")
    def surname = values("scala_surname")
 
    Ok(views.html.index("You are %s, %s".format(surname, name)))
  }
 
}

Обратите внимание на запрос о влиянии в приведенном выше примере. Вы можете явно передать его в bindFromRequest с

1
def values = form.bindFromRequest()(request).data

Вы также можете играть с кортежами и выпускать что-то вроде

1
2
val data = form.bindFromRequest.get
Ok(views.html.index("You are %s, %s".format(data._2, data._1)))

или же

1
2
val (name, surname) = form.bindFromRequest.get
Ok(views.html.index("You are %s, %s".format(surname, name)))

И, конечно же, если вы просто хотите прочитать одно опубликованное значение, вы можете выполнить:

1
def name = Form("scala_name" -> text).bindFromRequest.get

Есть несколько способов добиться этого. Надеюсь, это послужит полезным напоминанием.

Справка: Play Framework опубликовал ценности, вновь пересмотренные от нашего партнера по JCG Себастьяна Скарано на платформе « Развлекайся с Play»! блог.