我只是在学习Play 2.0框架。所以我有一个非常基本的问题:我只想获取一个URL参数并在视图中显示它。你是怎么做到的?
我创建了网址格式:
GET /test/:id controllers.Application.testOutput(id: Long)
Application
中的一个适当的方法:
public static Result testOutput(long id) {
return ok(
views.html.test.render(id)
);
}
如何从视图中调用id变量?我知道如何在视图中调用模型中定义的方法,但我不知道如何在视图中显示id变量。它是将id变量传递给render方法的正确方法吗?
我想了解基本概念,因此对答案的详细解释会很棒!
答案 0 :(得分:2)
我们的测试网址为http://localhost:9000/greeter?message=hello
,这将输出text/plain
响应,其中包含参数message
的内容(即问候)。首先,让我们定义路线
GET /greeter controllers.Greeter.say(message: String)
然后,创建一个Greeter
控制器(我使用Java)
package controllers;
import play.*;
import play.mvc.*;
// This lets you call the template without the views.html prefix
// import views.html.*;
import views.txt.*;
public class Greeter extends Controller {
public static Result say(String message) {
return ok(greeter.render(message));
}
}
您可以看到ok()
调用文件app/views/greeter.scala.txt
中定义的scala函数。这是该文件的内容(第一行定义函数内使用的String类型的消息参数
@(message: String)
I'm the content. Note that you can place
anything you want here. Scala expressions
begin with the '@@' character. For example
next line contains the content of message:
@message
在这种情况下,我使用.txt作为文件扩展名,因为我想要纯文本响应。如果要生成HTML输出,只需制作.scala.html文件
即可答案 1 :(得分:0)
客户端请求由the Play router处理,后者又将其转发给操作(这是控制器内部的方法)
GET /greeter Greeter.say
来自Play doc
路由定义的最后一部分是Java调用。这部分是 由操作方法的完全限定名称定义。那个行动 方法必须是Controller类的公共静态void方法。一个 必须在控制器包中定义控制器类 是play.mvc.Controller的子类。
如果是,则可以在Controller类名称之前添加Java包 没有直接在控制器包下定义。控制器 包本身是隐式的,所以你不需要指定它
Inside the action,您可以通过param
对象或直接通过方法签名获取参数:
public static void say(String what) {
...
}
您可以像在示例中一样通过render(what)
将对象传递给模板。
最后your template可以使用${what}
语法访问这些对象。
编辑 这是Play 1.x的做事方式。我没注意到你的标签,但仍然希望这有帮助。 Play2使用新的Scala模板引擎here is the guide。您似乎必须在模板的开头声明参数,然后您可以通过@what
语法访问它们。那是因为模板现在是一个已编译的Scala函数,因此它可以在编译时进行类型检查以及类似的事情。使用render(what)
将参数传递给此函数(与您一样)。我本人并不自己使用Play2.0:从技术角度来看,这是一个很大的进步,但代价是不那么直观,而且更加冗长。我认为较简单的项目不会从这些改进中受益
答案 2 :(得分:0)
在Play 2中,模板只是简单的函数,因此您可以像调用任何函数一样调用它们。