【问题标题】:How to switch from many @RequestParam arguments to @ModelAttribute in a Spring Controller method如何在 Spring Controller 方法中从许多 @RequestParam 参数切换到 @ModelAttribute
【发布时间】:2012-08-25 01:16:43
【问题描述】:

我是 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 行? 我还需要在模型类(FormResults、Topic、Wave)中添加@ModelAttribute 注释吗?

谢谢。

【问题讨论】:

    标签: java spring jsp controller spring-annotations


    【解决方案1】:

    @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
    }
    

    【讨论】:

    • 你好,感谢发帖,我的问题是:如何从 jsp 页面发送对象选项选项?因为我发布的控制器正在处理来自 jsp 视图的 /updateEntry 请求,它正在处理从表单发送的数据,所以我不知道这是如何工作的?
    • @adrianbob:/updateEntry?id=4&selectedWaveName=xxx 这样的东西会起作用。
    【解决方案2】:

    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、wave,然后是类属性,例如:topic.id、wave.id ...

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

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

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

    【讨论】:

    • 给未来读者的提示:您也可以创建与参数同名的 setter(例如 public void setAction(private String action) {}),它将通过 Spring 自动调用。这样,您就不会受限于请求对象中的请求参数名称( FormResults)。例如,您可以使用 private String lastAction 来代替 - 只需在 setter 中适当地设置它即可。
    猜你喜欢
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 2013-04-09
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-28
    相关资源
    最近更新 更多