当前位置: 首页 > 知识库问答 >
问题:

如何在Spring控制器方法中从多个@RequestParam参数切换到@ModelAttribute

谷善
2023-03-14

我是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);
}

我怎样才能用更少的行替换整个@刚体属性行?我是否还需要将@ModelAtinn注释添加到模型类(Form结果,主题,波)?

谢谢。

共有2个答案

解晟睿
2023-03-14

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)。您所要做的就是用类名的前缀命名这些输入:ex:topic,wave,然后是class属性,ex:topic。id,挥手。身份证件

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

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

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

江智
2023-03-14

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

@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
}
 类似资料:
  • 给出了一种Spring-MVC控制器的方法: 如果请求URL中缺少参数,则报告一个错误,例如: JBWeb000068:message Required int参数“param1”不存在 如果省略,则可以执行此操作,但问题是,如果缺少参数,则不会报告任何错误。另一方面,如果包含,则在GET请求中需要一个名为“model”的参数。有没有一种方法可以使模型参数成为强制性的,同时保持相同的请求URL?

  • 有没有一种简单的方法可以将URL中的多个参数打包到一个单元中,并将其发送到Spring MVC控制器? 此外,我们如何处理不同数量的参数,例如,如果我有一些信息列表的大小不同?

  • 我想验证请求参数。我已经浏览了很多博客并回答了问题,我也做了同样的事情。在控制器类上添加了@Validated。 控制器中的方法: 控制器建议 配置: 完成所有这些之后,现在我得到一个404错误。"状态":404,"错误":"未找到","消息":"没有可用的消息"

  • 我有一个调查表列表,每个表都有一个按钮/asp操作,可以查看至少3个竞争对手的答案。但我需要使用模式选择调查表中的竞争对手。在该模式中,我应该在主体中填充一个复选框,其中包含回答该调查表的竞争对手。如何将数据切换模式导入控制器? 以下是我的看法: 这是我的控制器,它应该将值返回到索引模式: 我应该在正文中填入回答该调查表的竞争对手的复选框。但每当我单击“查看竞争对手”时,它不会转发给控制器。