Thymeleaf 表单将除一个输入之外的所有输入传递给 java 控制器



我的百里香叶表单有三个输入,当我提交它时,我的控制器正在接收第二个和第三个,但不是第一个(第一个输入为空(

我有类似的形式和方法来将记录添加到MySQL数据库,这些记录可以毫无问题地工作。 我已经在我的控制器中播放了前两个输入,第一个(实体的 ID(为空,第二个消息灵通

这是我的表格: 添加部门.html

<br/>
<form th:action="@{/university/addDepartment}"
th:object="${department}" method="POST">
Department Name
<input type="text" th:field="*{deptName}" />    
<br/>
Department building
<input type="text" th:field="*{building}" />    
<br/>
Budget
<input type="number" th:field="*{budget}" th:value=0/>    
<br/>
<input type="submit" value="Add" />
</form>
<!-- Check if errorMessage is not null and not empty -->
<div th:if="${errorMessage}" th:utext="${errorMessage}"
style="color:red;font-style:italic;">
...
</div>

还有我的控制器

// ADD a department to the database
// Show the addDepartment page
@RequestMapping(value= { "university/addDepartment" }, method = RequestMethod.GET)
public String showAddDepartment(Model model) {
Department department = new Department();
model.addAttribute("department", department); 
return "addDepartment";
}
// Add the department to the database
@RequestMapping(value = { "university/addDepartment" }, method = RequestMethod.POST)
public String saveDepartment(Model model, //
@ModelAttribute("department") 
@Validated Department department) {
System.out.println("DEPARTMENT: " + department.toString());
String deptName = department.getDeptName();
System.out.println("DEPARTMENT NAME: " + deptName); 
String building = department.getBuilding();  
System.out.println("BUILDING: " + building); 
int budget = department.getBudget(); 
if (deptName != null && deptName.length() > 0 //
&& building != null && building.length() > 0 //
&& budget >= 0) {
Department newDepartment = new Department(deptName, building, budget);
departmentrepo.save(newDepartment);
return "redirect:/university/departmentList";
}
Object errorMessage = "All fields are mantatory";
model.addAttribute("errorMessage", errorMessage );              
return "addDepartment";
}

这是部门类:

@Entity
@Table(name="department") // This annotation is needed only if the 
table has a different name to this class
@EntityListeners(AuditingEntityListener.class)
public class Department {
@Id
private String deptName;
private String building;
private int budget; 
//Constructors
public Department() {       
}
public Department(String deptName, String building, int budget) {
this.deptName = deptName;
this.building = building;
this.budget = budget;
}
...GETTERS and SETTERS 

deptName 始终为空,但其他两个输入正常

部门名称:空 建筑:主楼

更新:我想我找到了解决方案,但如果有人能解释原因...... 我刚刚在@RequestParam注释中传递了 deptName。

@RequestMapping(value = { "university/addDepartment" }, method = 
RequestMethod.POST)
public String saveDepartment(Model model, //
@ModelAttribute("department") Department department,
@RequestParam("deptName")  String deptName) {
//String deptName = department.getDeptName();
System.out.println("DEPARTMENT NAME: " + deptName); 
String building = department.getBuilding();  
System.out.println("BUILDING: " + building); 
int budget = department.getBudget(); 
if (deptName != null && deptName.length() > 0 //
&& building != null && building.length() > 0 //
&& budget >= 0) {
Department newDepartment = new Department(deptName, building, budget);
departmentrepo.save(newDepartment);
return "redirect:/university/departmentList";
}
Object errorMessage = "All fields are mantatory";
model.addAttribute("errorMessage", errorMessage );              
return "addDepartment";
}x`

此代码存在一些问题,但首先要尝试的是从deptName属性中删除@Id注释。 创建一个Long(或Integer(id属性并改为对其进行批注。 您也可以更简单地调用部门名称属性name

您还需要确保正确完成getter和setter,或者更可取 - 只需使用Project Lombok来摆脱多余的文本和潜在的错误。

@Entity
@Table
@Data //see Project Lombok
public class Department {
@Id
private Long id;
private String name;
private String building;
private int budget; //I'd consider making this more precise by using BigDecimal
}

对于您的控制器,让我们更简单地尝试一下,看看它是否仍然损坏。

@GetMapping("/university/addDepartment")
public String showAddDepartment(Model model) {
model.addAttribute("department", new Department()); 
return "addDepartment";
}
@PostMapping("/university/addDepartment")
public String saveDepartment(@ModelAttribute("department") Department department) {
System.out.println("name="+department.getName()); //use a logger if you have one available
return "addDepartment";
}

在您的表单中,如果您希望 Thymeleaf 评估逻辑,则只需要th:表示法。 因此,如果您真的打算这样做,您可以将th:value=0更改为value=0

最新更新