Thymeleaf 和 Spring MVC 的表单参数为 null
Form parameter is null with Thymeleaf and Spring MVC
我在使用 Thymeleaf 和 Spring MVC 时遇到问题。
我正在学习 spring.io 网站 http://spring.io/guides/gs/handling-form-submission/ 的教程,当我尝试扩展本教程时,我 运行 遇到了问题。
如果我向我的模型添加另一个参数 class(在我的示例中,我添加了一个日期参数和一个长参数),而不是将它们放在我的视图中(想象一下这个日期参数是我的最后修改日期,这个长参数是一个 运行dom 值),当我提交这个值时,它使我的方法中的这 2 个参数为空。
这是我的一些代码。
我的模型Class
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>
这是我模型的控制台打印图 class
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]
如您所见,我的两个不在我的视图中的参数在 post(第二行)和第一行之后变为 null,它们具有值。我不明白为什么,因为我来自另一个好的框架(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;
}
}
这是预期的行为。你在 response
中有 model
,同时得到你的问候 view
,但只要 http
request/response
完成,它就不再存在.您将在 <form>
标签中保存值,并且需要在 form
submit
.
时提供这些值
意思是,如果你想发回这些值,你需要添加 2 个隐藏的 input
s 来保存这两个值。
<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>
我在使用 Thymeleaf 和 Spring MVC 时遇到问题。
我正在学习 spring.io 网站 http://spring.io/guides/gs/handling-form-submission/ 的教程,当我尝试扩展本教程时,我 运行 遇到了问题。
如果我向我的模型添加另一个参数 class(在我的示例中,我添加了一个日期参数和一个长参数),而不是将它们放在我的视图中(想象一下这个日期参数是我的最后修改日期,这个长参数是一个 运行dom 值),当我提交这个值时,它使我的方法中的这 2 个参数为空。
这是我的一些代码。
我的模型Class
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>
这是我模型的控制台打印图 class
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]
如您所见,我的两个不在我的视图中的参数在 post(第二行)和第一行之后变为 null,它们具有值。我不明白为什么,因为我来自另一个好的框架(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;
}
}
这是预期的行为。你在 response
中有 model
,同时得到你的问候 view
,但只要 http
request/response
完成,它就不再存在.您将在 <form>
标签中保存值,并且需要在 form
submit
.
意思是,如果你想发回这些值,你需要添加 2 个隐藏的 input
s 来保存这两个值。
<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>