【问题标题】:Play Framework - Variables in URL instead of as ? parametersPlay Framework - URL 中的变量而不是 as ?参数
【发布时间】:2013-08-01 04:02:00
【问题描述】:

我刚刚开始学习 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

【问题讨论】:

    标签: url routing playframework-2.0


    【解决方案1】:

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

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

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

    例如如果你想对表单使用 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);
    }
    

    【讨论】:

    • 等等,如果可能的话,你可以尝试改变我必须直接指向你的 getPerson 方法的路线,例如GET /person controllers.PersonActions.getPerson(id:String) 如果这行得通,它会让您少用一种控制器方法来维护。我不确定是否可以将多个 url 指向同一个控制器方法——我认为这意味着反向路由器对于该 url 是不确定的。可能值得一试。
    • 我认为答案中给出的建议是合理的。如果您从表单提交 GET 请求,表单中的字段值将作为查询参数出现在 URL 上。这就是表格的工作方式。拥有 find 操作应该查找 ID,然后返回 404 响应或重定向到 get 操作是我将采取的方法。这为 OP 提供了他们似乎正在寻找的维基百科风格的搜索行为(如果 ID 存在,则 ID 查找直接发送给该人)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    相关资源
    最近更新 更多