• SpringMVC 传递相同名称的参数的最佳方法


    SpringMVC 多个对象的相同字段参数传递解决方案,在SpringMVC中,有时需要传递多个对象(除了Model和web元素)

    众所周知,在SpringMVC中不支持类似struts2的点语法传参法则,因此多个对象同名参数传递势必会造成一定的问题。


    1. SpringMVC的参数传递非常智能,可自动装配参数到对象

    public class User{
     private String name;
     private String id;
     private String gender,
     private String age;
      //getter 和setter
    }
    ----------------------------------
    public class Food{
     private String name;
     private String id;
     private String price,
     private String date;
     //getter 和setter
    }
    -------
    <form method='post' action='url'>
    用户名 <input type='text' name='name'>
    用户id <input type='text' name='id'>
    食品名 <input type='text' name='name'>
    食品id <input type='text' name='id'>
     <input type='text' name='gender'>
     <input type='text' name='age'>
     <input type='text' name='price'>
     <input type='text' name='date'>
    </form>
    

    @requestMap(value={'/order/book'})
    public string show(User u,Food f){}

    在上述情况下User 和food都不能得到正确的name和id,或者说更本得不到,这要是struts2就方便多了,直接使用点语法 u.name,u.id,f.name,f.id....


    为了解决上述问题,有2中方案:


    1.是建立一个DTO

    优点是可以认为的避免参数的传递,直接改dto的字段名 u_name,u_id,f_name,f_id,gender,age,date,price都要列出来,然后作如下操作

    然后修改表单字段和contoller

    <form method='post' action='url'>
    用户名 <input type='text' name='u_name'>
    用户id <input type='text' name='u_id'>
    食品名 <input type='text' name='f_name'>
    食品id <input type='text' name='f_id'>
     <input type='text' name='gender'>
     <input type='text' name='age'>
     <input type='text' name='price'>
     <input type='text' name='date'>
    </form>
    

    @requestMap(value={'/order/book'})
    public string show(UserFoodDto dto){
    //然后拆分,将字段
    User u = new User();
    Food f = new Food();

    u.setName(dto.getUname());
    f.setName(dto.getname());

    u.setUid(dto.getUid());
    f.setFid(dto.getFid());

    u.setAge(dto.getAge);
    f.setPrice(dto.getPrice);
    .....
    }

    缺点是:如果数据量大,100百个字段,修改的地方自然越多,而且一个dto,拆分也很费力,因此不建议使用在数据量大的情况下


    2.使用桥连接,将不同的部分专门封装成一个对象推荐

    优点:减少了冲突,减少了工作量

    缺点:冲突字段/总字段趋近于1时显得没必要(不过,这种情况几乎很少出现,除非是继承关系,但继承关系完全可以使用子类来传值,所以这个问题你就当没遇到过)


    表单如下

    <form method='post' action='url'>
    用户名 <input type='text' name='u_name'>
    用户id <input type='text' name='u_id'>
    食品名 <input type='text' name='f_name'>
    食品id <input type='text' name='f_id'>
     <input type='text' name='gender'>
     <input type='text' name='age'>
     <input type='text' name='price'>
     <input type='text' name='date'>
    </form>
    

    -----将冲突的字段专门建立一个javaBean
    public String UFBridge{
        
        private String uname;
        private String uid;
        private String fname;
        private String fid;
    }

    @requestMap(value={'/order/book'})
    public string show(User u,Food f,UFBridge ufb){

       u.setName(ufb.getUname());
       f.setName(ufb.getUname());
       
       u.setId(ufb.getUid);
       f.setId(ufb.getFid);
    }


    3.使用相应的注解@InitBinder,可以做出类似struts2的方案(不推荐,代码量增加,灵活度不够)

    如下博文

    SpringMVC同名参数绑定问题

    springmvc注解形式的开发参数接收


    try doing it

  • 相关阅读:
    游戏开发挑战中心规划(16)
    游戏开发关卡设计(16)
    借鉴来的面试经验
    Scrapy:学习笔记(2)——Scrapy项目
    Scrapy:学习笔记(1)——XPath
    Django:学习笔记(8)——文件上传
    And Design:拓荒笔记——Form表单
    React:快速上手(7)——使用中间件实现异步操作
    JavaScript:学习笔记(9)——Promise对象
    JavaScript:学习笔记(8)——对象扩展运算符
  • 原文地址:https://www.cnblogs.com/jpfss/p/9288992.html
Copyright © 2020-2023  润新知