美文网首页
SpringMVC|参数绑定

SpringMVC|参数绑定

作者: GGarrett | 来源:发表于2019-01-04 16:28 被阅读0次

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<String,Date>{

    @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注册到处理器适配器中

<!-- 配置注解方式处理器对应的适配器和映射器,同时还注入了很多其他的bean -->
    <mvc:annotation-driven
        conversion-service="conversionService" />

    <!-- 配置ConversionService -->
    <bean id="conversionService"
        class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.springmvc.controller.converter.DateConverter"></bean>
            </set>
        </property>
    </bean>

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<Integer> 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<Integer> uid = new ArrayList<>();
}

6.2 元素是POJO的类型或数组

  • 注意
    1. 直接使用List集合或者数组作为形参,都会报错。
    2. 必须使用POJO类型作为形参,并且该POJO类型拥有一个List集合属性或者数组属性。这种情况下List和数组都可以成功接收参数。
    3. 请求参数key和属性名称要一致。
  • 请求参数
    POST请求
<!-- 将request请求参数,绑定到[元素是POJO类型的List集合或Map集合]参数 -->
    <form action="${pageContext.request.contextPath}/user/updateUser" method="post">
        <!-- itemList[集合下标]:集合下标必须从0开始 -->
        <!-- 辅助理解:先将name属性封装到一个Item对象中,再将该Item对象放入itemList集合的指定下标处 -->
        购买商品1名称:<input type="text" name="itemList[0].name"><br />
        购买商品1价格:<input type="text" name="itemList[0].price"><br />
        购买商品2名称:<input type="text" name="itemList[1].name"><br />
        购买商品2价格:<input type="text" name="itemList[1].price"><br />

        <input type="submit" value="保存">
    </form>

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<Item> 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<String, Item> 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
<!-- 文件类型参数绑定 -->
    <form action="${pageContext.request.contextPath}/fileupload" method="post" enctype="multipart/form-data">
        图片:<input type="file" name="uploadFile" /><br /> 
        <input type="submit" value="上传" />
    </form>

springmvc.xml

<!-- 配置多部件解析器 -->
    <bean id="multipartResolver"
        class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!-- 限制上传文件的大小,最大可以上传多大,单位是字节 -->
        <property name="maxUploadSize" value="5000000"></property>
    </bean>

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|参数绑定

      本文链接:https://www.haomeiwen.com/subject/yppcrqtx.html