【问题标题】:Errors when trying to handle templates with Thymeleaf尝试使用 Thymeleaf 处理模板时出错
【发布时间】:2018-11-26 14:54:35
【问题描述】:

早安各位! 我正在尝试使模板和片段的 Thymeleaf 部分工作,但页面上没有任何反应...

我已经测试了几种配置,但我无法做任何事情来使th:block 的这一部分工作或正确获取layout.html

有人可以帮帮我吗?见以下代码:

new.html:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"     
      xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout"
      layout:decorator="layout">

    <th:block layout:fragment="content">
        <ul>
            <li th:each="name : ${list}">
                <p th:text="${name}"></p>
            </li>
        </ul>
    </th:block>
    </html>

layout.html:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org"    
xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
<head>
    <meta charset="ISO-8859-1" />
    <title>Insert title here</title>
    <link rel="stylesheet" th:href="@{/css/bootstrap.min.css}" />
</head>
<body>

    <th:block layout:replace="fragments/header"></th:block>

    <div class="container-fluid">
        <div class="row">
            <th:block layout:fragment="content"></th:block>
        </div>
    </div>

    <script th:src="@{/js/jquery-3.3.1.min.js}"></script>
    <script th:src="@{/js/bootstrap.min.js}"></script>

</body>
</html>

header.html:

<nav class="navbar navbar-toggleable-md navbar-light bg-faded">
    <button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#nav">
        <span class="navbar-toggler-icon"></span>
    </button>
    <a href="" class="navbar-brand">Spring App</a>

    <div class="collapse navbar-collapse" id="nav">
        <ul class="navbar-nav mr-auto">
            <li class="nav-item active">
                <a href="" class="nav-link">Home</a>
            </li>
            <li class="nav-item active">
                <a href="" class="nav-link">About</a>
            </li>
        </ul>
    </div>
</nav>

InicioController:

package com.example.teste.controller;

import java.util.ArrayList;
import java.util.List;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/")
public class InicioController {

    @GetMapping("/new")
    public String newPath(Model model) {
            List<String> list = new ArrayList<String>();

        list.add("Teste 1");
        list.add("Teste 2");
        list.add("Teste 3");
        list.add("Teste 4");
        list.add("Teste 5");

        model.addAttribute("list", list);

        return "new";
    }

}

奇怪的是,Thymeleaf xmlns 没有出现……这正常吗?

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>teste</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>teste</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
                <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

我插入了另一个显示空白部分的图像,也没有出现 xmlns:th = "http://www.thymeleaf.org" 我不知道这有多正常。

new.html:

【问题讨论】:

    标签: java spring spring-boot thymeleaf


    【解决方案1】:

    更新

    问题是由依赖问题引起的,当您将以下内容添加到您的 pom.xml 时,它可以工作:

    <dependency>
      <groupId>nz.net.ultraq.thymeleaf</groupId>
      <artifactId>thymeleaf-layout-dialect</artifactId>
      <version>2.0.5</version>
    </dependency>
    

    老答案

    您的 header.html 中可能缺少片段声明,应该是这样的:

    <div th:fragment="header">    
    <nav class="navbar navbar-toggleable-md navbar-light bg-faded">
        <button class="navbar-toggler navbar-toggler-right" type="button" data-toggle="collapse" data-target="#nav">
            <span class="navbar-toggler-icon"></span>
        </button>
        <a href="" class="navbar-brand">Spring App</a>
    
        <div class="collapse navbar-collapse" id="nav">
            <ul class="navbar-nav mr-auto">
                <li class="nav-item active">
                    <a href="" class="nav-link">Home</a>
                </li>
                <li class="nav-item active">
                    <a href="" class="nav-link">About</a>
                </li>
            </ul>
        </div>
    </nav>
    </div>
    

    我还注意到您在 layout.html 中的片段声明与 new.html 中的片段声明相同。我想其中一个需要是替换标签?

    【讨论】:

    • 但是新页面没有得到页面布局 layout.html
    • 没错,你需要把你要使用的布局部分包装在一个fragment中,然后在new.html中调用replace来获取你新页面中的那些fragment
    • 我做了你推荐的这个测试,但它继续以同样的方式。如果可以看一下,我将其上传到github。 https://github.com/sounobre/thymeleaf我插入了另一个图像,显示 空白部分,也没有出现 xmlns: th = "thymeleaf.org" 我不知道这有多正常。
    • 我添加了一个更新,为我修复了你的 repo 的克隆@sounobre
    • 我的朋友,它运行良好。你是怎么得出这个结论的?一些我未能验证的文件?感谢您的帮助,对于某些人来说,这似乎微不足道,但我非常感谢您的关注和您愿意帮助我的意愿。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 2016-12-21
    • 2021-11-05
    • 1970-01-01
    相关资源
    最近更新 更多