Thymeleaf将一页错误呈现在另一页上

时间:2019-08-27 18:04:32

标签: java html spring-boot thymeleaf

我可以将汽车清单返回localhost:8080/list,但不能返回 localhost:8080/car。我的目标是在car.html中的Car Form下方显示列表。

使用Thymeleaf渲染列表时,我尝试了两种方案:将控制器方法getAllCars()映射到/list时,我可以在list.html上渲染列表,但是使用相同的映射方法到/car时出现错误,尝试渲染为car.html时出现错误。

我确定这里缺少一些小东西。尝试在car.html上呈现列表时,可能是我对控制器方法的使用。我在html上成功使用的list.html与通过汽车表格将其添加到car.html时使用的相同。我只是注释/取消注释必要的代码以尝试每种情况。

工作场景:在CarController中使用getAllCars()方法映射到list.html

@Controller
public class CarController {

    @Autowired
    private CarService carService;

    //PRESENT VIEW car.html
    @GetMapping("/car")
    public String carForm(Model model) {
        model.addAttribute("car", new Car());
        return "car";
    }

    //GET list of cars. render to /list
    @RequestMapping("/list")
    public String getAllCars(Model model) {
        model.addAttribute("cars", carService.getAllCars());
        return "list";
    }

    //GET list of cars. Render to /car
//    @RequestMapping("/car")
//    public String getAllCars(Model model) {
//        model.addAttribute("cars", carService.getAllCars());
//        return "car";
//    }

    //POST TO DATABASE
    @PostMapping("/car")
    public void carSubmit(@ModelAttribute Car car) {
        carService.addCar(car);
    }

}

list.html->效果很好

这是html代码

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>Car List</h1>

<table>
    <thead>
        <tr>
            <th>Id</th>
            <th>Make</th>
            <th>Model</th>
            <th>Year</th>
        </tr>
    </thead>
    <tbody>
        <!-- if true, display this       -->
        <tr th:if="${!cars}">
            <td colspan="2"> No Cars Available</td>
        </tr>
        <!--  otherwise, iterate over list and display info      -->
        <tr th:each="car : ${cars}">
            <td><span th:text="${car.id}">Id</span></td>
            <td><span th:text="${car.make}">Make</span></td>
            <td><span th:text="${car.model}">Model</span></td>
            <td><span th:text="${car.year}">Year</span></td>

    </tbody>
</table>
</body>
</html>

非工作场景:在映射到car.html的CarController中使用getAllCars()方法

为简便起见,请参见上面CarController中的注释getAllCars()方法 car.html->这不起作用

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>Car Form</h1>
<form action="#" th:action="@{/car}" th:object="${car}" method="post">
    <p>Id: <input type="text" th:field="*{id}" /></p>
    <p>Make: <input type="text" th:field="*{make}" /></p>
    <p>Model: <input type="text" th:field="*{model}" /></p>
    <p>Year: <input type="text" th:field="*{year}" /></p>
    <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
</form>

<h1>Car List</h1>

<table>
    <thead>
    <tr>
        <th>Id</th>
        <th>Make</th>
        <th>Model</th>
        <th>Year</th>
    </tr>
    </thead>
    <tbody>
    <!-- if true, display this       -->
    <tr th:if="${!cars}">
        <td colspan="2"> No Cars Available</td>
    </tr>
    <!--  otherwise, iterate over list and display info      -->
    <tr th:each="car : ${cars}">
        <td><span th:text="${car.id}">Id</span></td>
        <td><span th:text="${car.make}">Make</span></td>
        <td><span th:text="${car.model}">Model</span></td>
        <td><span th:text="${car.year}">Year</span></td>

    </tbody>
</table>
</body>
</html>

这是我面临的错误

2019-08-27 12:30:32.519 ERROR 22384 --- [nio-8080-exec-1] org.thymeleaf.TemplateEngine             : [THYMELEAF][http-nio-8080-exec-1] Exception processing template "car": Exception evaluating SpringEL expression: "!cars" (template: "car" - line 33, col 9)

org.thymeleaf.exceptions.TemplateProcessingException: Exception evaluating SpringEL expression: "!cars" (template: "car" - line 33, col 9)

3 个答案:

答案 0 :(得分:1)

我想我遇到了你的问题。您正在使用控制器重定向到car.html

 @GetMapping("/car")
    public String carForm(Model model) {
        model.addAttribute("car", new Car());
        return "car";
    }

在同一页面上,您将同时显示汽车列表和表格保存。但是您没有在此控制器中放入carsmodel。这就是为什么您收到模板错误的原因。要解决此问题,您需要将cars放在前一个控制器中。因此,修改您的控制器

 @GetMapping("/car")
    public String carForm(Model model) {
        model.addAttribute("car", new Car());
        return "car";
    }

@GetMapping("/car")
public String carForm(Model model) {
    model.addAttribute("car", new Car());
    model.addAttribute("cars", carService.getAllCars());
    return "car";
}

现在发布汽车后,您必须重定向到页面。但是你没有那样做。因此,修改您的控制器

 @PostMapping("/car")
    public void carSubmit(@ModelAttribute Car car) {
        carService.addCar(car);
    }

 @PostMapping("/car")
    public String carSubmit(@ModelAttribute Car car) {
        carService.addCar(car);
        return "redirect:/car"
    }

希望它会起作用。喊一声!

答案 1 :(得分:0)

这就是说!cars出现问题,可以在car模板中找到

    <tr th:if="${!cars}">
        <td colspan="2"> No Cars Available</td>
    </tr>

但是,在carForm中传递给汽车模板的属性是car,而不是cars

答案 2 :(得分:0)

我认为问题在于,您正在使用2种不同的方法重定向到car.html。 所以只有第一个,即

@GetMapping("/car")
public String carForm(Model model) {
   model.addAttribute("car", new Car());
   return "car";
}

正常工作,

@RequestMapping("/car")
    public String getAllCars(Model model) {
    model.addAttribute("cars", carService.getAllCars());
    return "car";
}

所以你可以做,

@GetMapping("/car")
public String carForm(Model model) {
   model.addAttribute("car", new Car());
   return getAllCars(model);
}

或完全使用任何一种方法,甚至为两者提供不同的网址映射

  

也请让我知道为什么您完全注释掉了   getallcars方法?您在遇到任何歧义的映射错误时   取消注释该方法。