据我所知,Play 将请求的答案分为两层: Controller 方法将所有数据放在一起, View 实际上创建输出。
我有一个功能“获取客户列表”。 Controller 创建一个列表。现在,我想要的是该 Controller 结果的两个输出:
1) 我想要通常的 HTML 输出,因此需要一个打印的 Controller
...<table><tr><th>Name</th>...</tr>
<tr><td>Smith</td>...</tr>
...
</table>...
2) 从同一个列表中,我还将创建一个 JSON(或 CSV 或 XML)文件,其中包含作为 JSON 信息的客户数据。
根据我对 Play 的理解,应该可以通过在 Controller 末尾放置另一个 View 渲染器来获得它。我会有两个网址,比如说
/customer/list.html
和
/customer/list.json
返回两个不同格式的结果,但使用相同的 Controller (顺便说一句,它是用 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
。阅读有关正则表达式动态路由参数 here 的信息。)
您的操作可能如下所示:
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")
但我认为第一个选项更简洁,通常也更好。
注意:我认为对于这种依赖于内容的内容,通常最好使用 content negotiation而不是不同的 URL。您可以阅读 here .
关于java - Play 框架 2.3 中一种 Controller 方法的不同 URL 选择 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28799683/