java - Play 框架 2.3 中一种 Controller 方法的不同 URL 选择 View

标签 java json model-view-controller playframework-2.3

据我所知,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/

相关文章:

java - jackson 枚举反序列化。 Spring rest模板

json - 将 JSON 数据转换为 data.frame

javascript - 在 Highcharts 中自动刷新 Json 数据

model-view-controller - 谁负责下一个View?

javascript - 直接处理来自 AJAX 请求的数据

c# - 如何在不调用 Controller 的情况下刷新 MVC webgrid

java - 为什么应用于该对象的 System.out.println 会打印这个短语?

java - 如何在jni文件夹中创建java类?是否可以?

java - Wicket:Checkgroup 可以启用 Ajax 吗?

java - 检查通用对象变量的类