我遇到了Thymeleaf和Spring MVC的问题.
我正在关注spring.io网站http://spring.io/guides/gs/handling-form-submission/的教程,当我试图扩展本教程时,我遇到了一个问题.
如果我在模型类中添加另一个参数(在我的例子中,我添加了一个Date参数和一个long参数),而不是将它们放在我的视图上(想象一下这个日期参数是我的最后修改日期和这个长参数是一个随机值),当我提交这个值时,它会使我的方法中的这2个参数为null.
这是我的一些代码.
我的模特班
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";
}
}
我的表格
结果页面
这是我的模型类的控制台打印
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;
}
}
这是预期的行为.在获取问候视图时,您在响应中有模型,但只要完成http请求/响应,它就不再存在.您将保留< form>中的值.标签,您需要在表单提交时提供这些值.
这意味着,如果要将这些值发回,则需要添加2个隐藏输入来保存这两个值.