SpringMVC|参数绑定

2019-01-04  本文已影响0人  GGarrett

1. 什么是SpringMVC参数绑定

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

2. 默认的参数绑定类型

@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. 简单类型

http://localhost:8080/springmvc/test/queryById?id=1&name=zhangsan

参数为id=1&name=zhangsan

@RequestMapping(“queryById”)
public String queryItemById(int id,String name){}

4. POJO类型

id=10&name=zhangsan

代码

@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. 日期类型

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 元素是简单类型的集合或数组

id=1&id=2&id=3
    @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的类型或数组

<!-- 将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
@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集合

itemMap['item1'].name=zhangsan&itemMap['item1'].price=100&itemMap['item2'].name=lisi&itemMap['item2'].price=200
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. 文件类型

form表单需要设置enctype=multipart/form-data

第三方依赖

commons-fileupload
commons-io

SpirngMVC的支持

MultipartResolver:解析文件类型的参数,绑定到MultipartFile类型的参数中,需要在springmvc.xml配置
MultipartFile:通过该参数,可以获取文件数据,包括文件名称和文件内容。
<!-- 文件类型参数绑定 -->
    <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";
    }
上一篇下一篇

猜你喜欢

热点阅读