【问题标题】:Spring - ModelAttribute and parameter namesSpring - ModelAttribute 和参数名称
【发布时间】:2011-11-06 10:35:14
【问题描述】:

如何配置模型/命令类以绑定到特定的请求参数?

例如我有以下方法:

@RequestMappint("/success")
ModelAndView success(@ModelAttribute SomeCommand command) {
   // process
}

和命令:

class SomeCommand {
   String title
}

当请求参数名称等于命令属性名称时,它适用于像 /success?title=test 这样的请求。

但是如果我需要映射一些不同的名称怎么办?例如,如果请求像:/success?sk_title=test

如何将请求参数sk_title 映射到命令的title 字段?

这个命令有一堆参数,并被几种不同的方法使用(它是与其他遗留系统的集成),所以将所有这些参数作为@RequestParam因为每个 RequestMapped 方法都需要大量的工作,并且需要太多的复制/粘贴工作,这会带来很多错误和不支持的代码。

我对输入参数名称无法控制,它的名称非常奇怪,例如“sk_yt_saf_amount”,这就是我尝试将其绑定到更友好的属性名称的原因。

PS 我在那里使用“命令”一词作为输入数据,以将其与 Model 和 ModelAndView 概念区分开来。

【问题讨论】:

  • 你不想在这里使用@RequestParam("sk_title") 之类的东西吗?
  • 我这里有几十个参数,所以为它们准备一个容器要容易得多。而且它在少数地方/少数具有不同逻辑但相同数据结构的url中使用
  • 如果是这种情况,请在您的页面 GET 请求中执行 model.addAttribute("myuser", new MyUser()) 然后在您的 @RequestMapping("/success") 方法中添加 @ModelAttribute (“我的用户”)。在您的 JSP 表单中,使用 spring 表单帮助器标记
    。这将有助于将所有提交的参数存储到您的模型中。
  • 对不起,我问的是输入参数(POST,如果有意义的话)
  • @IgorArtamonov 你得到答案了吗?

标签: java spring


【解决方案1】:

如果要将请求参数sk_title映射到title字段,则添加名称为sk_title的setter:

public class SomeCommand {
    private String title;

    public String getTitle() {
        return title;
    }

    public void setSk_title(String title) {
        this.title = title;
    }
}

【讨论】:

    【解决方案2】:
        @RequestMapping("/success")
        ModelAndView success(@RequestParam("sk_title") String title) {
           SomeCommand command = new SomeCommand();
           command.setTitle(title);
           model.addAttribute("title", command);
           //rest of code here
        }
    
    class SomeCommand {
       String title
       public void setTitle(String title){
        this.title = title;
       }
    }
    

    如果您可以控制视图上的 name 属性,则可以使这更简单。只需更改名称属性以匹配 SomeCommand 对象字段,spring 将自动绑定它们。 How to bind request params in spring 3.0? 您仍然需要将命令添加到模型中,并且此答案假定您使用的是 Spring 3 或更高版本。我假设 spring 可能还需要 SomeCommand 对象的字段上的 getter 和 setter。

    @RequestMapping
    public ModelAndView success(SomeCommand someCommand) {
       model.addAttribute("someCommand", someCommand);
    }
    

    【讨论】:

    • 抱歉,我问的是如何填写 SomeCommand 属性
    • @splix 代码已更新,因为我更好地理解了您的问题。
    • 好主意,但是没有手动参数映射我怎么能做到呢?更容易和春天的方式。也许是注释?或 DataBinder 配置?它是 Command 中的很多属性,并且它被少数操作使用 - 那里将有很多复制/粘贴
    猜你喜欢
    • 2012-12-20
    • 2012-05-05
    • 2012-08-25
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    相关资源
    最近更新 更多