我可以将汽车清单返回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)
答案 0 :(得分:1)
我想我遇到了你的问题。您正在使用控制器重定向到car.html
页
@GetMapping("/car")
public String carForm(Model model) {
model.addAttribute("car", new Car());
return "car";
}
在同一页面上,您将同时显示汽车列表和表格保存。但是您没有在此控制器中放入cars
和model
。这就是为什么您收到模板错误的原因。要解决此问题,您需要将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
方法?您在遇到任何歧义的映射错误时 取消注释该方法。