我运行了一个sparkjava服务器应用程序,它使用以下行提供静态HTML页面:
staticFiles.location("/public");
如果您转到http://example.com,您会看到HTML页面。现在,我想将用户从其他路径重定向到我的主页,同时保留浏览器URL。例如,如果您访问http://example.com/message/123,则仍会看到HTML页面,而浏览器网址仍为http://example.com/message/123。所以redirect.get()在这里不起作用。
答案 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
作为模板。ThymeleafTemplateEngine
。pom.xml
文件中。因此,对GET
和http://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);