SpringMVC|参数绑定


1. 什么是SpringMVC参数绑定

就是将URL中的的请求参数,进行类型转换(String或其他类型),将转换后的值在赋值给Controller方法形参中,然后Controller就可以直接使用该形参。

2. 默认的参数绑定类型

  • HttpServletRequest
  • HttpServletResponse
  • HttpSession
  • Model:数据模型,主要存储要返回到客户端的数据的。功能类似于Request对象。
  • ModelMap
  • 演示
@RequestMapping("/Parameter")
    public Stirng parameter(HttpServletRequest request,HttpServletResponse response,
                            HttpSession session,Model model,ModelMap modelMap) throws Exception{
        request.setAttribute("requestParameter", "request类型");
        response.getWriter().write("response");
        session.setAttribute("sessionParameter", "session类型");
        model.addAttribute("modelParameter", "model类型");
        modelMap.addAttribute("modelMapParameter", "modelMap类型");
         
        return "success";
    }

3. 简单类型

  • 请求URL
http://localhost:8080/springmvc/test/queryById?id=1&name=zhangsan

参数为id=1&name=zhangsan

  • Controller
    注意:请求参数的key,需要和controller方法形参名称一致,注意类型是否匹配。
@RequestMapping(“queryById”)
public String queryItemById(int id,String name){}
  • RequestParam
  • 作用:
    1. 相当于request.getParameter(请求参数中的key);
    2. 将获取的值,绑定到该注解修饰中的参数中;
  • 属性:
    • value:URL请求参数中的key;
    • required:true/false,表示该URL是否必须要带有该参数,默认是true;
    • default:如果required设置为true,但是URL中没有指定的key,则默认取该值进行参数绑定。

4. POJO类型

  • 请求参数
id=10&name=zhangsan
  • Controller
    使用要求
    1. 使用一个POJO类型的参数作为Contoller方法的参数形参,进行形参绑定。
    2. 请求参数的key,需要和一个POJO类型的属性名称一致。
    3. 如果参数的key出现这种方式address.provinceName,需要需要POJO类型中嵌套POJO类型的属性进行接受请求参数User#Address(address)#provinceName

代码

@RequestMapping("saveUser")
    public String saveUser(User user,Model model) {
        model.addAttribute("msg", "接收到的参数:"+user.toString());
        return "success";
    }
public class User {
    private int id;
    private String username;
    private Date birthday;
    private String sex;

    // 演示包装POJO参数绑定
    private Address address;
}

5. 日期类型

  • 问题
    对于字符串类型的日期参数,转换成Data的参数,会有转换类型问题。原因是因为,SpringMVC无法确定页面传入的日期格式是什么类型的,所以无法进行无法参数转换。
  • 解决办法
    Converter:实现类型转换
public class DateConverter implements Converter{

    @Override
    public Date convert(String source) {
        // 使用Java中 SimpleDateFormat API完成日期转换
        String pattern = "yyyy-MM-dd HH:mm:ss";
        SimpleDateFormat dateFormat = new SimpleDateFormat(pattern );
        try {
            return dateFormat.parse(source);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
}

将Converter注册到处理器适配器中


    

    
    
        
            
                
            
        
    

6. 集合或者类型

6.1 元素是简单类型的集合或数组

  • 注意
    1. 直接使用LIst集合或者数组作为形参,List集合会报错。
    2. 直接使用POJO类型作为形参,并且该POJOlei类型拥有一个List集合属性或者数组属性。这种情况下List和数组都可以成功接收参数。
    3. 请求参数key和形参名称或者属性名称要一致。
  • 请求参数
id=1&id=2&id=3
  • Controller方法
    第一个和第三个是成功的,第二个不成功。
    @RequestMapping("findUserByIds")
    public String findUserByIds(Integer[] id,Model model) {
        model.addAttribute("msg", "接收到的参数:"+id);
        return "success";
    }
    @RequestMapping("findUserByIds2")
    public String findUserByIds2(List id,Model model) {
        model.addAttribute("msg", "接收到的参数:"+id);
        return "success";
    }
    @RequestMapping("findUserByIds3")
    public String findUserByIds3(User user,Model model) {
        model.addAttribute("msg", "接收到的参数:"+user.getUid());
        return "success";
    }
public class User {

    // 演示批量简单类型参数接收
    private List uid = new ArrayList<>();
}

6.2 元素是POJO的类型或数组

  • 注意
    1. 直接使用List集合或者数组作为形参,都会报错。
    2. 必须使用POJO类型作为形参,并且该POJO类型拥有一个List集合属性或者数组属性。这种情况下List和数组都可以成功接收参数。
    3. 请求参数key和属性名称要一致。
  • 请求参数
    POST请求

    
购买商品1名称:
购买商品1价格:
购买商品2名称:
购买商品2价格:

GET请求

itemList[0].id=1&itemList[0].name=zhangsan&itemList[0].price=100&itemList[1].id=2&itemList[1].name=lisi&itemList[1].price=200
  • Controller方法
@RequestMapping("updateUser")
    public String updateUser(User user,Model model) {
        model.addAttribute("msg", "接收到的参数:"+user.getUid());
        return "success";
    }
public class User {
    
    // 将request请求参数,绑定到[元素是POJO类型的List集合]参数 
    private List itemList = new ArrayList<>();

}

6.3 Map集合

  • 注意
    1. 需要使用POJO类型来接受,POJO类型中有一个Map类型的参数。
    2. Map类型的属性和名称,要求和请求参数[]前面的名称一致。
    3. Map的key要唯一,value要求是一个POJO类型。
  • 请求参数
itemMap['item1'].name=zhangsan&itemMap['item1'].price=100&itemMap['item2'].name=lisi&itemMap['item2'].price=200
  • POJO
public class User {

    // 将request请求参数,绑定到[元素是POJO类型的Map集合]参数 
    private Map itemMap = new HashMap<>();
}
public class Item {
    private Integer id;

    private String name;

    private Float price;

    private String pic;

    private Date createtime;

}

7. 文件类型

  • 注意
    JSP
form表单需要设置enctype=multipart/form-data

第三方依赖

commons-fileupload
commons-io

SpirngMVC的支持

MultipartResolver:解析文件类型的参数,绑定到MultipartFile类型的参数中,需要在springmvc.xml配置
MultipartFile:通过该参数,可以获取文件数据,包括文件名称和文件内容。
  • 代码配置
    JSP

    
图片:

springmvc.xml


    
        
        
    

Controller

@RequestMapping("fileupload")
    public String findUserById(MultipartFile uploadFile,Model model) throws Exception {
        //编写文件上传逻辑(mvc模式和三层结构模式)
        //三层模式:表现层(controller、action)、业务层(service、biz)、持久层(dao、mapper)
        //MVC模式主要就是来解决表现层的问题的(原始的表现层是使用Servlet编写,即编写业务逻辑,又编写视图展示)
        
        if(uploadFile != null){
            System.out.println(uploadFile.getOriginalFilename());
            //原始图片名称
            String originalFilename = uploadFile.getOriginalFilename();
            //如果没有图片名称,则上传不成功
            if(originalFilename != null && originalFilename.length()>0)
            {
                //存放图片的物理路径
                String picPath = "E:\\";
                //获取上传文件的扩展名
                String extName = originalFilename.substring(originalFilename.lastIndexOf("."));
                //新文件的名称
                String newFileName = UUID.randomUUID()+extName;
                //新的文件
                File newFile = new File(picPath+newFileName);
                //把上传的文件保存成一个新的文件
                uploadFile.transferTo(newFile);
                //同时需要把新的文件名更新到数据库中
            }
        }

        
        model.addAttribute("msg", "文件上传成功");
        return "success";
    }

你可能感兴趣的:(SpringMVC|参数绑定)