Sparkjava重定向同时保留浏览器URL

时间:2017-06-07 01:13:25

标签: spark-java

我运行了一个sparkjava服务器应用程序,它使用以下行提供静态HTML页面:

staticFiles.location("/public");

如果您转到http://example.com,您会看到HTML页面。现在,我想将用户从其他路径重定向到我的主页,同时保留浏览器URL。例如,如果您访问http://example.com/message/123,则仍会看到HTML页面,而浏览器网址仍为http://example.com/message/123。所以redirect.get()在这里不起作用。

2 个答案:

答案 0 :(得分:2)

为了从不同的路径提供相同的文件,您可以执行以下操作(它看起来很长但很简单):

假设您的项目结构是:

src
  java
    main
      resources
        public
        templates   (optional folder)

GET请求您的主页上,提供驻留在/public中的静态HTML文件。我们称这个文件为index.html

现在您要注册其他路径以提供此文件。如果您使用TemplateEngine,您可以轻松完成。实际上,您将index.html作为静态文件和模板(没有参数)引用。

模板引擎允许您通过传递可在运行时在模板中引用的键值对映射来动态创建提供的HTML页面。但在你的情况下,它会更简单,因为你想静态地提供一个页面。因此,您将传递一张空地图:

Spark.get("/message/123", (req, res) ->
    new ModelAndView(new HashMap(),
                     "../public/index"),
                     new ThymeleafTemplateEngine()
);
  • Thymeleaf只是一个例子,Spark支持few template engines。对于它们中的每一个,您可以在文档中找到一个简单的github如何使用它的示例。例如,This is Thymeleaf one。
  • 路径../public/index是因为Spark正在templates文件夹中查找模板,并且您希望将public/index.html作为模板。
  • 您将在github链接中找到类ThymeleafTemplateEngine
  • 当然,您必须将所选模板引擎依赖项添加到项目的pom.xml文件中。

因此,对GEThttp://example.com的{​​{1}}次请求将在保留请求的网址时提供http://example.com/message/123

答案 1 :(得分:1)

您可以将index.html文件读入字符串并提供服务。这就是我最后要做的。

如果您的应用程序从已编译的.class文件运行:

URL url = getClass().getResource("public/index.html");
String indexDotHTML = new String(Files.readAllBytes(Paths.get(url.toURI())));

get("/message/123", "text/html", (req, res) -> indexDotHTML);

如果您的应用程序是从jar运行的:(解决方案使用Guava作为助手)

import com.google.common.io.ByteStreams;


InputStream in = getClass().getResourceAsStream("/public/index.html");
String indexDotHTML = new String(ByteStreams.toByteArray(in));

get("/message/123", "text/html", (req, res) -> indexDotHTML);