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

Sparkjava redirect while keeping the browser URL

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

staticFiles.location("/public");

如果你去http://example.com, you will see the HTML page. Now, I want to redirect users from other paths to my homepage, while keeping the browser URL. For example, if you visit http://example.com/message/123, you will still see the HTML page, while the browser URL stays http://example.com/message/123。所以 redirect.get() 在这里不起作用。

为了从不同的路径提供相同的文件,你可以这样做(看起来很长但很简单):

假设您的项目结构是:

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. For each one of them, you can find in the documentation a simple github example of how to use it. For example, This is Thymeleaf。
  • 路径 ../public/index 是因为 Spark 正在 templates 文件夹中寻找模板,而您想将 public/index.html 作为模板。
  • 您会在 github link 中找到 class ThymeleafTemplateEngine
  • 当然,您必须将所选的模板引擎依赖项添加到项目的 pom.xml 文件中。

因此,对 http://example.comhttp://example.com/message/123GET 请求将服务于 index.html,同时保持所请求的 URL.

您可以将 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);