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.com
和 http://example.com/message/123
的 GET
请求将服务于 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);
我有一个 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.com
和 http://example.com/message/123
的 GET
请求将服务于 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);