Play Framework - URL中的变量而不是?参数

时间:2013-08-01 04:02:00

标签: url routing playframework-2.0

我刚刚开始学习Play,所以这是一个基本问题,但我搜索了每个我能想到的术语,但找不到答案。

我想要做的就是让提交的页面从文本字段中获取ID并直接将其放入URL中(例如/ myservice / person / 123)。相反,生成的URL包含ID作为参数(例如/ myservice / person?id = 123)。

我知道如果我手动输入URL,我的控制器正在被正确调用,所以我倾向于认为我的路由文件是正确的。这就是我的条目:

GET   /person/:id    controllers.PersonActions.getPerson(id: String) 

所以我假设我的模板出了问题,看起来像这样:

@form(routes.PersonActions.getPerson(personID)) {
    @* @inputText(personForm("id")) *@
    <input type="text" name="id" value="@personID">
    <input type="submit" value="Get">
}

你可以看到我已经用@inputText注释了另一种方式,但它对我来说表现相同。我不依赖于任何一种方法。

我也尝试使用POST,它完全从URL中删除了ID,我也不明白,但是因为我只是在做一个简单的查询,所以我宁愿使用GET。

任何人都可以帮我理解这里发生了什么吗?我觉得有关路由/ URL生成如何工作的一些基本原理,我不理解,但是我今天经历了很多次教程和文档,我很茫然。

提前致谢。

哦,我正在使用Java 7,Play 2.1和Eclipse Kepler

1 个答案:

答案 0 :(得分:1)

我认为您正在尝试跳过步骤并将表单请求数据从视图直接映射到控制器方法。您需要提交表单,让控制器解析数据,然后根据您从表单中解析的数据呈现下一个适当的视图。

请记住,视图中的personId是在呈现视图时绑定在服务器端的参数。在这种情况下,表单的提交URL被硬编码为在渲染时传递给视图的任何personId - 当输入框改变时,它不会动态地改变。

要修复,请添加一个控制器方法来接受来自/person的请求(我猜这是基于您的问题中表示该表单已提交给/person?id=123的部分,无论如何它应该是您在上面显示的表单的URL

e.g。如果你想为表单添加GET方法添加:

GET     /person     controllers.PersonActions.findPerson(id: String)

并且在你的PersonActions控制器中(我假设你正在使用Java,如果scala我确信你可以从文档中调整它)

public static Result findPerson(String id){
    /*
     * I'm assuming this method exists and works because you say 
     * when you type in /person/123 manually the routing works 
     * and your router says getPerson is the method name for that URL.
     */
    return getPerson(id);
}
相关问题