繁体   English   中英

Play框架2.3中一种控制器方法的不同URL选择视图

[英]Different URL-selected views for one controller method in Play framework 2.3

我了解,播放将请求的答案分为两层:controller方法将所有数据放在一起,视图实际上创建了输出。

我有一个功能“获取客户列表”。 控制器创建一个列表。 现在,我想要的是此控制器结果的两个输出:

1)我想要通常的HTML输出,因此需要打印的控制器

...<table><tr><th>Name</th>...</tr>
<tr><td>Smith</td>...</tr>
...
</table>...

2)从同一列表中,我还将创建一个包含客户数据作为JSON信息的JSON(或CSV或XML)文件。

根据我对Play的了解,应该可以通过在控制器的末尾放置另一个视图渲染器来获得此效果。 我会有两个网址,例如

/customer/list.html

/customer/list.json

它返回两个格式不同的结果,但是使用相同的控制器(顺便说一下,用Java实现)。

能做到吗? 如何才能做到这一点? 还是我的方法不明智?

最好的问候,德克

由于不确定Play Java的内容,我有点不愿在这里回答,但是您可以采取两种方法:

  • 为您支持的每种格式指定一个路由(与.json,.html等不同)
  • 根据值的不同,在操作中对后缀进行参数化和响应。

假设您同时支持HTML和JSON输出(默认为HTML)。您可以这样定义一条路由:

GET  /customer/list$format<(\.(:?html|json))?>   controllers.Application.renderMyList(format: String)

(注意:.type后缀是可选的,您可以使用/list.html/list.json或仅使用/list在此处详细了解正则表达式动态路由参数。)

您的操作可能如下所示:

public static Result renderMyList(String format) {
    List<Something> myList = getMyList();
    if (format.equals(".json") {
        Ok(convertToJson(myList));
    } else {
        Ok(views.html.myList(myList));
    }        
}

另一方面,您可以使用不同的固定参数显式定义指向同一操作的两条路由:

GET  /customer/list.html  controllers.Application.renderMyList(format: String = ".html")
GET  /customer/list.json  controllers.Application.renderMyList(format: String = ".json")

但是我认为第一种选择更为简洁,而且通常更好。

NB:我认为对于这种依赖于内容的内容,通常最好使用内容协商而不是不同的URL。 你可以在这里阅读。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM