2017-09-22 99 views
-1

試圖將表單提交時的變量傳遞給結果頁面,但每次都返回null。無論我嘗試了多少變化。無法找到Thymeleaf模板中的佔位符null

所以我得到映射,後爲login.html的:

@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是這樣的:

的User.java文件
<!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> 

部分:

@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

@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,明確設置模型的name屬性

model.addAttribute("User2", new User()); 

你可以做你的@PostMapping例如以及

@PostMapping("/login") 
public String greetingSubmit(@ModelAttribute(name = "User") User regUser) {