4

我是 spring 新手,我设法从 JSP 视图中的表单收集数据并将我的表单提交给控制器。从视图获取的数据中,我正在实例化一个模型对象,该对象还包含其他模型对象:

@RequestMapping(value = "/updateEntry", method = RequestMethod.GET)
public RedirectView updateAction(ModelAndView model,
@RequestParam(value = "name", defaultValue = "none") String selectedWaveName,
@RequestParam(value = "id", defaultValue = "-1") int id,
@RequestParam(value = "function", defaultValue = "none") String function,
@RequestParam(value = "evidence", defaultValue = "none") String evidence,
@RequestParam(value = "action", defaultValue = "none") String action,
@RequestParam(value = "topicId", defaultValue = "-1") int topicId,
@RequestParam(value = "topic", defaultValue = "none") String topic,
@RequestParam(value = "topicDesc", defaultValue = "none") String topicDesc,
@RequestParam(value = "waveId", defaultValue = "-1") int waveId,
@RequestParam(value = "waveStart", defaultValue = "none") String waveStart,
@RequestParam(value = "waveEnd", defaultValue = "none") String waveEnd)
throws ParseException {

DateFormat formatter = new SimpleDateFormat("dd-MM-yyyy");
Date dateStart = formatter.parse(waveStart);;
Date dateEnd = formatter.parse(waveEnd);

waveDAO.updateFormResults(new FormResults(id, 
new Topic(topicId, topic, topicDesc), 
new Wave(waveId, selectedWaveName, dateStart, dateEnd), 
evidence, action, function));
return new RedirectView("/hr/?name=" + selectedWaveName);
}

如何使用 @ModelAttribute 用更少的行替换整个 @RequestParam 行?我是否还需要将 @ModelAttribute 注释添加到模型类(FormResults、Topic、Wave)?

谢谢。

4

2 回答 2

3

@ModelAttribute这里真的不需要。我通常做的(但可能不适合你的情况)是一个包含所有这些数据的对象:

@RequestMapping(value = "/updateEntry", method = RequestMethod.GET)
public RedirectView updateAction(ModelAndView model, Options options) throws ParseException {
    ...
}

public static class Options {
    private String selectedWaveName,
    private int id,
    ...
    // Getters and setters
}
于 2012-08-30T10:26:36.430 回答
1

ModelAttribute 注释最终确实起作用了,我发现当使用这个注释时,你从前端传递的变量,在我的例子中,来自 JSP 页面,应该与你声明的属性具有完全相同的名称是模特班!

例如,如果您有一个模型类,例如:

public class FormResults {

private int id;
private Topic topic;
private Wave wave;
private String evidence;
private String action;
private String manager;
 ... }

您还需要所有类属性的 getter 和 setter 方法,以及默认构造函数!

您从 JSP 页面发送到使用 @ModelAttribute 注释的控制器方法的变量将被命名为:

<input type="text" name="id"     ...
<input type="text" name="evidence" ...
<input type="text" name="action"   ....
<input type="text" name="manager"  ...

这也适用于您有一个具有另一个对象作为属性的复杂对象的情况(例如在我的情况下:Topic、Wave)。您所要做的就是用类名的前缀命名这些输入:例如:主题,波,然后是类属性,例如:topic.id,wave.id ...

这是我的控制器方法的签名:

@RequestMapping(value = "/updateEntry", method = RequestMethod.GET)
public ModelAndView updateAction(ModelAndView model,
        @ModelAttribute("fr") FormResults fr) throws ParseException {
...}

Spring 自动创建一个 FormResults 对象。就是这样!:)

于 2012-09-16T20:25:13.403 回答