【问题标题】:How to serve same static .html file for all dynamic urls using Play framework and Java?如何使用 Play 框架和 Java 为所有动态 url 提供相同的静态 .html 文件?
【发布时间】:2017-07-21 08:23:19
【问题描述】:
我正在尝试提供一个静态 html 文件,我们将其命名为 index.html,用于所有动态 url,例如 /tachyon/someId。这个someId 是动态生成的。我尝试了多种方法来做到这一点,但都失败了。这就是我所尝试的所有方法。
- 尝试为 GET url
/tachyon/*someId 添加 controllers.Assets.at(path="/public", file="index.html")。这失败了,说缺少参数 someId。
- 尝试通过渲染渲染
index.html。这也失败了,因为 index.html 不是 scala.html 模板。
- 尝试通过控制器返回
routes.Assets.at("index.html")。这也失败了,因为我想返回 Result 但方法的返回类型不同。
- 尝试通过控制器返回
ok(routes.Assets.at("index.html")。这也未能说明不是有效的 Call for ok。
如果有办法通过控制器执行此操作并将Result 从task helper 类中的方法返回到task 会更好,因为我正在从task 类中的方法返回Promise<Result>。
【问题讨论】:
标签:
java
html
scala
playframework
【解决方案1】:
我认为您可以使用 Twirl 来生成页面。既然要静态html,可以忽略body中的参数。
所以在路线中,添加:
GET /tachyon/*someId somecontroller.index(someId)
在控制器的索引函数中,可以返回
Ok(views.html.somepage(someId))
您在views 文件夹中创建了一个somepage.scala.html Twirl 函数,但不要在body 中使用someId。
【解决方案2】:
我让它工作了。不确定这是否是正确的解决方案。我通过将index.html 转换为字节数组,然后使用ok 使用ByteArrayInputStream 进行渲染来渲染它。像这样的。
File file = Play.getFile("path to the file", Play.current());
byte[] byteArray = IOUtils.toByteArray(new FileInputStream(file));
return ok(new ByteArrayInputStream(byteArray)).as("text/html");
如果不使用 scala 模板,是否有更好的方法可以让我知道。
谢谢