Thymeleaf和Spring MVC的Form参数为null


问题内容

我在Thymeleaf和Spring MVC上遇到问题。

我正在遵循spring.io网站http://spring.io/guides/gs/handling-form-
submission/上
的教程,当我尝试扩展本教程时,遇到了一个问题。

如果我在模型类中添加了另一个参数(在示例中,我添加了Date参数和long参数),而没有将它们放在视图中(请想象此date参数是我的最后修改日期和long参数)是一个随机值),当我提交此值时,这会使我的方法中的这2个参数为空。

这是我的一些代码。

我的模特班

public class Greeting {

    private long id;
    private String content;
    private Date hour;
    private long longNumber;
.... getters and setters ....
}

我的控制器

@Controller
public class GreetingController {

@RequestMapping(value="/greeting", method=RequestMethod.GET)
public String greetingForm(Model model) {

    Greeting greeting = new Greeting();
    greeting.setHour(new Date());
    greeting.setLongNumber(1234L);
    System.out.println(greeting.toString());
    model.addAttribute("greeting", greeting);
    return "greeting";
}

@RequestMapping(value="/greeting", method=RequestMethod.POST)
public String greetingSubmit(@ModelAttribute Greeting greeting, Model model) {
    System.out.println(greeting.toString());
    model.addAttribute("greeting", greeting);
    return "result";
}
}

我的表格

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Getting Started: Handing Form Submission</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <h1>Form</h1>
    <form action="#" th:action="@{/greeting}" th:object="${greeting}" method="post">
        <p>Id: <input type="text" th:field="*{id}" /></p>
        <p>Message: <input type="text" th:field="*{content}" /></p>
        <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
    </form>
</body>
</html>

结果页

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>Getting Started: Handing Form Submission</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
    <h1>Result</h1>
    <p th:text="'id: ' + ${greeting.id}" />
    <p th:text="'content: ' + ${greeting.content}" />
    <p th:text="'Date: ' + ${greeting.hour}" />
    <a href="/greeting">Submit another message</a>
</body>
</html>

这是我的模型课的控制台打印

Greeting [id=0, content=null, hour=Sun Apr 26 22:29:25 GMT-03:00 2015, longNumber=1234]
Greeting [id=0, content=aaaa, hour=null, longNumber=0]

如您所见,我不在视图中的两个参数在发布后(第二行)变为空,在第一行中,它们都有值。我不明白为什么,因为我来自另一个好的框架(JSF),并且那里没有这样的问题。要知道,就像教程中一样,我正在使用spring
4,为什么我的视图中没有参数?因为其中一些参数将像上次注册者更新日期一样保存一些数据,所以最后一个更新了注册者的用户和我的应用程序ID。

谁能帮我找到答案吗?

编辑:

经过一段时间的试验,我找到了解决问题的方法。遵循我的代码,该代码可以正常工作:

@Controller
@SessionAttributes({"obj"})
public class MyController {

    @RequestMapping(value = "/path", method = RequestMethod.GET)
    public ModelAndView myGet() {       
        ModelAndView modelAndView = new ModelAndView("view");
        MyClass object = new MyClass();
        modelAndView.addObject("obj", object );     
        return modelAndView;
    }

    @RequestMapping(value = "/path", method = RequestMethod.POST)
    public ModelAndView myPost(@ModelAttribute("obj") @Validated MyClass object, BindingResult result){

        ModelAndView modelAndView = new ModelAndView("view");       
        if(result.hasErrors())
            modelAndView.addObject("obj",object);
        else 
            service.save(object);
        return modelAndView;
    }   
}

问题答案:

这是预期的行为。你有modelresponse进入您的问候,同时view,但只要是http
request/response做,它不存在了。您将把这些值保留在<form>标记中,并且需要在上提供这些值form submit

意思是,如果要发回这些值,则需要添加2个隐藏inputs来保存这两个值。

<form action="#" th:action="@{/greeting}" th:object="${greeting}" method="post">
    <p>Id: <input type="text" th:field="*{id}" /></p>
    <p>Message: <input type="text" th:field="*{content}" /></p>
    <input type="hidden" th:field="*{hour}" />
    <input type="hidden" th:field="*{longNumber}" />
    <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
</form>