【问题标题】:GET urls and application state in the playframework在 playframework 中获取 url 和应用程序状态
【发布时间】:2012-10-21 15:44:17
【问题描述】:

有没有办法给我的链接一个对象中的所有变量?这样做的目的是使链接成为书签。重建屏幕的重要信息都在 URL 中。

我的解决方法引入了会话和 url 重写。这是一个链接,将在我的对象s 中添加或更改行业变量:

<a href="@{Stocks.index()}?s.industry=${roeBean.industry?.urlEncode()}">

当链接被点击时,Stocks.index 被调用,接受对象s 作为它的参数。接收 s.industry 数据和s 中的所有其他值都为空。因此,我可以将s 参数与会话中保存的s 的另一个副本合并。然后更新缓存并重写 URL。

效果很好,但是如果播放框架有一些东西可以简单地扩展状态对象并更改变量(仅用于链接),它会更优雅。有没有一种干净的方法可以做到这一点?我想象一下这将非常有用。

【问题讨论】:

    标签: playframework


    【解决方案1】:

    是否只是为了更新行业工作而创建一个新的控制器方法(而不是索引)?当传递 s.id 和要添加的 s.industry 时,以下操作将起作用(或者如果您想要这样做,则替换存在)。

    在您看来: (将视图发送到 s 对象,但您现在似乎这样做了)(另外,我正在使用 groovy 模板助手,如果需要,您可以使用 html,结果相同)

    #{a @Stocks.index(s.id, s.industry=roeBean.industry) } Add This Industry {/a}
    

    在您的控制器中: (用任何行业替换字符串)

    public static void addIndustry(Long id, String industry) {
        Stock s = Search.findById(id);
        String i = industry;
        //Do your stuff
        s.save();
    }
    

    在这里传递一个静态字符串(或其他东西)也可以。所以 s.industry='test' 在本例中将 GET id=1 和行业=test。

    如果您希望您的链接具有对象的所有属性,您不能只发送整个对象吗?如果您只想要整个对象,则传递对象中每个属性的整个键/值位似乎需要做很多工作?所以在这个例子中:

    当您从控制器渲染视图时

    render(s);
    

    链接?

    #{a @Stocks.index(s, s.industry=roeBean.industry) } Add This Industry {/a}
    

    在你的控制器中保存:

    public static void addIndustry(Stock s, String industry) {
        //Do your stuff
        s.save();
    }
    

    【讨论】:

    • 我澄清了我的问题。感谢您使用#{a 语法,我会立即升级我的习惯。
    • 更新了答案,但仍然有点不清楚您在寻找什么。
    • 你可以像这样关闭#{/a}...我尝试了上面看起来更好看的语法,但URL解析为s=而不是s.industry=(例如:s=Trucks+%26+Other+Vehicles) .此外,industry= 解析为s= .. 我猜 Play 1.5 与该对象中的公共变量不匹配。稍后我会尝试您的其他示例。谢谢...
    • 你帮助建造了一个更好的捕鼠器。不过我做了修改。我创建了一个控制器方法 Stocks.industry(s, industry) 并调用它。 Play 解析了所有的 URL。我在控制器中调用了index,所以 Play 为我重新编写了 URL。这是一个改进,因为我不再需要会话,链接具有所有状态。模板语法清洁器。我只是在控制器中有额外方法的开销。这是一个更好的解决方法。
    • 抱歉语法错误!你能在你的问题中发布你的代码吗(使用粗体的“解决方案”这样的标题),我很好奇你最终得到了什么,其他人可能也是,我敢肯定这是我不理解(长周末!)
    【解决方案2】:

    我了解到您在数据库中有实体 S,并且您只想更改该实体中的 s.industry 值。

    如果与 s.industry 一起添加 s.id 参数,然后播放!将从数据库中获取具有此 ID 的 S 实体,并将合并到您在 URL 中传递的参数中。 所以,对于这样的链接:

    <a href="@{Stocks.index()}?s.industry=${roeBean.industry?.urlEncode()}&s.id=1">
    

    会发生以下情况。 Play 将获取 id=1 的 S 对象,然后它将设置您作为 URL 参数传递的 industry 值,然后 Stocks.index 方法将获得合并的 S 对象。

    【讨论】:

    • 我不得不澄清一下我的问题(见上文)。感谢您的反馈,这很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多