springmvc的数据接收

前言

先说结论,springmvc可以接收的参数类型如下:

  • 基本数据类型
  • POJO类型参数
  • 数组类型参数
  • 集合类型参数
    此外,本篇文章也会对获取restful参数、获取请求头信息、文件上传等内容进行总结

一、获取基本数据类型(get请求)

http://localhost:8088/user/getParams?username=xiaoming&age=15
    @RequestMapping("/getParams")
    @ResponseBody
    public void getParams(String username,int age){
        System.out.println("username: "+ username);
        System.out.println("age: "+ age);
    }

二、获取pojo类型参数,会实现pojo参数的自动封装

http://localhost:8088/user/getParams2?username=xiaoming&age=15
    @RequestMapping("/getParams2")
    @ResponseBody
    public void getParams2(User user){
        System.out.println(user);
    }

三、获取数组类型参数(get请求)

和上面的做法没什么差别,url只要参数和方法的参数名保持一致就行

http://localhost:8088/user/getParams3?str=xiaoming&str=xiaohong&str=xiaoqi
    @RequestMapping("/getParams3")
    @ResponseBody
    public void getParam3(String[] str){
        System.out.println(Arrays.asList(str));
    }

四、获取集合类型参数(post请求)

场景一: 直接的表单提交
获取集合类型的参数相对来说有些特殊,需要通过包装类封装一下才可以接受到集合参数

localhost:8088/form.jsp 跳转到页面后,填写信息提交
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

<form action="${pageContext.request.contextPath}/user/getParams4" method="post">
    <%--表明是第一个User对象的username age--%>
    用户名1<input type="text" name="userList[0].username"><br/>
    用户年龄1<input type="text" name="userList[0].age"><br/>
    用户名2<input type="text" name="userList[1].username"><br/>
    用户年龄2<input type="text" name="userList[1].age"><br/>
    <input type="submit" value="提交">
</form>
</body>
</html>

    /**
     *  要使用集合的话,要用建一个包装类封装一下
     */
    @RequestMapping("/getParams4")
    @ResponseBody
    public void getParam4(UserVO userVO){
        System.out.println();
    }


场景2: 提交过来的数据格式是json格式
这里有两点要注意

  • 需要用@RequestBody注解,这样才可以直接接收集合数据而无需使用POJO进行包装。
  • 这里的话使用到了jq,记得要引入对应的包
http://localhost:8088/ajax.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
    <script src="${pageContext.request.contextPath}/js/jquery-3.3.1.js"></script>
    <script>
        var userList = new Array();
        userList.push({username:"zhangsan",age:18});
        userList.push({username:"lisi",age:28});

        $.ajax({
            type:"POST",
            url:"${pageContext.request.contextPath}/user/getParams5",
            data:JSON.stringify(userList),
            contentType:"application/json;charset=utf-8"
        });

    </script>
</head>
<body>

</body>
</html>
    @RequestMapping("/getParams5")
    @ResponseBody
    public void getParam5(@RequestBody List<User> userList){
        System.out.println(userList);
    }


注意:由于DispatcherServlet会对所有的请求进行过滤,如果想要页面获取到静态资源,需要对请求进行放行。
方法1:在spring-mvc.xml中加入<mvc:resources mapping="/js/**" location="/js/"/>
方法2:在spring-mvc.xml中加入<mvc:default-servlet-handler/>

五、参数绑定注解

这种是对于页面上的入参名和方法的参数名称不对应时,可以使用@requestParam注解来进行参数绑定

http://localhost:8088/user/getParam6?name=xiaoming

通过@RequestParam注解实现了url和方法参数的映射

    @RequestMapping("/getParam6")
    @ResponseBody
    public void getParam6(@RequestParam("name") String username){
        System.out.println(username);
    }

六、获取restful风格参数

http://localhost:8088/user/getRestfulParam/xiaoming

使用@PathVariable注解和 { }占位符对url参数进行接收

    /**
     * 获取restful风格参数
     */
    @RequestMapping("/getRestfulParam/{name}")
    @ResponseBody
    public void getRestfulParam(@PathVariable(value = "name",required = true) String username){
        System.out.println(username);
    }

七、获取日期类型的参数

SpringMVC 默认已经提供了一些常用的类型转换器,例如客户端提交的字符串转换成int型进行参数设置。
但是不是所有的数据类型都提供了转换器,没有提供的就需要自定义转换器,例如:日期类型的数据就需要自定义转换器。
步骤如下:

1. 自定义转换器实现Converter接口
package com.xiaoming.util;

import org.springframework.core.convert.converter.Converter;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateConverter implements Converter<String,Date> {

    public Date convert(String dateStr) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date date = sdf.parse(dateStr);
            return date;
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return null;
    }
}

2. 在spring-mvc.xml文件中声明转换器
    <!-- 配置自定义转换器 -->
    <bean id="conversionService"
          class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <list>
                <bean class="com.xiaoming.util.DateConverter"/>
            </list>
        </property>
    </bean>
3. 在<annotation-driven>中引用转换器
<mvc:annotation-driven conversion-service="conversionService"/>

发起请求

http://localhost:8088/user/getDateParam?date=2020-10-3

八、获取Servlet原生API

SpringMVC支持使用原始ServletAPI对象作为控制器方法的参数进行注入,常用的对象如下:

  • HttpServletRequest
  • HttpServletResponse
  • HttpSeesion
    @RequestMapping("/getHttpParam")
    @ResponseBody
    public void getHttpParam(HttpServletRequest servletRequest, HttpServletResponse servletResponse, HttpSession session){
        System.out.println(servletRequest);
        System.out.println(servletResponse);
        System.out.println(session);
    }

九、获取文件资源

1. 导入fileupload和io坐标
        <!-- 文件上传 -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.3</version>
        </dependency>
2. 配置文件上传解析器
    <!-- 配置文件上传解析器 -->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--上传文件总大小-->
        <property name="maxUploadSize" value="5242800"/>
        <!--上传单个文件的大小-->
        <property name="maxUploadSizePerFile" value="5242800"/>
        <!--上传文件的编码类型-->
        <property name="defaultEncoding" value="UTF-8"/>
    </bean>
3. 使用MultipartFile类进行接收
    @RequestMapping("/getUploadFile")
    @ResponseBody
    public void getUploadFile(String name, MultipartFile uploadFile1,MultipartFile uploadFile2){
        System.out.println("hhh");
        if(null !=uploadFile1 && !StringUtils.isEmpty(uploadFile1.getOriginalFilename())&&
        null !=uploadFile2 && !StringUtils.isEmpty(uploadFile2.getOriginalFilename())){
            String filename1 = uploadFile1.getOriginalFilename();
            String filename2 = uploadFile2.getOriginalFilename();
            try {
                uploadFile1.transferTo(new File("C:\\upload\\"+filename1));
                uploadFile2.transferTo(new File("C:\\upload\\"+filename2));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

如果是多个文件的话,也可以通过MultipartFile[] 数组来对进行用户上传的文件进行接收

    @RequestMapping("/getUploadFiles")
    @ResponseBody
    public void getUploadFiles(String name, MultipartFile[] uploadFiles){
        for(MultipartFile uploadFile :uploadFiles){
        if(null !=uploadFile && StringUtils.isEmpty(uploadFile.getOriginalFilename())){
            String filename = uploadFile.getOriginalFilename();
            try {
                uploadFile.transferTo(new File("C:\\upload\\"+filename));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    }

总结

总的来说,springmvc提供给了我们接收各种数据类型参数的方法,一方面,针对字符串、pojo类型数据等常见的类型,我们可以直接通过参数名称或者@RequestParam注解来进行映射,对于特殊一些的日期转换,我们可以通过自定义转换器来实现;对于文件上传,则可以通过MultipartFile类型参数来接收。也能通过springmvc获取到一些servlet的原生api。
在实际开发项目中,也需要我们结合项目的具体框架设计来合理的对前端的参数进行正确的接收。

posted @   moutory  阅读(18)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示