我在 Spring Boot 中使用 thymeleaf ,并有几种看法。我不想将所有 View 保留在默认情况下为src/main/resources/templates的同一文件夹中。

是否可以在src/main/resources/templates/folder1中移动某些 View ,并且我将传递“folder1/viewname”来访问该页面?

当我尝试http://localhost:8080/folder1/layout1时,在src/main/resources/templates/folder1/中找不到我的html,但是当我在模板主文件夹src/main/resources/templates/中移动html时,http://localhost:8080/layout1正常工作。

我的 Controller 类如下所示:

@RequestMapping(value = "{pagename}", method = RequestMethod.GET)
public String mf42_layout1(@PathVariable String pagename) {
    return pagename;
}

所以,我想如果我通过layout1,它将看起来是int模板,如果我说“a/layout1”,它将看起来在/layout文件夹中

谢谢,
曼尼什

最佳答案

基本上,您的请求映射和 View 名称是分离的,您只需要注意语法即可。

例如,

@RequestMapping(value = "/foobar", method = RequestMethod.GET)
public String mf42_layout1() {
    return "layout1";
}

http://localhost:8080/foobar的请求将呈现位于src/main/resources/templates/layout1.html中的模板。

如果您将模板放在子文件夹中,只要您提供了正确的 View 路径,它也将起作用:
@RequestMapping(value = "/foobar", method = RequestMethod.GET)
public String mf42_layout1() {
    return "a/layout1";
}

http://localhost:8080/foobar的请求将呈现位于src/main/resources/templates/a/layout1.html中的模板。

您还可以使用@PathVariable参数化url端点:
@RequestMapping(value = "/foobar/{layout}", method = RequestMethod.GET)
    public String mf42_layout1(@PathVariable(value = "layout") String layout) { // I prefer binding to the variable name explicitely
        return "a/" + layout;
    }

现在,对http://localhost:8080/foobar/layout1的请求将以src/main/resources/templates/a/layout1.html呈现模板,而对http://localhost:8080/foobar/layout2的请求将呈示src/main/resources/templates/a/layout2.html中的内容

但是请注意,正斜杠充当URL中的分隔符,因此对于您的 Controller 而言:
@RequestMapping(value = "{pagename}", method = RequestMethod.GET)
public String mf42_layout1(@PathVariable String pagename) {
    return pagename;
}

我的猜测是,当您按下http://localhost:8080/a/layout1页面名时,它会收到“a”,而不会捕获“layout1”。因此, Controller 可能会尝试呈现src/main/resources/templates/a.html的内容

Spring MVC reference广泛描述了如何映射请求,您应该仔细阅读它。

10-06 13:51