2017-09-22 15 views
-1

フォーム送信時に変数を結果ページに渡そうとしましたが、1回ごとにnullが返されます。どんなに多くのバリエーションを試しても問題ありません。Thymeleafテンプレートのプレースホルダがnullに見つかりません

だから私は、取得し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; 
    } 

@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には、次のようになります

、result.htmlは

です。

それを繰り返し、この行にはnullエラーを投げ続ける:

<p th:text="'username: ' + ${User.name}" /> 

特に${User.name}、だから私は、私が考えることができるすべてのものを試してみた

org.springframework.expression.spel.SpelEvaluationException: EL1007E: Property or field 'name' cannot be found on null

のように見えるものof、

${User2.name} 
${User} 
${User2} 
${regUser.name} 
${teststr} 
${#User.name} 

など....

私がSystem.out.println(regUser.getName()); のコメントを解除した場合にそれだけで罰金、ユーザーの名前を印刷しますが、変数を渡さないということは非常に奇妙です。それは私のプレースホルダですか、Userオブジェクトなので、th:textとして渡すことはできませんか?私は非常に混乱して助けてください!

編集:チュートリアルを続けました(https://spring.io/guides/gs/handling-form-submission/) チュートリアルをコピーするとうまくいきますが、文字列を渡すだけです。 User.nameは文字列変数になります...

答えて

0

@ModelAttributeの要素の名前はnameです。そのjavadoc状態

バインドするモデル属性の名前。

デフォルトのモデル属性名は、非修飾クラス名に基づいて、 属性タイプ(つまり、メソッドパラメータタイプまたはメソッドの戻り値タイプ)であると推定されます(例: )。クラス "mypackage.OrderAddress"の場合は"orderAddress"、 の場合は"List<mypackage.OrderAddress>"の場合は"orderAddressList"です。

この要素の値を指定したので、Spring MVCはデフォルト値を使用します。上で述べたように、デフォルトはパラメータのタイプ(User)から推定されます。この例に従うと、の属性名はuserであり、Userではなくなります。

あなたのプレースホルダが

${user.name} 

これを読むべき、モデルの属性名が明示的に指定されていない場合はどうなり、春のリファレンスマニュアルにhere

を説明していますか? この場合、デフォルトの名前がそのタイプの に基づいてモデル属性に割り当てられます。たとえば、メソッドが Accountのオブジェクトを返す場合、使用されるデフォルトの名前は"account"です。 は、@ModelAttribute注釈の値で変更できます。 属性をModelに直接追加する場合は、適切なオーバーロードされた addAttribute(..)メソッドを使用してください(属性名の有無にかかわらず)。あなたの@GetMapping


は、明示的にモデルの名前が

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

あなたは同様にあなたの@PostMapping例のためにそれを行うことができ

@PostMapping("/login") 
public String greetingSubmit(@ModelAttribute(name = "User") User regUser) { 
属性設定します
関連する問題