尝试将表单提交上的变量传递给结果页面,但每次都返回null。无论我尝试了多少变化。
所以我为login.html映射get和post:
@GetMapping("/login")
public String greetingForm(Model model) {
model.addAttribute("User2", new User());
return "login";
}
@PostMapping("/login")
public String greetingSubmit(@ModelAttribute User regUser) {
//userRepository.save(regUser);
//String teststr = regUser.getName();
//System.out.println(teststr);
return "result";
}
实际的Login.html如下所示:
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Getting Started: Handling Form Submission</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>Form</h1>
<form action="#" th:action="@{/demo/login}" th:object="${User2}" method="post">
<p>Username: <input type="text" th:field="*{name}" /></p>
<p>Password: <input type="text" th:field="*{password}" /></p>
<p>Balance: <input type="text" th:field="*{balance}" /></p>
<p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
</form>
</body>
</html>
User.java文件的一部分:
@Entity // This tells Hibernate to make a table out of this class
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
private String name;
private String password;
private int balance;
public int getBalance() {
return balance;
}
public void setBalance(int balance) {
this.balance = balance;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
并且result.html是:
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Getting Started: Handling Form Submission</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<h1>Result</h1>
<p th:text="'username: ' + ${User.name}" />
<p th:text="'password: ' + ${regUser != null ? regUser.password : 'NOT FOUND'}" />
<p th:text="'balance: ' + ${model != null ? regUser.balance : 'NOT FOUND'}" />
<a href="/demo/login">Submit another user?</a>
</body>
</html>
它会在此行上反复抛出空错误:
<p th:text="'username: ' + ${User.name}" />
具体为${User.name}
,看起来像
org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'name' cannot be found on null
所以我已经尝试了我能想到的一切,
${User2.name}
${User}
${User2}
${regUser.name}
${teststr}
${#User.name}
等...
如果我取消注释System.out.println(regUser.getName());
,这很奇怪
它会很好地打印用户名,但不会传递该变量。它是我的占位符还是不能作为th:text
传递,因为它是User
对象?请帮助我非常困惑!
编辑:我遵循的教程(https://spring.io/guides/gs/handling-form-submission/) 如果你复制教程它工作得很好,但它只传递一个字符串。虽然User.name是一个字符串变量......
答案 0 :(得分:0)
@ModelAttribute
有一个名为name
的元素。它的javadoc陈述
要绑定到的模型属性的名称。
默认模型属性名称是从声明的推断出来的 属性类型(即方法参数类型或方法返回类型), 基于不合格的类名:例如课程
"orderAddress"
"mypackage.OrderAddress"
或"orderAddressList"
"List<mypackage.OrderAddress>"
。
由于您为此元素提供了值,因此Spring MVC使用默认值。如上所述,默认值是从参数类型推断出来的,即User
。如果您按照示例操作,则该属性名称将为user
,而不是User
。
您的占位符应为
${user.name}
Spring参考文档here
中也对此进行了解释未明确指定模型属性名称时会发生什么? 在这种情况下,默认名称将分配给基于模型属性 在它的类型。例如,如果方法返回类型的对象
Account
,使用的默认名称为"account"
。你可以改变它 通过@ModelAttribute
注释的值。如果加入 直接归属于Model
,使用适当的重载addAttribute(..)
方法 - 即带或不带属性名称。
在@GetMapping
中,您明确设置了模型属性的名称
model.addAttribute("User2", new User());
您也可以为@PostMapping
示例执行此操作
@PostMapping("/login")
public String greetingSubmit(@ModelAttribute(name = "User") User regUser) {